7.18. Udostępnianie Internetu komputerom w sieci lokalnej: NAT/IP Masquarading

Często komputer ze skonfigurowanym dostępem do Internetu jest używany przez komputery w jego sieci lokalnej jako pośrednik w dostępie do Internetu. Jest to rozwiązanie bardzo popularne, gdyż pozwala korzystać wielu osobom z tego samego publicznego adresu IP. Mechanizm, który pozwala korzystać z tej funkcjonalności, jest nazywany NAT-em (ang. Network Address Translation) lub maskowaniem IP (ang. IP masquerading). Schemat systemu wygląda jak poniżej:

Internet - Publiczny IP=Host=Prywatny IP - Komputery wewnątrz sieci
Jak widać, host-pośrednik ma 2 interfejsy (2 adresy IP): jeden do sieci publicznej (Internetu) a drugi do sieci prywatnej. Poniżej opisano sposoby konfiguracji NAT-a na hoście-pośredniku dla systemów Debian i pochodnych od RedHata. Reszta komputerów w sieci powinna jako adres bramki ustawić prywatny adres IP hosta-pośrednika.

Debian

Pod Debianem jest wiele sposobów konfigurowania systemu NAT. Najprostszy polega na zainstalowaniu pakietu o nazwie ipmasq. Najczęściej nie są potrzebne żadne modyfikacje konfiguracji - interfejs zewnętrzny ustalany jest na podstawie adresu bramki ustawionej na hoście-pośredniku. Automatycznie obsługiwane są sytuacje podnoszenia i wyłączania interfejsów, należy tylko podczas instalacji wybrać opcję rekonfiguracji firewalla przy tworzeniu połączenia PPP. Więcej informacji można znaleźć między innymi na stronach manuala do iptables i ipmasq.

RedHat 6.2

W RH 6.2 wykonujemy następujące komendy w celu inicjalizacji NAT-a (są one wykonywane ręcznie i jednorazowo):

ipchains -P forward DENY
ipchains -A forward -i ppp0 -j MASQ
ipchains-save > /etc/sysconfig/ipchains
Następnie do pliku /etc/rc.d/rc.local dodajemy na końcu następujące polecenia:
echo -n "1" > /proc/sys/net/ipv4/ip_forward
ipchains-restore < /etc/sysconfig/ipchains

RehHat 7.x, 8.x, Fedora, Aurox itd

W systemach RH 7.x zarzucono używanie pakietu ipchains, zamiast niego wprowadzono nowszy mechanizm iptables (kernel 2.4.x). Należy więc zamiast powyższych działań stworzyć ręcznie plik /etc/sysconfig/iptables o zawartości (skrypt ten dodatkowo ustawia podstawową konfigurację filtra pakietów) (zakładamy, że ppp0 jest interfejsem "na zewnątrz", zaś eth0 - interfejsem "na sieć lokalną"):

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:allowed_in - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i ! ppp0 -m state --state NEW -j ACCEPT
-A INPUT -m state --state NEW -j allowed_in
-A INPUT -i ! ppp0 -p udp --dport 177 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ! ppp0 -m state --state NEW -j ACCEPT
-A FORWARD -p udp --dport 53 -j ACCEPT
-A FORWARD -p udp --dport 123 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state NEW -j ACCEPT
-A OUTPUT -p udp --dport 123 -j ACCEPT
-A allowed_in -p icmp --icmp-type echo-request -j ACCEPT
-A allowed_in -p tcp --dport 22 -j ACCEPT
-A allowed_in -p udp --dport 123 -j ACCEPT
COMMIT
Następnie do pliku /etc/rc.d/rc.local dodajemy na końcu następujące polecenia:
echo -n "1" > /proc/sys/net/ipv4/ip_forward
iptables-restore < /etc/sysconfig/iptables