Konfigurowanie bram Linux w sieciach produkcyjnych
Niniejszy przewodnik omawia niektóre podstawowe parametry konfiguracji sieci, które mogą powodować, że system Linux nie będzie działał w środowisku produkcyjnym z powodu odizolowanej infrastruktury. Należy pamiętać, że dystrybucje Linux mogą używać różnych usług do obsługi poniższych zagadnień. Dlatego uruchomienie niektórych z wymienionych poniżej poleceń może okazać się niemożliwe. Ta sekcja została opracowana na przykładzie Raspberry Pi z natywnym systemem Debian 12 (bookworm).
Przed rozmową ze wsparciem zespołu SEW należy upewnić się, że mają Państwo dostęp SSH do urządzenia z systemem Linux ze swojego komputera, aby móc udostępnić ekran podczas sesji.
Poniżej znajduje się lista typowych obszarów, które mogą uniemożliwiać połączenie.
Serwery DNS
Serwer Domain Name System (DNS) tłumaczy nazwy domen na adresy IP, aby umożliwić komunikację przez internet. Prawidłowa konfiguracja DNS ma kluczowe znaczenie dla systemu Linux działającego w środowisku sieciowym. Diagnozowanie problemów z DNS obejmuje sprawdzenie osiągalności serwera DNS za pomocą poleceń takich jak ping lub nslookup. Należy upewnić się, że serwer odpowiada i poprawnie tłumaczy nazwy domen na adresy IP. Błędna konfiguracja może prowadzić do niepowodzenia rozwiązywania nazw domen, co wpływa na komunikację sieciową i dostęp do internetu.
Testowanie
Sprawdź adresy IP serwerów DNS skonfigurowane na hoście poleceniem:
cat /etc/resolv.conf
Każdy serwer DNS można przetestować osobno za pomocą nslookup lub dig. Na przykład, jeśli serwerem jest 8.8.8.8:
nslookup api.eu1.sdaconsole.io 8.8.8.8
dig @8.8.8.8 api.eu1.sdaconsole.io +short
Jeśli te polecenia nie są dostępne, można je zainstalować za pomocą pakietów dnsutils lub bind9-dnsutils w systemie Debian, albo użyć natywnego polecenia, takiego jak ping czy getent, aby przetestować bieżącą konfigurację DNS:
ping api.eu1.sdaconsole.io
getent hosts api.eu1.sdaconsole.io
Konfigurowanie
Serwery DNS mogą być zarządzane przez różne usługi, w zależności od instalacji systemu Linux. W przypadku Raspberry Pi są one zazwyczaj zarządzane przez usługę NetworkManager. Usługa zarządzająca rozwiązywaniem nazw DNS najprawdopodobniej pozostawi komentarz w pliku /etc/resolv.conf informujący, że to ona wygenerowała ten plik, na przykład:
cat /etc/resolv.conf
> # Generated by NetworkManager
> nameserver 192.168.15.1
> nameserver fe80::dec6:37ff:fe36:5ee8%wlan0
cat /etc/resolv.conf
> # Generated by dhcpcd from eth0.dhcp
> # /etc/resolv.conf.head can replace this line
> nameserver 192.168.15.1
- NetworkManager
- dhcpcd
- resolvconf
Aby ustawić globalne serwery DNS, utwórz plik:
sudo nano /etc/NetworkManager/conf.d/dns.conf
I dodaj:
[global-dns-domain-*]
servers=8.8.8.8,4.4.4.4
Uruchom ponownie usługę NetworkManager i sprawdź nowe wartości w /etc/resolv.conf
sudo systemctl restart NetworkManager
# Verify /etc/resolv.conf was updated
cat /etc/resolv.conf
sudo nano /etc/dhcpcd.conf
Dodaj lub zmodyfikuj na końcu pliku:
# Static DNS configuration
static domain_name_servers=8.8.8.8 4.4.4.4
Zastosuj zmiany, ponownie uruchamiając usługę dhcpcd, i sprawdź, czy serwery DNS zostały zaktualizowane:
sudo systemctl restart dhcpcd
# Verify /etc/resolv.conf was updated
cat /etc/resolv.conf
Aby sprawdzić, czy resolvconf jest dostępny:
which resolvconf
dpkg -l | grep resolvconf
Skonfiguruj serwery DNS za pomocą resolvconf, edytując konfiguracje bazowe:
# Edit the base configuration
sudo nano /etc/resolvconf/resolv.conf.d/head
Dodaj:
nameserver 8.8.8.8
nameserver 4.4.4.4
Zaktualizuj usługę resolvconf i sprawdź, czy serwery DNS zostały zaktualizowane:
sudo resolvconf -u
# Verify /etc/resolv.conf was updated
cat /etc/resolv.conf
Serwery NTP
Serwer Network Time Protocol (NTP) służy w systemach Linux do synchronizacji zegara systemowego ze źródłem czasu, takim jak zegar atomowy lub serwer centralny. Dokładne odmierzanie czasu ma kluczowe znaczenie dla rejestrowania zdarzeń, protokołów bezpieczeństwa i koordynowania działań w sieci. Nieprawidłowa konfiguracja serwera NTP spowoduje niepowodzenie wywołań HTTPS z powodu unieważnienia certyfikatu SSL.
Testowanie
Sprawdź status synchronizacji NTP oraz poprawność bieżącej daty i godziny.
# Check NTP sync status
timedatectl status
# Check configured NTP servers
timedatectl timesync-status
timedatectl show-timesync --all
# Check logs from the timesync service
journalctl -u systemd-timesyncd -n 20
# Check if service is active
systemctl is-active systemd-timesyncd
Testowanie połączenia z konkretnym serwerem:
# Using ntpdate, if installed
ntpdate -q 0.debian.pool.ntp.org
# Using Netcat
timeout 2 nc -u -z -v 0.debian.pool.ntp.org 123
Konfigurowanie
Serwer NTP można skonfigurować przy użyciu nazwy domeny, np. 0.debian.pool.ntp.org lub ntp.myorg.com, albo bezpośrednio przy użyciu adresu IP.
# Configure systemd-timesyncd
sudo nano /etc/systemd/timesyncd.conf
Dodaj własny serwer NTP w bloku [Time] i upewnij się, że linia nie jest zakomentowana. Usuń wszystkie serwery w FallbackNTP, które są nieosiągalne.
[Time]
NTP=ntp.myorg.com ntp.myorg.local
FallbackNTP=
Uruchom ponownie i pamiętaj o włączeniu usługi timesync.
# Restart and enable
sudo systemctl restart systemd-timesyncd
sudo systemctl enable systemd-timesyncd
# Force synchronization
sudo timedatectl set-ntp true
# Verify sync
timedatectl timesync-status
Serwery proxy
Serwer proxy działa jako pośrednik między klientem a serwerami docelowymi, przekazując żądania i odpowiedzi. W środowiskach korporacyjnych serwery proxy są powszechnie wykorzystywane do kontroli bezpieczeństwa, filtrowania treści, zarządzania przepustowością i rejestrowania ruchu wychodzącego. Systemy Linux w takich sieciach muszą być skonfigurowane tak, aby kierować swoje żądania HTTP/HTTPS przez firmowy serwer proxy w celu uzyskania dostępu do zasobów zewnętrznych, w tym repozytoriów pakietów i usług sieciowych.
Testowanie
Sprawdź, czy proxy jest aktualnie skonfigurowane, weryfikując zmienne środowiskowe i ustawienia proxy obowiązujące w całym systemie:
# Check shell environment proxy variables
env | grep -i proxy
# Check system-wide proxy configuration
cat /etc/environment | grep -i proxy
# Check if proxy is set for current user
echo $http_proxy
echo $https_proxy
echo $no_proxy
Aby sprawdzić, czy serwer proxy jest potrzebny, spróbuj połączyć się bezpośrednio z serwerem zewnętrznym:
# Try direct connection to a public server
timeout 5 curl -I https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json 2>&1
# If it fails with connection errors, proxy might be required
# Common error: "Failed to connect" or "Connection timed out"
Jeśli próba zakończy się błędami połączenia, może być wymagane proxy. Typowe błędy to na przykład Failed to connect lub Connection timed out.
Aby przetestować żądanie z konkretnym serwerem proxy:
# Test with curl
curl -I --proxy http://proxy.company.local:8080 https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json
# Proxy with user authentication
curl -I --proxy http://user@pwd@proxy.company.local:8080 https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json
# Test without proxy (direct connection)
curl -I --noproxy "*" https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json
Konfigurowanie
Adres proxy ma jeden z następujących formatów:
<protocol>://<proxy-address>:<port-number>
<protocol>://<username>:<password>@<proxy-address>:<port-number>
Skonfiguruj proxy dla wszystkich użytkowników i aplikacji:
# Edit system-wide environment
sudo nano /etc/environment
Dodaj lub zmodyfikuj następujące linie:
http_proxy="http://proxy.company.local:8080"
https_proxy="http://proxy.company.local:8080"
no_proxy="localhost,127.0.0.1,*.company.local,10.0.0.0/8,192.168.0.0/16"
# Uppercase variants (some applications check these)
HTTP_PROXY="http://proxy.company.local:8080"
HTTPS_PROXY="http://proxy.company.local:8080"
NO_PROXY="localhost,127.0.0.1,*.company.local,10.0.0.0/8,192.168.0.0/16"
Zastosuj zmiany:
# Reload environment (or log out and back in)
source /etc/environment
# Verify variables are set
env | grep -i proxy
Aby sprawdzić, czy ruch faktycznie przechodzi przez proxy:
# Verbose curl request showing proxy connection
curl -v -I https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json 2>&1 | grep -i proxy
# Should show something like:
# * Uses proxy env variable http_proxy == 'http://proxy.company.local:3128'
# * Trying proxy.company.local:3128...
Niektóre serwery proxy przeprowadzają inspekcję SSL. Może być konieczne zainstalowanie firmowych certyfikatów CA:
# Copy corporate CA certificate
sudo cp company-ca.crt /usr/local/share/ca-certificates/
# Update CA trust store
sudo update-ca-certificates
# Verify
curl -I https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json
Repozytoria Debian
Repozytoria Debian to serwery udostępniające pakiety oprogramowania i aktualizacje dla systemów opartych na Debianie. W odizolowanych środowiskach korporacyjnych dostęp do publicznych serwerów lustrzanych Debiana (takich jak deb.debian.org czy archive.ubuntu.com) może być zablokowany ze względów bezpieczeństwa. Firmy często utrzymują własne wewnętrzne serwery lustrzane, aby kontrolować dostępność pakietów i ograniczyć wykorzystanie zewnętrznej przepustowości.
Testowanie
Sprawdź aktualnie skonfigurowane repozytoria:
# View configured repositories
cat /etc/apt/sources.list
# Check additional repository files
ls -la /etc/apt/sources.list.d/
cat /etc/apt/sources.list.d/*.list 2>/dev/null
Poniżej znajduje się kompleksowy skrypt bash służący do pełnego przetestowania łączności ze skonfigurowanymi repozytoriami:
# Test if repository servers are reachable
grep -h "^deb http" /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null | \
awk '{print $2, $3}' | sort -u | while read repo suite; do
echo "Testing: $repo (suite: $suite)"
# Test the Release file that APT actually fetches
# This is what APT checks first when doing 'apt update'
release_url="${repo}/dists/${suite}"
# Test with curl (follows redirects, checks certificates)
if curl -fsSL --connect-timeout 5 --max-time 10 -I "$release_url/InRelease" >/dev/null 2>&1; then
echo " > Repository is reachable"
else
if curl -fsSL --connect-timeout 5 --max-time 10 -I "$release_url/Release" >/dev/null 2>&1; then
echo " > Repository is reachable"
else
# If failed, show the specific error
error=$(curl -fsSL --connect-timeout 5 --max-time 10 -I "$repo" 2>&1 | head -1)
echo " X Unreachable: $error"
fi
fi
echo
done
Inną metodą jest próba aktualizacji list pakietów w celu zidentyfikowania problemów z repozytoriami:
# Try to update package lists
sudo apt update
# Check for errors in apt logs
tail -20 /var/log/apt/term.log
Typowe komunikaty o błędach wskazujące na zablokowane repozytoria:
Failed to fetch http://deb.debian.org/...Could not resolve 'deb.debian.org'Connection timed outUnable to connect to...
Ręczne przetestowanie konkretnego serwera repozytorium:
# Test HTTP connectivity to a repository
curl -sSL -I --connect-timeout 5 http://deb.debian.org/debian/
# Or using wget
wget --spider --timeout=5 http://deb.debian.org/debian/
# Test DNS resolution
getent hosts deb.debian.org
Konfigurowanie
Edytuj główny plik źródeł:
sudo nano /etc/apt/sources.list
Zastąp jego zawartość danymi wewnętrznego serwera lustrzanego. Dla Debiana 12 (bookworm):
# Internal Debian Repository Mirror
deb http://mirror.company.local/debian bookworm main contrib non-free non-free-firmware
deb http://mirror.company.local/debian bookworm-updates main contrib non-free non-free-firmware
deb http://mirror.company.local/debian-security bookworm-security main contrib non-free non-free-firmware
# Optionally, backports for newer packages
deb http://mirror.company.local/debian bookworm-backports main contrib non-free non-free-firmware
Jeśli wewnętrzny serwer lustrzany korzysta z HTTPS:
deb https://mirror.company.local/debian bookworm main contrib non-free non-free-firmware
Uwaga: W przypadku repozytoriów HTTPS należy upewnić się, że zainstalowane są pakiety apt-transport-https oraz ca-certificates.
Konfigurowanie priorytetu repozytoriów (opcjonalnie)
Jeśli konieczne jest korzystanie zarówno z repozytoriów wewnętrznych, jak i zewnętrznych, z preferencją dla wewnętrznych:
sudo nano /etc/apt/preferences.d/internal-mirror
Dodaj:
Package: *
Pin: origin mirror.company.local
Pin-Priority: 900
Package: *
Pin: origin deb.debian.org
Pin-Priority: 500
Dzięki temu wewnętrzne serwery lustrzane otrzymują wyższy priorytet.
Konfigurowanie proxy dla repozytoriów (opcjonalnie)
Jeśli sieć wymaga proxy w celu uzyskania dostępu do repozytoriów:
# Configure APT proxy
echo 'Acquire::http::Proxy "http://proxy.company.local:3128";' | \
sudo tee /etc/apt/apt.conf.d/proxy.conf
# For HTTPS repositories
echo 'Acquire::https::Proxy "http://proxy.company.local:3128";' | \
sudo tee -a /etc/apt/apt.conf.d/proxy.conf
# Test
sudo apt update
Aktualizacja i weryfikacja
Po skonfigurowaniu repozytoriów:
# Update package lists
sudo apt update
# Check for errors
echo $? # Should return 0 if successful
# Verify packages can be found
apt-cache policy apt
# Test installing a small package
sudo apt install --dry-run nano
Typowe problemy
Problem: apt update zawiesza się na czas nieokreślony
# Check if repository server is actually responding
timeout 10 curl -v http://mirror.company.local/debian/
# Check for proxy interference
unset http_proxy https_proxy
sudo apt update
Problem: Nie znaleziono pakietów po skonfigurowaniu serwera lustrzanego
# Verify the mirror has the correct Debian version
curl http://mirror.company.local/debian/dists/ | grep bookworm
# Check if the mirror is properly synced
curl -sI http://mirror.company.local/debian/dists/bookworm/Release | grep Date
Problem: Mieszane źródła repozytoriów powodujące konflikty
# Check all active sources
grep -rh "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/ | sort -u
# Disable conflicting sources
sudo mv /etc/apt/sources.list.d/problematic.list /etc/apt/sources.list.d/problematic.list.disabled
sudo apt update