iptables规则顾问脚本


9

有没有任何iptables防护的服务器:ACCEPT all..

该服务器上可能有自定义应用程序。

如果我们需要使用严格的iptables规则来加固该服务器(因此拒绝所有,仅让应用程序需要什么),我们必须手工找出哪个应用程序使用了哪个应用程序dst/src port/protocol,然后为该应用程序编写iptables规则他们..

问题:是否有任何脚本可以帮助从运行中的计算机收集这些信息?(从日志?)-并且自动生成iptables规则?

就像有audit2allowSELinux。只为iptables

机器不能有任何故障!

例如:“ MAGIC”脚本应该在机器上运行一周/一个月,收集信息,然后,在一周/一个月之后,该脚本将能够产生一个我们可以使用的iptables规则文件。

许多人可能会遇到这种情况(如何针对iptables强化服务器)。如果有一个脚本/解决方案可以做到这一点,那就太好了:\


或者,阻止所有内容,仅让需要的内容通过。您可以找出运行一周左右的tcpdump所需的内容。
劳伦斯

这台机器上不能有任何故障:)
evachristine


1
您可以监视流量或检查打开的端口,但您可能很少会错过但很重要的传出流量(特殊安全更新,在极少数情况下发送的邮件...)。只要您只想过滤传入的流量,就可以选择监视。
jofel 2014年

这完全可以做到,您可以编写脚本来从正在运行的应用程序和公开的端口构建规则集。但是您确实不希望这样做,因为1)在大多数情况下,并非所有服务都需要暴露于网络中; 2)某些服务绝对不希望您暴露于网络中。取而代之的是手动完成一次,设置一个好的规则集,然后从那里开始。一种安全的方法是使用ESTABLISHED / RELATED和ACCEPT规则构建规则集,然后检查相关规则是否与流量匹配。高兴时,将输入策略更改为丢弃。
Pedro '18

Answers:


2

手动执行

sudo ss -tuanp

要么

sudo netstat -tuanp

说明:

-t - show tcp sockets
-u - show udp sockets
-a - show all sockets
-n - show numeric, don't resolve 
-p - show process name

1

tcpdump在计算机上运行一周左右,以捕获平均流量。然后,您可以稍后使用wireshark浏览流量,以查看正在使用的端口。

该命令将是 tcpdump -i <interface> -s 65535 -w <some-file>

然后,您可以使用netstat -tuanp将其映射回去,以查看哪些PID /应用程序正在使用哪些端口。

从理论上讲,这可以编写脚本。


1

您可以从一个非常基本的模板开始,例如https://gist.github.com/jirutka/3742890,该模板仅允许ssh和ping,并手动添加其他任何内容。

一个快速的脚本黑客,可为您的应用程序生成iptables规则,以监听公共接口(0.0.0.0)/ tcp

netstat -lnpt | egrep '0.0.0.0:[0-9]+' | awk '{print $4,$7}' | \
sed -E -e 's/0.0.0.0://g' -e 's|[0-9]+/||' | \
awk '{printf ("iptables -A INPUT -p tcp --dport %5d --syn -m conntrack --ctstate NEW -m comment %s \n", $1,$2) }'

您还可以使用iptables -I INPUT <number>将规则注入到特定位置,您可以使用iptables -nvL --line-numbers INPUT


1

不幸的是,我从未见过这样的脚本可以在学习模式或被动模式下运行,以记录您的所有网络使用情况,获取其结果并使用iptables其日志生成实际的防火墙。

最好的选择是从简单开始,并在您完全了解系统提供的服务时不断添加各种内容。您将需要使用一些工具,例如netstat查看所托管的各种服务正在使用哪些端口以及正在访问哪些IP地址。

$ sudo netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:890                 0.0.0.0:*                   LISTEN      26149/ypbind        
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      26226/python        
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      26221/./hpiod       
tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      26237/snmpd         
tcp        0      0 0.0.0.0:809                 0.0.0.0:*                   LISTEN      26067/rpc.statd     
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN      26321/smbd          
tcp        0      0 0.0.0.0:587                 0.0.0.0:*                   LISTEN      26292/sendmail      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      26038/portmap       
tcp        0      0 0.0.0.0:35604               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      26249/sshd          
tcp        0      0 0.0.0.0:631                 0.0.0.0:*                   LISTEN      26257/cupsd         
tcp        0      0 :::22                       :::*                        LISTEN      26249/sshd          
tcp        0      0 :::631                      :::*                        LISTEN      26257/cupsd         

注意:在上面,您可以看到我在服务器上运行的哪些服务正在接受TCP连接,即它们正在“侦听”各个端口上的连接。

如果像SSH(端口22)和HTTP(端口80)之类的东西对于您的系统来说是典型的,那将是很轻松的事情,因此,我将一次大量地进行这些类型的服务。对于LDAP或NIS之类的其他服务,您可能希望以更可控的方式进行操作,并确保在引入它们时不会中断。

