Konfigurowanie bram Linux w sieciach produkcyjnych
Niniejszy przewodnik omawia 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ą wykorzystywać różne usługi do realizacji poniższych zagadnień. Z tego powodu wykonanie niektórych z wymienionych poniżej poleceń może nie być możliwe. Ten rozdział został opracowany na przykładzie urządzenia Raspberry Pi z natywnym systemem operacyjnym Debian 12 (bookworm).
Przed rozmową z zespołem wsparcia SDA upewnij się, że masz dostęp SSH do urządzenia Linux ze swojego komputera, aby móc udostępnić ekran w trakcie 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, umożliwiając komunikację przez internet. Prawidłowa konfiguracja DNS jest krytyczna dla systemu Linux pracującego w środowisku sieciowym. Diagnostyka problemów z DNS polega na sprawdzeniu dostępności serwera DNS przy użyciu poleceń takich jak ping lub nslookup. Upewnij 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 za pomocą:
cat /etc/resolv.conf
Każdy serwer DNS można przetestować indywidualnie 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ą pakietu dnsutils lub bind9-dnsutils w systemie Debian, albo użyć natywnego polecenia, takiego jak ping lub 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 prawdopodobnie pozostawi komentarz w pliku /etc/resolv.conf, informujący o tym, że 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
Zrestartuj usługę NetworkManager i sprawdź nowe wartości w pliku /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, restartują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 konfigurację bazową:
# 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) jest używany w systemach Linux do synchronizacji zegara systemowego ze źródłem czasu, takim jak zegar atomowy lub serwer centralny. Dokładne odmierzanie czasu jest kluczowe dla rejestrowania zdarzeń, protokołów bezpieczeństwa oraz koordynowania działań w sieci. Nieprawidłowa konfiguracja serwera NTP spowoduje niepowodzenie wywołań HTTPS z powodu unieważnienia certyfikatu SSL.
Testowanie
Sprawdź stan synchronizacji NTP oraz czy bieżąca data i godzina są prawidłowe.
# 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, takiej jak 0.debian.pool.ntp.org czy 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ń z FallbackNTP wszystkie serwery, które są nieosiągalne.
[Time]
NTP=ntp.myorg.com ntp.myorg.local
FallbackNTP=
Zrestartuj 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ą oraz rejestrowania ruchu wychodzącego. Systemy Linux w takich sieciach muszą być skonfigurowane tak, aby kierowały 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 internetowych.
Testowanie
Sprawdź, czy proxy jest aktualnie skonfigurowane, weryfikując zmienne środowiskowe oraz 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 operacja 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 lub archive.ubuntu.com) może być zablokowany z powodów bezpieczeństwa. Firmy często utrzymują własne wewnętrzne serwery lustrzane, aby kontrolować, które pakiety są dostępne, oraz ograniczyć zużycie zewnętrznego pasma.
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 pozwalający w pełni przetestować łączność 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 zaktualizowania 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 Debian 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 Twój wewnętrzny serwer lustrzany używa HTTPS:
deb https://mirror.company.local/debian bookworm main contrib non-free non-free-firmware
Uwaga: W przypadku repozytoriów HTTPS upewnij się, że pakiety apt-transport-https i ca-certificates są zainstalowane.
Konfigurowanie priorytetu repozytoriów (opcjonalnie)
Jeśli musisz korzystać 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
Nadaje to wewnętrznym serwerom lustrzanym wyższy priorytet.
Konfigurowanie proxy dla repozytoriów (opcjonalnie)
Jeśli Twoja sieć wymaga proxy do 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: Pakiety nie są znajdowane 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