iptables nat router
- je netwerk
Om router te worden hebben we natuurlijk 2 netwerkkaarten nodig.
We hebben dan een onveilige verbinding naar buiten toe, in ons voorbeeldenp0s3
:enp0s3 Link encap:Ethernet HWaddr 08:00:27:20:a1:61 inet addr:10.104.2xy.254 Bcast:10.104.255.255 Mask:255.255.0.0
en een veilig LAN, in ons voorbeeld
enp0s8
:enp0s8 Link encap:Ethernet HWaddr 08:00:27:8f:e3:d7 inet addr:192.168.2xy.254 Bcast:192.168.2xy.255 Mask:255.255.255.0
In ubuntu server hebben we deze configuratie:
$ cat /etc/network/interfaces
# The loopback network interface auto lo iface lo inet loopback # de buitenkant van mijn netwerk (10.10/16) (meestal bridged in vbox) auto enp0s3 iface enp0s3 inet static address 10.104.2xy.254 netmask 16 gateway 10.104.255.254 dns-nameservers 10.28.100.10 # de binnenkant van mijn netwerk (192.168.2xy/24) (meestal intnet in vbox) auto enp0s8 iface enp0s8 inet static address 192.168.2xy.254 netmask 24
Let goed op dat je binnen- en buitennetwerk niet verwisseld
Het is essentieel dat je netwerk perfect geconfigureerd is vooraleer je kan beginnen aan het router of firewall gedeelte. Test met een aantal pings naar machines binnen en naar machines buiten ...
- NAT-routing
Het volgende commando zet de vlag "routing" aan. De linux-kernel gaat dan pakketten tussen verschillende fysieke netwerkkaarten of logische netwerken routen.
# echo 1 > /proc/sys/net/ipv4/ip_forward
We hebben dan nog een commando nodig om Network Address Translation te doen:
# iptables -vt nat -A POSTROUTING -o enp0s3 -j SNAT --to 10.104.2xy.254
In het hogere commando gebruiken we de netwerkkaart aan de buitenkant:enp0s3
en zijn ipv4-adres:10.104.2xy.254
We kunnen beide commando's zomaar aan de bash shell intikken, bijvoorbeeld om te testen; maar wij gaan ze integreren in onsiptables-
script:
cat iptables.v-002.nat.sh
#! /bin/bash # # iptables-script # bvdb ( 03/11/2017 ) ###################################################### # # v = verbose, X = flush tables, F = delete non standard chains # general iptables -vX iptables -vF # nat and masquerading -t refers to table iptables -vt nat -F iptables -vt nat -X # mangling TCP header iptables -vt mangle -F iptables -vt mangle -X # reset policies -P refers to policies iptables -vP INPUT ACCEPT iptables -vP OUTPUT ACCEPT iptables -vP FORWARD ACCEPT # turn off routing # echo 0 > /proc/sys/net/ipv4/ip_forward # turn on routing echo 1 > /proc/sys/net/ipv4/ip_forward ###### Dit is heel belangrijk in je script -- ###### dan zie je wat je aan het doen bent: # ##>> my network interfaces: enp0s3 = 10.104.2xy.254/16 >> buiten ##>> my network interfaces: enp0s8 = 192.168.2xy.254/24 >> binnen ### implement NAT routing # ## NAT routing - enp0s3 is buiten en een unprotected network # het ip address aan de buitenkant van onze firewall is 10.104.2xy.254 (outside address) # iptables -vt nat -A POSTROUTING -o enp0s3 -j SNAT --to 10.104.2xy.254 ### PRINT iptables configuration ### # echo ">>>>> iptables -n -L" iptables -n -L echo "--------------" #echo ">>>>> iptables -S" #iptables -S #echo "--------------" echo ">>>>> iptables -t nat -L" iptables -t nat -L echo "--------------" #echo ">>>>> iptables -t mangle -L" #iptables -t mangle -L #echo "--------------" echo "routing set: " `cat /proc/sys/net/ipv4/ip_forward` echo "=============="
Als we het script uitvoeren krijgen we de volgende output:
$ sudo ./iptables.v-002.nat.sh
$ sudo ./iptables.v-002.nat.sh Flushing chain `INPUT' Flushing chain `FORWARD' Flushing chain `OUTPUT' Flushing chain `PREROUTING' Flushing chain `INPUT' Flushing chain `OUTPUT' Flushing chain `POSTROUTING' Flushing chain `PREROUTING' Flushing chain `INPUT' Flushing chain `FORWARD' Flushing chain `OUTPUT' Flushing chain `POSTROUTING' SNAT all opt -- in * out enp0s3 0.0.0.0/0 -> 0.0.0.0/0 to:10.104.2xy.254 >>>>> iptables -n -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination -------------- >>>>> iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- anywhere anywhere to:10.104.2xy.254 -------------- routing set: 1 ==============
- testen
We hebben netsudo /etc/iptables/iptables.v-002.nat.sh
uitgevoerd op de firewall. Als je ondertussen de firewall herstart hebt moet je dit eerst opnieuw uitvoeren alvorens te testen.
gebruik een machine in LAN, bijvoorbeeld web102
user@ub164-WEB102:~$ ifconfig enp0s3 Link encap:Ethernet HWaddr 08:00:27:9e:2e:76 inet addr:192.168.200.102 Bcast:192.168.200.255 Mask:255.255.255.0
we pingen nu een machine aan de buitenkant:user@ub164-WEB102:~$ ping 10.28.100.10 PING 10.28.100.10 (10.28.100.10) 56(84) bytes of data. 64 bytes from 10.28.100.10: icmp_seq=1 ttl=56 time=19.2 ms 64 bytes from 10.28.100.10: icmp_seq=2 ttl=56 time=15.3 ms --- 10.28.100.10 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss
... het werkt ....
we voeren vervolgens op de firewall/etc/iptables/iptables.v-001.clear.sh
uit en testen opnieuw:user@ub164-WEB102:~$ ping 10.28.100.10 PING 10.28.100.10 (10.28.100.10) 56(84) bytes of data. ^C --- 10.28.100.10 ping statistics --- 3 packets transmitted, 0 received, 100% packet loss
inderdaad, pingen lukt niet zonder de NAT-router ...