Appearance
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
.
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
nach10754
Ihres Hosts weiter. - Von einem anderen Host verbinden Sie sich auf Port
80
einer Ihrer äusseren Adresse um die Weiterleitung zu überprüfen.
Verbinden mit Ethernet
- Weisen Sie dem Interface
eth0
die IP10.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 Passwortdnetdnet
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 pingsbash
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT
- Ändern Sie die Regel ab:bashwas ist der Unterschied zwischen beiden Varianten?
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
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