iptables Linux packet filter
Light · Postcard
102 × 152 mm · PDF
Dark · Postcard
102 × 152 mm · PDF
Ink saver · Postcard
102 × 152 mm · PDF
Light · A4 landscape
297 × 210 mm · PDF
Dark · A4 landscape
297 × 210 mm · PDF
Ink saver · A4 landscape
297 × 210 mm · PDF
Light · A3 landscape
420 × 297 mm · PDF
Dark · A3 landscape
420 × 297 mm · PDF
Ink saver · A3 landscape
420 × 297 mm · PDF
Start here
sudo iptables -L -n -v --line-numbers
sudo iptables -S
sudo iptables -A INPUT -p tcp --dport <port> -j
ACCEPT
sudo iptables -I INPUT 1 -s <ip> -j DROP
sudo iptables -D INPUT <num>
sudo iptables -t nat -L -n -v
sudo iptables-save > <file>
sudo iptables-restore < <file>
Concepts
- PREROUTING raw, mangle, nat (DNAT)
- INPUT / FORWARD local host or routed
- OUTPUT locally made packets
- POSTROUTING mangle, nat (SNAT)
Tables and chains
iptables -t <table> ...
| Table | Chains | Used for |
|---|---|---|
filter |
INPUT FORWARD OUTPUT |
Allow or block (default) |
nat |
PREROUTING INPUT OUTPUT POSTROUTING |
Address translation |
mangle |
all five |
Alter packets, marks |
raw |
PREROUTING OUTPUT |
Skip connection tracking |
security |
INPUT FORWARD OUTPUT |
SELinux-style marks |
sudo iptables -N <chain>
sudo iptables -E <old> <new>
sudo iptables -X <chain>
sudo iptables -P INPUT DROP
sudo iptables -A INPUT -j <chain>
List and inspect
sudo iptables -L
sudo iptables -L INPUT -n -v --line-numbers
sudo iptables -S <chain>
sudo iptables -L -n -x
sudo iptables -Z
sudo iptables -C INPUT -p tcp --dport <port> -j
ACCEPT
sudo iptables -w -A INPUT ...
iptables -VAdd and remove rules
sudo iptables -A <chain> <rule>
sudo iptables -I <chain> [<num>]
<rule>
sudo iptables -D <chain> <num>
sudo iptables -D <chain> <rule>
sudo iptables -R <chain> <num>
<rule>
sudo iptables -F [<chain>]
sudo iptables -t nat -F
Matches
-p tcp / udp / icmp
-s <ip>[/<mask>]
-d <ip>[/<mask>]
-i <iface>
-o <iface>
! -s <ip>-p tcp --dport <port>
-p tcp --sport <port>
-p tcp --syn-p tcp --tcp-flags SYN,ACK,FIN,RST SYN
-p icmp --icmp-type echo-request
-m multiport --dports <p1>,<p2>
-m conntrack --ctstate ESTABLISHED,RELATED
-m state --state NEW
-m iprange --src-range <a>-<b>
-m comment --comment "<text>"
-m limit --limit 5/minute
-m recent --name <list> --set
-m set --match-set <set> src
-m addrtype --dst-type LOCAL
-m owner --uid-owner <user>
-m mark --mark <n>
Targets
-j ACCEPT-j DROP-j REJECT --reject-with tcp-reset
-j RETURN-j LOG --log-prefix "<text>: "
-g <chain>
NAT and forwarding
sudo iptables -t nat -A POSTROUTING -o <iface> -j
MASQUERADE
sudo iptables -t nat -A POSTROUTING -s <net> -j SNAT
--to-source <ip>
sudo iptables -t nat -A PREROUTING -p tcp --dport
<port> -j DNAT --to-destination
<ip>:<port>
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j
REDIRECT --to-ports <port>
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -A FORWARD -i <in> -o <out> -j
ACCEPT
sudo iptables -t nat -A OUTPUT -d <ip> -j DNAT
--to-destination <ip2>
Save and restore
sudo iptables-save
sudo iptables-save -t <table>
sudo iptables-save -c
sudo iptables-save -f <file>
sudo iptables-restore -t < <file>
sudo iptables-restore -n < <file>
sudo iptables-restore -T <table> <
<file>
sudo iptables-restore -w < <file>
sudo ip6tables ...
Recipes
sudo iptables -A INPUT -i lo -j ACCEPTsudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTsudo iptables -A INPUT -p tcp --dport 22 -j ACCEPTsudo iptables -P INPUT DROP
sudo sysctl -w net.ipv4.ip_forward=1sudo iptables -t nat -A POSTROUTING -o <wan> -j MASQUERADEsudo iptables -A FORWARD -i <lan> -o <wan> -j ACCEPTsudo iptables -A FORWARD -i <wan> -o <lan> -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination <ip>:80sudo iptables -A FORWARD -p tcp -d <ip> --dport 80 -j ACCEPT
sudo iptables -N LOGDROPsudo iptables -A LOGDROP -m limit --limit 5/minute -j LOG --log-prefix "drop: "sudo iptables -A LOGDROP -j DROPsudo iptables -A INPUT -j LOGDROP
sudo iptables-save > backup.rulessudo iptables-restore -t < new.rulessudo iptables-restore < new.rules# roll back: sudo iptables-restore < backup.rules



