46

I have a system that came with a firewall already in place. The firewall consists of over 1000 iptables rules. One of these rule is dropping packets I don't want dropped. (I know this because I did iptables-save followed by iptables -F and the application started working.) There are way too many rules to sort through manually. Can I do something to show me which rule is dropping the packets?

Shawn J. Goff
  • 45,338
  • 25
  • 134
  • 145

5 Answers5

26

You could add a TRACE rule early in the chain to log every rule that the packet traverses.

I would consider using iptables -L -v -n | less to let you search the rules. I would look port; address; and interface rules that apply. Given that you have so many rules you are likely running a mostly closed firewall, and are missing a permit rule for the traffic.

How is the firewall built? It may be easier to look at the builder rules than the built rules.

BillThor
  • 8,887
  • 22
  • 27
  • I figured out after asking this question that the rules are from APF, and I was able to fix that. I love the TRACE target, though. That would have been very effective. – Shawn J. Goff Mar 26 '11 at 19:21
  • 4
    An example of using TRACE target is here: http://serverfault.com/questions/122157/debugger-for-iptables/126079#126079. – slm Jun 12 '15 at 16:59
23

Since iptables -L -v -n has counters you could do the following.

iptables -L -v -n > Sample1
#Cause the packet that you suspect is being dropped by iptables
iptables -L -v -n > Sample2
diff Sample1 Sample2

This way you will see only the rules that incremented.

Kyle Brandt
  • 832
  • 11
  • 18
15

Run iptables -L -v -n to see the packet and byte counters for every table and for every rule.

ninjalj
  • 1,427
  • 12
  • 10
11

In my company we use watch -n 2 -d iptables -nvL, it shows changes between requests

Marcelo Salazar
  • 111
  • 1
  • 2
8
watch -n1 -d "iptables -tfilter -vnxL | grep -vE 'pkts|Chain' | sort -nk1hr | column -t"

Keep in mind, this will only show stuff for the table filter.

If you want all tables, try this:

watch -n1 -d "(iptables -tfilter -vnxL;iptables -tnat -vnxL;iptables -tmangle -vnxL;iptables -traw -vnxL;iptables -tsecurity -vnxL) | grep -vE 'pkts|Chain' | sort -nk1,1hr | column -t"
sjas
  • 545
  • 7
  • 8
  • 1
    The most complete solution IMHO. `| tac` can be dropped in favour of add `-r` to the `sort` command. – Zaar Hai Jul 26 '21 at 04:52
  • 1
    @ZaarHai thanks for the flowers, edited considering your input and also fixed the sorting which lacked `-h`. – sjas Jul 31 '21 at 17:32