如何使用 ipset 和 iptables + fail2ban 将大量或少量 IP 范围列入黑名单或白名单

如何使用 ipset 和 iptables + fail2ban 将大量或少量 IP 范围列入黑名单或白名单

编辑:

令人惊讶的是,有时寻求解决方案的冲动足以缓慢但稳步地引导人们找到解决方案。此外,我越是经常重读我的问题以澄清它,我就越意识到这个“问题”远远超出了“简单”问题的范围或让这个社区回答问题的想法。

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


简而言之: 我的问题是找到一套正确的规则:

  • 我自己的规则
  • 失败2ban
  • 其他 DNS 黑名单可以协同工作,而“我的规则”还意味着要么将我的国家列入 ssh 白名单,要么阻止所有其他国家使用 ssh,允许全部用于 DNS 查询的国家/范围/IP,除一组列入黑名单的国家/范围/IP 外。

数字方面:

  • 对于 ssh:白名单 50 个范围或者黑名单约 620,000 个范围(通过 ipdeny.com 等组成)
  • DNS 黑名单条目:约 140 (一组 u32 规则腳本
  • 25+/- 附加服务规则(见下文)

歌词版本: 我正在努力实现一个满足我需求的解决方案:场景如下。我有一个(目前假设是 DNS)服务器。除了 bind ssh 之外,还需要考虑 sendmail、https 和 munin:

这通常很容易实现。此外,我还安装了 fail2ban,因为我面临来自世界各地的一些 (d)dos 攻击。我的主要目标是尽可能锁定服务器。

我的想法是将我所在国家的部分 IP 范围列入白名单,这些范围与我可以访问的 ISP(即 DSL 和移动)的可能动态 DNS 分配相匹配。这样,我就不会把自己锁在外面。

我查看了我的 ISP 的所有网络范围,从而得到了以下脚本/规则集:

#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 应用规则。这意味着已经创建了 fail2ban 和 munin 链。

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

  • (a): 如果没有列入黑名单,则提供 DNS 黑名单脚本
  • (b): 如果没有被列入黑名单或者根据我的网络范围设置被列入白名单,则提供服务
  • (c): 根据我定义的规则提供服务
  • (d):DROP/TARPIT/其他最佳实践
  • 如果 (b),另外通过 fail2ban

问题使用上述规则:

  • fail2ban 在白名单检查之前启动 -好的对于我的 ssh 部分,坏的对于我的 DNS 部分:我的猜测

然后,我尝试使用 ipset 阻止/将“整个世界”列入黑名单,但 50 个范围除外。理论上可行,但解析 620k 个范围需要 10 多分钟;我取消了操作并返回到我的白名单范围。下一个想法:仍然对 50 个范围使用 ipset,并阻止/将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 个范围或要列入黑名单的 50 个范围的倒数。但该集合的倒数也意味着所有 DNS 流量都会被阻止等……这让我很抓狂!:-D

但由于某种原因,我根本无法访问我的服务器,或者反过来不起作用(尝试了一些 web2ssh 小程序只是为了检查 ssh 提示)。

我还在其配置中找到了相应的 fail2ban createaction 规则定义;但是为了减少开销,我真的很想保留 munin 和 f2b 的默认规则,并对我自己的规则和 dns-blacklist 脚本应用必要的修改。

我知道这个问题/请求可能不是最简单的,你可能会问为什么不直接使用 fail2ban?我想知道是否有可疑操作,因此获得阻止主机报告是很好的。虽然我不希望每个外国主机都有这个(十倍,因为我在超过 10 台服务器上运行 fail2ban)。

另一种方法可能是使用专用的防火墙服务器/路由器来处理所有流量。但这将是一个相当复杂的规则设置,我不想因为愚蠢的错误配置/错误的规则或其他原因而意外锁定我的所有服务器。此外,这会超出我的免费流量,目前免费流量被分配到所有 10 台服务器。

我希望周围有一些有洞察力的朋友愿意帮助我正确地整理规则。

在毫无必要地充实这个问题之前,我现在正在等待,并根据要求提供信息。

附言:也许有人可以添加“ipset”标签,因为我由于缺乏声誉而无法创建它。谢谢!

答案1

看上去非常复杂....

我认为您只需移动到不同的端口即可发现安全性和性能方面的巨大sshd价值munin

在与默认端口不匹配的端口上运行这些服务将平息大部分暴力攻击/DOS 流量。此后,Fail2ban 应该能够发现任何异常值。

通过移动到custom端口,您实际上创建了以下内容:

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

您仍然可以记录连接端口的尝试22,但我认为您可能可以找到磁盘空间的更好用途。

答案2

ipset create banned_hosts hash:net family inet hashsize 524288 maxelem 800000 counters comment
ipset create whitelist hash:net family inet hashsize 524288 maxelem 800000 counters comment

iptables -I INPUT 1 -m set --match-set banned_nets src -j DROP
iptables -I INPUT 2 -m set --match-set whitelist src -j ACCEPT

ipset add banned_hosts 171.248.31.131
ipset add banned_hosts 191.185.207.16
ipset add banned_hosts 45.247.22.251
ipset add banned_hosts 82.98.162.90
ipset add banned_hosts 125.227.181.216
ipset add banned_hosts 122.117.163.44

保存一切 ipset

ipset save >all.txt

加载全部设置

ipset load <all.txt

相关内容