工具如FireHOL防火墙生成器(Fwbuilder的),并且eztables你攻击这个项目,因为它们提供了一个抽象层很好不必构建自定义可能是有帮助iptable的手规则,这可能会非常棘手。

火热

FireHOL是一种语言(以及用于运行它的程序),它可以构建安全,有状态的防火墙,从易于理解的,易于理解的配置中解决任何复杂问题。

transparent_squid 8080 "squid root" inface eth0

interface eth0 mylan
    policy accept

interface ppp+ internet
    server smtp accept
    server http accept
    server ftp  accept
    server ssh  accept src example.firehol.org

    client all  accept

router mylan2internet inface eth0 outface ppp+
    masquerade
    route all accept
fwbuilder

Fwbuilder是一个独特的图形防火墙工具,允许用户创建对象,然后将这些对象拖放到防火墙中,从而为单个PC或PC网络构建功能强大的安全系统。Fwbuilder支持多种防火墙(Cisco ASA / PIX,Linux iptables,FreeBSD的ipfilter,OpenBSD的pf等),因此其规则可以部署在多个平台上。让我们看一下在Linux上使用Fwbuilder的情况,它可能会成为功能强大的安全系统的一生。

   ss fwbuilder

易位

Eztables允许您快速配置防火墙,而无需接触iptables。防火墙规则语法的设计易于阅读和应用。

这是您允许整个Internet在TCP端口80上访问您的Web服务器的方式:

  allow_in any $eth0 any 80/tcp

Eztables的设计既简单又强大。是否要保护笔记本电脑,设置家庭路由器或建立公司防火墙都没有关系。

使用Fail2Ban

有了基本iptables防火墙,您可能会希望使用Fail2Ban之类的工具来补充它。

摘抄

Fail2ban扫描日志文件(例如/ var / log / apache / error_log),并禁止显示恶意迹象的IP-过多的密码错误,寻找漏洞利用等。通常,Fail2Ban然后用于更新防火墙规则以拒绝IP地址在指定的时间内,尽管也可以配置任何其他任意操作(例如,发送电子邮件)。开箱即用Fail2Ban带有针对各种服务(apache,courier,ssh等)的过滤器。

使用诸如此类的工具将有助于限制系统在继续加强时必须承受的风险。即使您完全确信系统已得到加强,您仍可能希望继续使用Fail2Ban作为安全措施的一部分。

参考文献


0

使用iptable规则记录新连接,也将记录udp。

iptables -I INPUT -m state --state NEW -j LOG --log-prefix "New inbound connection: "
iptables -I OUTPUT -m state --state NEW -j LOG --log-prefix "New outbound connection: "

您可以指定不同于--log-level / var / log / messages的其他文件中的日志(必须配置syslog守护程序)。

我认为您应该阅读主要的应用程序日志,因为某些服务器具有非常定期的活动,例如正午,星期末,月末(季度,年),因此您不会错过服务器的重要网络活动。

由于服务器至关重要,因此可以在一个不错的电子表格(ip源,ip dest,协议,端口,应用程序)上建立服务器的网络流量矩阵,这将有助于您建立规则。


0

我知道这不是脚本, 也不是 OP问题的答案,但这是我想与OP分享的想法。

我有以下所有监听端口:

netstat -an | egrep 'tcp .*LISTEN' | awk -F" " '{print $4}' | awk -F":" '{print $NF}'

也许这可以使您更接近编写自己的脚本。:)


0

您可以从以下内容开始:

netstat -n -l -p | egrep "^(tcp|tcp6|udp)" | grep LISTEN | sed -r 's!^(tcp|tcp6|udp)\s.*:([0-9]+).*LISTEN\s+.*/(.*)!iptables -A INPUT -p \1 --dport \2 -j ACCEPT # \3!'

然后跟进

iptables -P INPUT DROP

要么

iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

第一行所做的是使用netstat列出侦听进程及其端口。然后,它将生成“ iptables”行,以允许每个传入连接。sed regex替代品很少,是为我的服务器上的netstat输出定制的,因此可能需要对您进行一些调整。当它起作用时,您应该最终得到如下所示的内容:

iptables -A INPUT -p tcp --dport 111 -j ACCEPT # rpcbind       
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # sshd          
iptables -A INPUT -p tcp --dport 25 -j ACCEPT # master        
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT # mysqld        
iptables -A INPUT -p tcp --dport 49476 -j ACCEPT # rpc.statd     
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT # postgres.bin  
iptables -A INPUT -p tcp --dport 55371 -j ACCEPT # rpc.statd

需要注意的两个重要事项:

1)这些规则对您无济于事,除非您将DROP或REJECT行放在末尾或将不匹配的数据包设置为默认策略。如果默认策略允许任何不匹配的内容,这些规则将允许没有意义的数据包。

2)这些规则与 IP 不一致。从您的原始帖子看来,您好像想允许所有客户端使用服务器,然后检查日志以获取与目标端口一起使用的 IP。我不知道执行此操作的工具,因此该脚本只会阻止人们在您的服务器上制作监听其他端口的新服务...这是某种东西

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.