我的iptables安全吗?

我在我的新Ubuntu服务器上的rc.local有这个:

 iptables -F iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --dport 9418 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 9418 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --dport 5000 -m state --state NEW,ESTABLISHED -j ACCEPT # Heroku iptables -A INPUT -i eth0 -p tcp --sport 5000 -m state --state ESTABLISHED -j ACCEPT # Heroku iptables -A INPUT -p udp -s 74.207.242.5/32 --source-port 53 -d 0/0 --destination-port 1024:65535 -j ACCEPT iptables -A INPUT -p udp -s 74.207.241.5/32 --source-port 53 -d 0/0 --destination-port 1024:65535 -j ACCEPT 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 iptables -P INPUT DROP iptables -P FORWARD DROP 

9418是Git的端口。 5000是一个用来pipe理Heroku应用程序的端口。 而74.207.242.574.207.241.5是我们的DNS服务器。

你认为这是安全的吗? 你能在这里看到什么漏洞吗?

更新:为什么阻止OUTPUT很重要? 这台机器只能由我使用。

我能看到的唯一的主要漏洞是IPv6。 你需要ip6tables 。 如果你的任何服务监听IPv6(包括ssh在内的许多服务,默认监听IPv6),那么攻击者就可以使用它完全绕过上面的所有规则。 当networking可用时,networking将优先使用IPv6。

假设你的OUTPUT策略是DROP ,你已经很好地限制了IPv4。

跳过RELATED选项可能意味着,当服务停止并停止监听时,您将获得超时而不是即时拒绝,因为我知道TCP RST数据包既不是NEWESTABLISHED在此上下文中。


要回答你的问题的更新:当它不仅被你使用。

不pipe我们多么小心,总是有可能我们错过了一些东西,或者我们一时不小心,并且允许别人对我们的盒子进行某种程度的控制。 攻击者首先要做的就是下载一个特权升级工具包,一个rootkit,他们的命令和控制系统,以及他们真正想要在这个盒子上运行的任何东西。 限制出站连接意味着他们无法下载该特权升级套件,这意味着他们作为Apache用户或Git用户或他们设法攻击的任何东西被卡住。 没有root权限,他们不能隐藏,他们不能修改防火墙。 这不会永远阻止攻击者,但是可能会阻止他足够长的时间,让你注意到他在那里,或者让他感到沮丧,于是他放弃了,并且更容易去了一些地方。

上述规则意味着远程文件包含攻击只有在远程文件托pipe在SSL上时才会起作用。 如果你在这个盒子和互联网之间放置一个代理服务器,只允许某些URL模式,你可以停止RFI的轨道,同时仍然允许正常的操作。 这是深度防御

除了其他人发表的有关丢失OUTPUT链和重复ESTABLISHED规则的注释之外,还可以将协议(例如SSH(TCP /端口22))限制为特定的IP(如果适用)。

要检查您的设置,您可以尝试使用NMAP来检查打开的端口。 如果防火墙规则变得更复杂,这可能会更有用。

您应该在/ etc / network / interfaces(参见man 5 interfaces )中的前导行中运行该脚本,以便在networking可用并启动服务之前,防火墙规则已到位。 rc.local是最后一个运行的东西,所以有一个不必要的时间窗口,其中的东西是不受保护的。

记住这种types的事情并不是某种魔力。 如果还有其他的服务正在盯着,但是正试图阻止访问,你不应该首先启动它们。 如果这里的想法是阻止访问你不打算开始的服务,这意味着有不可信的人已经在你的机器上做了什么? 在这种情况下,你已经丢失了,而且可以安全地假设,当你有恶意用户在你的机器上运行代码时,你的防火墙规则也可以被操纵。

我几天前在github上开源了iptables-boilerplate 。 它本质上是一套很好的预定义的iptable-rules,并且被广泛地评论。

也许使用和阅读可以帮助你