Linux Iptables: verschil tussen versies
(Nieuwe pagina aangemaakt met '= port forwarding = This seemed to work for me: First of all - you should check if forwarding is allowed at all: <source lang="bash"> cat /proc/sys/net/ipv4/conf/pp…') |
(→port forwarding) |
||
(Een tussenliggende versie door dezelfde gebruiker niet weergegeven) | |||
Regel 1: | Regel 1: | ||
= port forwarding = | = port forwarding = | ||
− | + | Ten eerste: als je een regel toevoegt die al het verkeer van het interne netwerk accepteert, dan werkt het NATTEN van het web verkeer niet. Resultaat: ik kon niet meer browsen. Het verkeer wordt dan kennelijk op de gateway al opgevangen. | |
− | + | Vervolgens de volgende twee regels om verkeer van buitenaf te forwarden naar een server binnen het netwerk: | |
− | <source lang= | + | <source lang=bash> |
− | + | $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 80 -j DNAT --to-destination 172.16.255.14 | |
− | + | $IPTABLES -A FORWARD -p tcp -d 172.16.255.14 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT | |
</source> | </source> | ||
− | + | Hierbij is -d waarbij je het IP adres opgeeft denk ik belangrijk, anders zou al het verkeer worden geforward. Dat is weer niet handig als je de machine ook als gateway gebruikt. EXTIP is het internet IP adres van de machine. | |
− | <source lang= | + | Om de forward ook van "binnenuit" werkend te krijgen, zodat je dus op het lokale netwerk de server ook gewoon kan bereiken, kun je dit doen: |
− | + | ||
− | + | <source lang=bash> | |
+ | $IPTABLES -t nat -A PREROUTING -p tcp -i $INTIF -s 172.16.0.0/16 -d $EXTIP --dport 80 -j DNAT --to-destination 172.16.255.14 | ||
+ | $IPTABLES -t nat -A POSTROUTING -p tcp -s 172.16.0.0/16 -o $INTIF -d 172.16.255.14 --dport 80 -j SNAT --to $EXTIP | ||
</source> | </source> | ||
− | + | En ja, dat postrouting is nodig, anders werkt het niet. | |
− | + | LET OP: Als je forward naar een machine op het interne netwerk, die een andere gateway gebruikt, lukt het niet. Onderstaande code was goed om naar een andere port te forwarden, maar werkte niet omdat joop een andere gateway had dan de SIP server (die tevens de forwarder was). | |
− | |||
− | |||
− | |||
− | |||
− | |||
<source lang="bash"> | <source lang="bash"> | ||
− | + | $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 2222 -j DNAT --to-destination 172.16.99.20:22 | |
+ | $IPTABLES -A FORWARD -p tcp -d 172.16.99.20 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT | ||
</source> | </source> | ||
− | |||
[http://serverfault.com/questions/140622/how-can-i-port-forward-with-iptables Source at serverfault] | [http://serverfault.com/questions/140622/how-can-i-port-forward-with-iptables Source at serverfault] | ||
+ | |||
+ | = voorbeeld firewall = | ||
+ | |||
+ | <source lang=bash> | ||
+ | #!/bin/sh | ||
+ | IPTABLES='/sbin/iptables' | ||
+ | |||
+ | # Set interface values | ||
+ | EXTIF='eth1' | ||
+ | EXTIP='92.xxx.xxx.xxx' | ||
+ | INTIF='eth0' | ||
+ | |||
+ | # enable ip forwarding in the kernel | ||
+ | /bin/echo 1 > /proc/sys/net/ipv4/ip_forward | ||
+ | |||
+ | # flush rules and delete chains | ||
+ | $IPTABLES -F | ||
+ | $IPTABLES -X | ||
+ | |||
+ | # Forward port 80 to SOAP server | ||
+ | $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 80 -j DNAT --to-destination 172.16.255.14 | ||
+ | $IPTABLES -A FORWARD -p tcp -d 172.16.255.14 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT | ||
+ | # internal | ||
+ | $IPTABLES -t nat -A PREROUTING -p tcp -i $INTIF -s 172.16.0.0/16 -d $EXTIP --dport 80 -j DNAT --to-destination 172.16.255.14 | ||
+ | $IPTABLES -t nat -A POSTROUTING -p tcp -s 172.16.0.0/16 -o $INTIF -d 172.16.255.14 --dport 80 -j SNAT --to $EXTIP | ||
+ | |||
+ | #Enable masquerading to allow LAN internet access | ||
+ | $IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE | ||
+ | |||
+ | #Forward LAN traffic from LAN $INTIF to Internet $EXTIF | ||
+ | $IPTABLES -A FORWARD -i $INTIF -o $EXTIF -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT | ||
+ | |||
+ | #Allowing access to the SSH server" | ||
+ | $IPTABLES -A INPUT -s xx.xx.xx.xx --protocol tcp --dport 22 -j ACCEPT | ||
+ | $IPTABLES -A INPUT -s xx.xx.xx.xx --protocol tcp --dport 22 -i $INTIF -j ACCEPT | ||
+ | |||
+ | |||
+ | # Allow ping | ||
+ | $IPTABLES -A INPUT -p icmp -j ACCEPT | ||
+ | |||
+ | # DON'T DO THIS | ||
+ | #$IPTABLES -A INPUT -s 172.16.0.0/16 -j ACCEPT | ||
+ | |||
+ | IPLIST="217.21.203.0/29 217.21.192.64/29 193.67.129.60 193.67.129.61 193.67.129.63 193.67.129.65 193.67.129.180" | ||
+ | for ip in $IPLIST; do | ||
+ | echo Opening voip ports for IP $ip | ||
+ | $IPTABLES -A INPUT -s $ip --protocol tcp -m multiport --dports 5004,5060,10000:30000 -j ACCEPT | ||
+ | $IPTABLES -A INPUT -s $ip --protocol udp -m multiport --dports 5004,5060,10000:30000 -j ACCEPT | ||
+ | done | ||
+ | |||
+ | $IPTABLES -A INPUT -s 172.16.0.0/16 --protocol udp -i $INTIF -m multiport --dports 5004,5060,10000:30000 -j ACCEPT | ||
+ | |||
+ | # block all other Internet access on $EXTIF | ||
+ | $IPTABLES -A INPUT -i $EXTIF -m state --state NEW,INVALID -j REJECT | ||
+ | $IPTABLES -A FORWARD -i $EXTIF -m state --state NEW,INVALID -j REJECT | ||
+ | </source> |
Huidige versie van 13 sep 2012 om 13:45
port forwarding
Ten eerste: als je een regel toevoegt die al het verkeer van het interne netwerk accepteert, dan werkt het NATTEN van het web verkeer niet. Resultaat: ik kon niet meer browsen. Het verkeer wordt dan kennelijk op de gateway al opgevangen.
Vervolgens de volgende twee regels om verkeer van buitenaf te forwarden naar een server binnen het netwerk:
$IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 80 -j DNAT --to-destination 172.16.255.14
$IPTABLES -A FORWARD -p tcp -d 172.16.255.14 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Hierbij is -d waarbij je het IP adres opgeeft denk ik belangrijk, anders zou al het verkeer worden geforward. Dat is weer niet handig als je de machine ook als gateway gebruikt. EXTIP is het internet IP adres van de machine.
Om de forward ook van "binnenuit" werkend te krijgen, zodat je dus op het lokale netwerk de server ook gewoon kan bereiken, kun je dit doen:
$IPTABLES -t nat -A PREROUTING -p tcp -i $INTIF -s 172.16.0.0/16 -d $EXTIP --dport 80 -j DNAT --to-destination 172.16.255.14
$IPTABLES -t nat -A POSTROUTING -p tcp -s 172.16.0.0/16 -o $INTIF -d 172.16.255.14 --dport 80 -j SNAT --to $EXTIP
En ja, dat postrouting is nodig, anders werkt het niet.
LET OP: Als je forward naar een machine op het interne netwerk, die een andere gateway gebruikt, lukt het niet. Onderstaande code was goed om naar een andere port te forwarden, maar werkte niet omdat joop een andere gateway had dan de SIP server (die tevens de forwarder was).
$IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 2222 -j DNAT --to-destination 172.16.99.20:22
$IPTABLES -A FORWARD -p tcp -d 172.16.99.20 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
voorbeeld firewall
#!/bin/sh
IPTABLES='/sbin/iptables'
# Set interface values
EXTIF='eth1'
EXTIP='92.xxx.xxx.xxx'
INTIF='eth0'
# enable ip forwarding in the kernel
/bin/echo 1 > /proc/sys/net/ipv4/ip_forward
# flush rules and delete chains
$IPTABLES -F
$IPTABLES -X
# Forward port 80 to SOAP server
$IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 80 -j DNAT --to-destination 172.16.255.14
$IPTABLES -A FORWARD -p tcp -d 172.16.255.14 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# internal
$IPTABLES -t nat -A PREROUTING -p tcp -i $INTIF -s 172.16.0.0/16 -d $EXTIP --dport 80 -j DNAT --to-destination 172.16.255.14
$IPTABLES -t nat -A POSTROUTING -p tcp -s 172.16.0.0/16 -o $INTIF -d 172.16.255.14 --dport 80 -j SNAT --to $EXTIP
#Enable masquerading to allow LAN internet access
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
#Forward LAN traffic from LAN $INTIF to Internet $EXTIF
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
#Allowing access to the SSH server"
$IPTABLES -A INPUT -s xx.xx.xx.xx --protocol tcp --dport 22 -j ACCEPT
$IPTABLES -A INPUT -s xx.xx.xx.xx --protocol tcp --dport 22 -i $INTIF -j ACCEPT
# Allow ping
$IPTABLES -A INPUT -p icmp -j ACCEPT
# DON'T DO THIS
#$IPTABLES -A INPUT -s 172.16.0.0/16 -j ACCEPT
IPLIST="217.21.203.0/29 217.21.192.64/29 193.67.129.60 193.67.129.61 193.67.129.63 193.67.129.65 193.67.129.180"
for ip in $IPLIST; do
echo Opening voip ports for IP $ip
$IPTABLES -A INPUT -s $ip --protocol tcp -m multiport --dports 5004,5060,10000:30000 -j ACCEPT
$IPTABLES -A INPUT -s $ip --protocol udp -m multiport --dports 5004,5060,10000:30000 -j ACCEPT
done
$IPTABLES -A INPUT -s 172.16.0.0/16 --protocol udp -i $INTIF -m multiport --dports 5004,5060,10000:30000 -j ACCEPT
# block all other Internet access on $EXTIF
$IPTABLES -A INPUT -i $EXTIF -m state --state NEW,INVALID -j REJECT
$IPTABLES -A FORWARD -i $EXTIF -m state --state NEW,INVALID -j REJECT