FreeBSD 7, bridge, PF and syn flood = very bad performance
Max Laier
max at love2party.net
Sat Jan 26 11:30:33 PST 2008
On Friday 25 January 2008, Stefan Lambrev wrote:
> Greetings,
>
> Does anyone try to see PF with "keep state" in action when under syn
> flood attack?
> I tried to get some help in freebsd-pf@, because the test firewall,
> that I build hardly can handle 2-5MB/s syn flood.
> Unfortunately I do not saw useful advice.
> The problem is that a quad core bridge firewall running freebsd 7 amd64
> with PF is near useless and can't handle "small" SYN ddos.
>
> Here is the schema that I'm testing:
> web server (freebsd) - freebsd (bridged interfaces) - gigabit switch -
> clients + flooders
> In this configuration ~25MB/s syn flood (and I think this limit is
> because of my switch) is not a problem and the web server responds
> without a problem.
> With this configuration netperf -l 610 -p 10303 -H 10.3.3.1 shows
> 116MB/s stable speed , so I guess there are no problems with cables,
> hardware and etc :)
>
> But when I start pf (see below the config file) the traffic drops to
> 2-3MB/s and the web server is hardly accessible.
> It seems that device polling helps a lot in this situation, and at
> least the bridge firewall is accessible. Without "polling" the firewall
> is so heavily loaded
> that even commands like "date" take few seconds to finish, with 2 cores
> at ~100% idle at same time.
>
> I have "flat profiles" from hwpmc, and I think it indicates a problem:
>
> (bridge, pf enabled, polling enabled, sched_ule - I have profiles and
> for other combinations too if needed)
> % cumulative self self total
> time seconds seconds calls ms/call ms/call name
> 24.0 268416.00 268416.00 0 100.00% _mtx_lock_sleep
Can you build a kernel with LOCK_PROFILING and try to figure out which
lock is causing this?
> [1] 6.7 343572.50 75156.50 0 100.00%
> pf_state_compare_ext_gwy [2]
> 6.7 418405.50 74833.00 0 100.00% pf_src_compare
> [3] 3.9 462298.50 43893.00 0 100.00%
> pf_state_compare_lan_ext [4]
> 3.6 503019.50 40721.00 0 100.00% pf_test [5]
> 3.2 538671.50 35652.00 0 100.00% pf_test_tcp [6]
> 3.1 573743.50 35072.00 0 100.00% bcopy [7]
> 2.3 599406.50 25663.00 0 100.00% bridge_pfil [8]
> 2.0 622096.50 22690.00 0 100.00%
> pf_state_compare_id [9]
> 2.0 644331.50 22235.00 0 100.00% pfsync_pack_state
> [10] 1.5 661563.50 17232.00 0 100.00% uma_zalloc_arg
> [11] 1.3 676296.50 14733.00 0 100.00% bzero [12] 1.3
> 690842.00 14545.50 0 100.00%
> bus_dmamap_load_mbuf_sg [13]
> 1.2 704521.50 13679.50 0 100.00% uma_zfree_arg
> [14] 1.2 717554.50 13033.00 0 100.00%
> bridge_rtnode_lookup [15]
> 1.2 730575.50 13021.00 0 100.00% _rw_rlock [16]
> 1.1 743076.50 12501.00 0 100.00% rn_match [17]
> 1.0 754016.50 10940.00 0 100.00% bridge_forward
> [18] 1.0 764766.00 10749.50 0 100.00% em_encap [19]
> 0.9 775400.00 10634.00 0 100.00% _rw_runlock [20]
> ........
>
> Also when running without polling top -S shows that external em0
> interface's taskq takes 100% CPU
> The situation is even worse when running with SCHED_BSD.
>
> Here is my test pf.conf
> quick
> #macros
> ext_if="em0"
> int_if="em1"
> br_if="bridge0"
>
> www="10.3.3.1"
>
> #sets
> set skip on lo0
> set skip on $int_if
> set skip on $br_if
> set limit states 20000000
> set limit src-nodes 19000000
> set optimization aggressive
>
> table <abusive_hosts> persist file "/etc/abusive_hosts"
>
> block log quick from <abusive_hosts> to any
> block log quick from any to <abusive_hosts>
>
> pass in on $ext_if proto tcp from any to $www port { 80, 443 } flags
> S/SA keep state \
> (source-track rule, max-src-conn-rate 150/10, max-src-states 500,
> max-src-nodes 4000000, overload <abusive_hosts> flush global)
--
/"\ Best regards, | mlaier at freebsd.org
\ / Max Laier | ICQ #67774661
X http://pf4freebsd.love2party.net/ | mlaier at EFnet
/ \ ASCII Ribbon Campaign | Against HTML Mail and News
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: This is a digitally signed message part.
Url : http://lists.freebsd.org/pipermail/freebsd-current/attachments/20080126/c2659b39/attachment.pgp
More information about the freebsd-current
mailing list