如何使用ipset和iptables + fail2ban黑名单或白名单很多或几个IP范围

编辑:

如何寻求解决scheme的冲动有时足以缓慢而稳定地引导人们寻求解决scheme,这是令人惊讶的。 而且,为了澄清这个问题,我越来越多地重读我的问题,我意识到这个“问题”超出了“简单”问题的范围,或者是让这个社区回答问题的想法。

随着我越来越了解iptables的操作概念,我将在接下来的几个小时内重新解释这个问题的结构。 理解的过程也产生了一些更具体的问题,我将很快提供给这个社区,并链接到这个问题。


简而言之,我的问题是要find一组正确的规则:

  • 我自己的规则
  • fail2ban
  • 其他DNS黑名单一起工作,而“我的规则”也意味着要么我的国家列入白名单,因此阻止所有其他国家的SSH, 允许所有国家/范围/ IP的DNS查询,除了一套列入黑名单。

数字:

  • 为ssh:白名单50范围黑名单约。 620.000个范围(通过ipdeny.com等组成)
  • dns的黑名单条目:约。 140(一组u32规则 , 脚本 )
  • 25 +/-额外服务的规则(见下文)

歌词版本:我正在努力为我的需求实施解决scheme:scheme如下。 我有一个(现在假设DNS)服务器。 除了绑定ssh,sendmail,https和munin需要考虑到:

这一般很容易实现。 另外我fail2ban被安装,因为我面临来自世界各地的一些(四)DOS攻击。 我的主要目标是尽可能locking服务器。

我的想法是只将我国的一些IP地址列入白名单,这些地址匹配我可以访问的ISP的可能的dynamicDNS分配 – 即DSL和移动。 那样我就不会把自己锁在外面

我查了我的ISP的所有networking范围,导致我的下面的脚本/规则集:

#ports: # 22: SSH (#4,#5) (ssh) # 25: SMTP (#20) (outgoing, sendmail for f2b report) # 53: DNS (!!#16!! see end of #16 as differs for ns1&2) (outgoing, bind) # 443: HTTPS (#10) (outgoing, dns-blacklist update) #4949: munin (#26) (outgoing, sending client stats to server) # Modify this file accordingly for your specific requirement. # http://www.thegeekstuff.com: http://www.thegeekstuff.com/scripts/iptables-rules # 1. Delete all existing rules #iptables -F # 2. Set default chain policies iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # 4. Allow ALL incoming SSH #iptables -A INPUT -i eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT #iptables -A OUTPUT -o eth1 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 5. Allow incoming SSH only from a sepcific network (kabelBW/Unitymedia, Telekom, Accelerated) # note: Using '-I' instead of '-A' to insert to top of INPUT chain to put rule in front of fail2ban! iptables -A INPUT -i eth0 -p tcp -s 5.10.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 5.10.160.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 5.56.176.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 5.56.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 5.146.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 5.158.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 24.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 31.16.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 37.4.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 37.24.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 37.49.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 37.114.96.0/19 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 37.201.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 37.209.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 46.5.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 46.223.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 46.237.192.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 46.252.128.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 62.143.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 77.20.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 78.42.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 78.94.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 80.69.96.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 81.210.128.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 82.211.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 82.212.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 83.169.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 84.200.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 84.201.0.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 85.216.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 88.134.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 88.152.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 91.64.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 91.89.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 92.50.64.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 94.79.128.0/18 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 95.88.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 95.208.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 95.222.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 109.90.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 109.192.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 130.180.0.0/17 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 134.3.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 146.52.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 149.172.0.0/16 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 176.198.0.0/15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 178.24.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 178.200.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 188.192.0.0/14 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp -s 217.8.48.0/20 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT service fail2ban restart # 10. Allow outgoing HTTPS iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT # 12. Ping from inside to outside iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT # 13. Ping from outside to inside iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT # 14. Allow loopback access iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # 16. Allow outbound DNS iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT #Allow inbound DNS iptables -A INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT # 20. Allow Sendmail or Postfix iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT # 26. Allow Munin Stats iptables -A INPUT -p tcp --dport 4949 -j ACCEPT iptables -A OUTPUT -p tcp --sport 4949 -j ACCEPT service munin-node restart sh /root/update_domain_blacklist.sh 

在规则集#10之前重新启动fail2ban是为了确保从iptable清除链(重新)设置正确(在脚本的开始处用-F清除)。同样适用于munin,它抱怨如果不是,则不能到达它的服务器在应用例外规则后重新启动)。

