Difference between revisions of "Telephone system:fail2ban"
(My script failed repeatedly after a while, trying fail2ban with progressive insights) |
(Added unauthorized targeted call filter) |
||
(One intermediate revision by the same user not shown) | |||
Line 27: | Line 27: | ||
</pre> | </pre> | ||
+ | And after <code><X-PRE-PROCESS cmd="include" data="public/*.xml"/></code>, you can place the following | ||
+ | (note that this only applies to setups that allow certain public extensions/incoming trunks while also having (dynamic IP) users logged into their extension remotely (gained access by responding to the <code>407 Proxy authentication required</code>): | ||
+ | <pre> | ||
+ | <extension name="check_auth" continue="true"> | ||
+ | <condition field="${sip_authorized}" expression="^true$" break="never"> | ||
+ | <anti-action application="log" data="WARNING flag unauthorized: ${network_addr} (from ${sip_from_uri} to ${sip_to_uri})"/> | ||
+ | <anti-action application="respond" data="407"/> | ||
+ | </condition> | ||
+ | </extension> | ||
+ | </pre> | ||
'''/etc/fail2ban/filter.d/freeswitch.conf''' | '''/etc/fail2ban/filter.d/freeswitch.conf''' | ||
Line 44: | Line 54: | ||
ignoreregex = | ignoreregex = | ||
</pre> | </pre> | ||
+ | |||
+ | |||
+ | '''/etc/fail2ban/filter.d/freeswitch-reg-dos.conf''' | ||
+ | <pre> | ||
+ | [Definition] | ||
+ | # Remote is trying to call without permission | ||
+ | failregex = \[WARNING\] mod_dptools\.c:\d+ flag unauthorized: <HOST> \(from [^ ]* to [^ ]*\)$ | ||
+ | ignoreregex = | ||
+ | </pre> | ||
+ | |||
'''/etc/fail2ban/jail.local''' | '''/etc/fail2ban/jail.local''' | ||
Line 64: | Line 84: | ||
findtime = 300 | findtime = 300 | ||
maxretry = 0 | maxretry = 0 | ||
+ | # ban for a week | ||
+ | bantime = 604800 | ||
+ | action = iptables-allports[name=freeswitch, protocol=all] | ||
+ | |||
+ | [freeswitch-reg-dos] | ||
+ | enabled = true | ||
+ | port = 5060,5061,5080,5081 | ||
+ | filter = freeswitch-reg | ||
+ | logpath = /var/log/freeswitch/freeswitch.log | ||
+ | findtime = 3600 | ||
+ | maxretry = 10 | ||
# ban for a week | # ban for a week | ||
bantime = 604800 | bantime = 604800 | ||
Line 80: | Line 111: | ||
maxretry = 3 | maxretry = 3 | ||
</pre> | </pre> | ||
+ | |||
+ | Apply the new config with <code>service fail2ban reload</code> and <code>fs_cli -x reloadxml</code> | ||
[[Category:Telephony]][[Category:Telephone snippet]][[Category:FreeSWITCH]] | [[Category:Telephony]][[Category:Telephone snippet]][[Category:FreeSWITCH]] |
Latest revision as of 10:15, 23 December 2020
If you have a FreeSWITCH instance running on the public net, changes are people will try to exploit it. Fail2ban tries to mitigate this. This is a re-attempt since the alternative perl autoblock script would freeze/hang.
Forget the provided configs both of fail2ban and FreeSWITCH itself (here is a defect stating more or less the same): try these instead and keep an eye on the logs with tail -f /var/log/fail2ban.log
for a while, together with a realtime FS log.
Also, make sure the logpath
is correct.
/etc/freeswitch/dialplan/public.xml before the subsirectory includes:
<extension name="IP based call"> <condition field="${acl(${network_addr} trunks)}" expression="false"/> <condition field="${sip_to_host}" expression="${local_ip_v4}"> <action application="log" data="WARNING IP based INVITE not from trunk ${network_addr}"/> <action application="respond" data="403"/> </condition> </extension> <extension name="Vicious scanners"> <condition field="${acl(${network_addr} trunks)}" expression="false"/> <condition regex="any"> <regex field="${sip_to_host}" expression="1\.1\.1\.1"/> <regex field="${sip_user_agent}" expression="friendly-scanner"/> <action application="log" data="WARNING vicious INVITE not from trunk ${network_addr}"/> <action application="respond" data="488"/> </condition> </extension>
And after <X-PRE-PROCESS cmd="include" data="public/*.xml"/>
, you can place the following
(note that this only applies to setups that allow certain public extensions/incoming trunks while also having (dynamic IP) users logged into their extension remotely (gained access by responding to the 407 Proxy authentication required
):
<extension name="check_auth" continue="true"> <condition field="${sip_authorized}" expression="^true$" break="never"> <anti-action application="log" data="WARNING flag unauthorized: ${network_addr} (from ${sip_from_uri} to ${sip_to_uri})"/> <anti-action application="respond" data="407"/> </condition> </extension>
/etc/fail2ban/filter.d/freeswitch.conf
Definition] # NOTE: don't trigger on challenge, only failure failregex = ^\.\d+ \[WARNING\] sofia_reg\.c:\d+ SIP auth failure \((REGISTER|INVITE)\) on sofia profile \'[^']+\' for \[.*\] from ip <HOST>$ ^\.\d+ \[WARNING\] sofia_reg\.c:\d+ Can't find user \[\d+@\d+\.\d+\.\d+\.\d+\] from <HOST>$ ignoreregex =
/etc/fail2ban/filter.d/freeswitch-ip.conf
[Definition] # Remote is calling us by IP in stead of name failregex = ^.*(IP based|vicious) INVITE not from trunk <HOST>$ ignoreregex =
/etc/fail2ban/filter.d/freeswitch-reg-dos.conf
[Definition] # Remote is trying to call without permission failregex = \[WARNING\] mod_dptools\.c:\d+ flag unauthorized: <HOST> \(from [^ ]* to [^ ]*\)$ ignoreregex =
/etc/fail2ban/jail.local
[freeswitch] enabled = true port = 5060,5061,5080,5081 filter = freeswitch logpath = /var/log/freeswitch/freeswitch.log maxretry = 4 ; for a total of five failures findtime = 3600 bantime = 28800 ; 1200=20m, 7200=2h, 28800=8h action = iptables-allports[name=freeswitch, protocol=all] [freeswitch-ip] enabled = true port = 5060,5061,5080,5081 filter = freeswitch-ip logpath = /var/log/freeswitch/freeswitch.log findtime = 300 maxretry = 0 # ban for a week bantime = 604800 action = iptables-allports[name=freeswitch, protocol=all] [freeswitch-reg-dos] enabled = true port = 5060,5061,5080,5081 filter = freeswitch-reg logpath = /var/log/freeswitch/freeswitch.log findtime = 3600 maxretry = 10 # ban for a week bantime = 604800 action = iptables-allports[name=freeswitch, protocol=all] [DEFAULT] # Considered safe # kingofdos.eu 185.66.250.17 # kingofdos.eu 91.218.127.87 # kingofdos.eu 164.138.31.26 # sip.speakup.nl 193.169.138.26 # sip.speakup.nl 193.169.139.26 # self: 666.666.666.666 ignoreip = 127.0.0.1/8 185.66.250.17 91.218.127.87 164.138.31.26 193.169.138.26 193.169.139.26 666.666.666.666 bantime = 600 maxretry = 3
Apply the new config with service fail2ban reload
and fs_cli -x reloadxml