Skip to content
On this page

Versuch NAT / IP-Tables

Ziele in diesem Versuch

  • NAT auf Linux Target einrichten
  • WIFI hat eine "outside" Adresse
  • Ethernet hat eine "inside" Adresse
  • Portforwarding auf Webserver, welcher auf dem Hostsystem läuft
  • iptables anwenden und verstehen
  • Firewall rule einrichten auf Linux

NAT und Port Forwarding

Network Address Translation erlaubt es eine "äussere" / "öffentliche" IP Adresse auf ein "inneres" / "privates" Netz zu mappen. Gerade bei öffentlichen IP-Adressen, welche knapp sind, wird NAT im Heim- und Officebereich vom Modem / Router zur Verfügung gestellt.

Das hat den anderen Vorteil, dass NAT gleichzeitig als Firewall dient und Verbindungen von aussen nicht auf einen Host innen zulässt. So werden Verbindungen immer zuerst von innerhalb eines NAT gegen aussen initiiert.

In einem NAT lässt sich mit einem Portforward einen Port der äussern IP Adresse auf einen Host im private, inneren Netz "mappen". Dabei muss der äussere Port nicht der gleiche Port wie der innere sein. Dies ist besonders hilfreich, falls das Ziel ist, einen Dienst von einem Host hinter dem NAT (z.B. einen Webserver) über die äussere, öffentliche IP-Adresse zur Verfügung zu stellen.

Beispiel

Ein Router hat eine öffentliche Adresse 185.137.178.15 und ein privates Netz 192.168.1.0/24. Anfragen von aussen her nach Port 80 werden weitergeleitet an Host 192.168.1.16 Port 15205.

NAT

Mapping

18.137.178.15:80 => 192.168.1.16:15205

Setup des Versuchs

In diesem Versuch verbinden Sie sich über das Target via Ethernet in ein WiFi Netzwerk.

UART

Verwenden Sie für diesen Versuch am besten USB-Serial via Putty.

  • Das Target weist dem Host über Ethernet eine IP Adresse via DHCP zu.
  • Das Target verbindet sich mit einem WiFi Access Point und bezieht eine IP Adresse.
  • Das Target baut für das WiFi Interface ein NAT auf.
  • Auf dem Host starten Sie einen Webserver auf Port 10754
  • Auf dem Target leiten Sie TCP requests von aussen auf Port 80 nach 10754 Ihres Hosts weiter.
  • Von einem anderen Host verbinden Sie sich auf Port 80 einer Ihrer äusseren Adresse um die Weiterleitung zu überprüfen.

SETUP

Verbinden mit Ethernet

  • Weisen Sie dem Interface eth0 die IP 10.200.1.1/16 zu.
  • Weisen Sie Ihrem Host eine Ethernetadresse im selben Netz statisch zu.
  • Verifizieren Sie die Verbindung von Host zu Target.

Verbinden mit WiFi

  • Verbinden Sie sich via wpa_supplicant mit dem Netzwerk dnet und dem Passwort dnetdnet via WPA2.

    Zuhause

    Falls Sie den Versuch zuhause durchführen, dann Verbinden Sie sich mit den Credentials Ihres Heimnetzes.

  • Beziehen Sie eine IP-Adresse und DNS Server via dhcp für das Interface wlan0.
    bash
    # konfigurieren Sie hierzu wlan0 in /etc/network/interfaces entsprechend
    sudo /etc/init.d/networking restart
    
  • Pingen Sie von Ihrem Targetsystem den Defaultgateway (im Falle vom dnet Netz 10.100.0.1, im Falle eines WLAN zuhause, die IP Ihres Routers). Um Ihr WiFi setup zu verifizieren.
  • Pingen Sie auch eine Adresse im öffentlichen Netz, falls ping gesperrt ist, fordern Sie eine Webseite mit curl an.

NAT mit iptables

Aktivieren Sie IP forwarding im Kernel.

bash
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Löschen Sie bestehende Regeln von iptables.

bash
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F

Zeigen Sie existierende Regeln an.

bash
sudo iptables -S

# Output sollte so aussehen
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

Führen Sie folgende Regeln hinzu um NAT auf wlan0 zu aktivieren.

bash
# alle rules löschen
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F

# verbindungen akzeptieren
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

# NAT rules
sudo iptables -t nat -P PREROUTING ACCEPT
sudo iptables -t nat -P INPUT ACCEPT
sudo iptables -t nat -P OUTPUT ACCEPT
sudo iptables -t nat -P POSTROUTING ACCEPT
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Masquerade

In IP-Tables wird das Übersetzen von IP Adressen auch Masquerade genannt.

Portforward von 80 nach 10754

  • Starten Sie auf dem Host einen Webserver mit flask auf Port 10754.
  • Richten Sie einen Portforward ein:
    bash
    sudo iptables -t nat -A PREROUTING -i wlan0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.200.0.2:10754
    
  • von einem zweiten Host aus, navigieren Sie zur Webseite via NAT um zu überprüfen ob es funktioniert.

iptables als Firewall

Eine Firewall wie iptables kann ein- und ausgehende Verbindungen oder auch Ports sperren.

Ping Blockieren

  • Blockieren Sie auf dem Target die Antwort auf pings
    bash
    sudo iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT   
    
  • Ändern Sie die Regel ab:
    bash
    iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
    iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
    
    was ist der Unterschied zwischen beiden Varianten?

Muster-Script für NAT

bash
#!/bin/bash
cd `dirname $0`
pwd

echo "ESSID / PW anpassen"

# RESET
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F

sudo ip addr flush dev eth0
sudo ip addr flush dev wlan0

sudo killall -9 wpa_supplicant
sudo killall -9 hostapd

sudo systemctl stop dnsmasq
sudo systemctl disable dnsmasq

# CONFIG

cat << EOF  | sudo tee /etc/dnsmasq.conf
interface=eth0
dhcp-range=10.200.2.0,10.200.95.255,255.255.0.0,24h
EOF


cat << EOF | sudo tee /etc/network/interfaces
auto lo eth0 eth1 wlan0

allow-hotplug eth1
iface eth1 inet static
        address 192.168.50.1/24

allow-hotplug eth0
iface eth0 inet static
        address 10.200.1.1/16

allow-hotplug wlan0
iface wlan0 inet dhcp
EOF

cat << EOF > ./home.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CH

network={
        ssid="ESSID"
        psk="PASSWORT"
}
EOF

sudo wpa_supplicant -B -i wlan0 -c ./home.conf

sudo /etc/init.d/networking restart
sudo /etc/init.d/dnsmasq start

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F


sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

sudo iptables -t nat -P PREROUTING ACCEPT
sudo iptables -t nat -P INPUT ACCEPT
sudo iptables -t nat -P OUTPUT ACCEPT
sudo iptables -t nat -P POSTROUTING ACCEPT
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

sudo iptables -S
sudo iptables -S -t nat