我打算通过/etc/rc.local来应用规则。 这意味着已经创build了fail2ban和munin链。

我想要实现的防火墙检查stream程是:请求是DNS? – >(a); SSH? – >(b); 我的其他服务之一? – >(c); 还要别的吗? – >(d):

  • (一):服务,如果不是黑名单的DNS黑名单脚本
  • (b):如果没有列入黑名单,或者按照我的网域范围列入白名单,则提供服务
  • (c):根据我定义的规则提供服务
  • (d):DROP / TARPIT /最佳实践
  • 如果(b),另外通过fail2ban

上述规则的问题

  • fail2ban在白名单检查之前踢 – 对我的SSH部分很好 ,对我的DNS部分不好 :我的猜测

然后,我尝试使用ipset来阻止/黑名单“整个世界”,除了我的50个范围。 理论上可行,但620k范围的parsing持续10分钟以上; 我取消了手术并回到了白名单范围。 下一个想法:仍然使用ipset 50个范围和阻止/黑名单的反向 ssh:

 !/bin/bash #Script to process ip ranges to ban using IPSet and IPTables # 10. Allow outgoing HTTPS iptables -I OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -I INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT # 12. Ping from inside to outside iptables -I OUTPUT -p icmp --icmp-type echo-request -j ACCEPT iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT # 14. Allow loopback access iptables -I INPUT -i lo -j ACCEPT iptables -I OUTPUT -o lo -j ACCEPT # 16. Allow outbound DNS iptables -I OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT iptables -I INPUT -p udp -i eth0 --sport 53 -j ACCEPT #Allow inbound DNS iptables -I INPUT -p udp -s 0/0 --sport 1024:65535 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT iptables -I INPUT -p udp -s 0/0 --sport 53 --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -I OUTPUT -p udp --sport 53 -d 0/0 --dport 53 -m state --state ESTABLISHED -j ACCEPT # 20. Allow Sendmail or Postfix #to mail.awib.it (82.211.19.134) iptables -I OUTPUT -p tcp --dport 25 -j ACCEPT iptables -I INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT # 26. Allow Munin Stats iptables -I INPUT -p tcp --dport 4949 -j ACCEPT iptables -I OUTPUT -p tcp --sport 4949 -j ACCEPT #iptables -I OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT ipset create countryblock hash:net while read line; do ipset add countryblock $line; done < blocklist.txt iptables -A INPUT -m set ! --match-set countryblock src -j DROP 

而“blocklist.txt”包含了我的50个白名单范围或者列入黑名单的相反范围。 但是这一套的反面也意味着所有的DNSstream量被封锁等等…这让我疯狂! 😀

但由于某种原因,我根本没有访问我的服务器,或反相无效(尝试一些web2ssh小程序来检查ssh提示符)。

我还在其configuration中find了相应的fail2ban创build操作规则定义; 但为了减less开销,我真的很想把munin和f2b的默认规则保持原样,并对我自己的规则进行必要的修改,或者对dns-blacklist脚本进行必要的修改。

我知道这个问题/请求可能不是最简单的,你可能会问为什么不简单地使用fail2ban? 我想知道是否有可疑的行动,从而阻止主机报告是好的。 虽然我不想为每个外部主机都提供这个服务(10倍,因为我在10台服务器上运行fail2ban)。

另一种方法可能是专门的防火墙服务器/路由器,处理所有的stream量。 但这将是一个相当复杂的规则设置,我不想意外locking所有我的服务器,由于愚蠢的错误configuration/错误规则或任何其他。 这也将超过我的免费stream量,目前这个stream量已经在所有10台服务器中分配了。

我希望一些令人讨厌的洞察力的朋友愿意帮助我正确地sorting规则。

在不必要地填补这个问题之前,我暂时搁置,根据要求提供信息。

PS:也许有人可以添加“ipset”标签,因为缺乏声誉我无法创build它。 谢谢!

    看起来非常复杂….

    我认为只要把sshdmunin移到不同的港口,你就可以在安全和性能方面find很大的价值。

    在不匹配默认端口的端口上运行这些服务将平息大部分暴力/阻塞stream量。 之后,Fail2ban应该能够提取任何exception值。

    通过移动到custom端口,你基本上创build了以下内容:

     iptables -A "Anyone that doesn't know the correct ssh port" -j DROP 

    你仍然可以login尝试连接到端口22但我想你可能会find更好的磁盘空间的用途。