Keep your firewall rules under control with custom chains
By default, the iptables filter table consists of three chains: INPUT, FORWARD, and OUTPUT. You can add as many custom chains as you like to help simplify managing large rule sets. Custom chains behave just as built-in chains, introducing logic that must be passed before the ultimate fate of a packet is determined.
To create a new chain, use the -N switch:
root@linux:~# iptables -N fun-filter
You can see which chains are defined at any time with the standard -L switch:
root@linux:~# iptables -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
Chain fun-filter (0 references)
target prot opt source destination
In order to make use of your custom chain, you'll have to jump to it from somewhere. Let's add a jump to the fun-filter chain we've just created straight from the INPUT chain:
root@linux:~# iptables -t filter -A INPUT -j fun-filter
Now your custom chain can grow to any sort of complexity you like. For example, you may want to match packets based on the source MAC address:
root@linux:~# iptables -A fun-filter -m mac -- mac-source 11:22:33:aa:bb:cc
-j ACCEPT
root@linux:~# iptables -A fun-filter -m mac -- mac-source de:ad:be:ef:00:42
-j ACCEPT
root@linux:~# iptables -A fun-filter -m mac -- mac-source 00:22:44:fa:ca:de
-j REJECT -- reject-with icmp-host-unreachable
root@linux:~# iptables -A fun-filter -j RETURN
The RETURN jump at the end of the table makes processing resume back in the chain that called this one (in this case, back in the INPUT chain). Again, show what all of your tables look like with the -L switch:
root@linux:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fun-filter all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fun-filter (0 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere MAC 11:22:33:AA:BB:CC
ACCEPT all -- anywhere anywhere MAC DE:AD:BE:EF:00:42
REJECT all -- anywhere anywhere MAC 00:22:44:FA:CA:DE reject-with icmp-host-
unreachable
RETURN all -- anywhere anywhere
You can jump into any number of custom defined chains and even jump between them. This helps to isolate rules that you're developing from the standard system policy rules, and enable and disable them easily. If you want to stop using your custom chain temporarily, you can simply delete the jump from the INPUT chain (rather than flushing the entire custom chain):
root@linux:~# iptables -t filter -D INPUT -j fun-filter
If you decide to delete your custom chain, use -X:
root@linux:~# iptables -X fun-filter
Note that there can be no references to your custom chain if you try to delete it; use -F to flush the chain first if there are still rules referring to your chain.
When properly managed, even the most complex iptables rulesets can be easily read, if you use intuitively named custom chains.
0 comments:
Post a Comment