rc.local
我的新 Ubuntu 服务器上有这个:
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 是用于管理 Heroku 应用的端口。和74.207.242.5
是74.207.241.5
我们的 DNS 服务器。
你认为这安全吗?你发现这里有漏洞吗?
更新:为什么阻止输出很重要?这台机器仅供我使用。
答案1
我看到的唯一主要漏洞是 IPv6。你需要ip6tables
它。如果你的任何服务都监听 IPv6(其中许多服务,包括 ssh,默认监听 IPv6),那么攻击者可以利用它完全绕过你上面的所有规则。当 IPv6 可用时,网络将优先使用 IPv6 而不是 IPv4。
假设您的OUTPUT
策略是DROP
,那么您已经很好地限制了 IPv4。
跳过该RELATED
选项可能意味着当服务关闭并停止监听时,您会遇到超时而不是立即被拒绝的情况,因为据我所知,在这种情况下,数据包都不TCP RST
是。NEW
ESTABLISHED
回答你问题的更新:当不是仅供您使用。
无论我们多么小心谨慎,我们总是有可能错过某些东西,或者一时疏忽大意,让其他人在一定程度上控制我们的机器。一旦攻击者站稳脚跟,他们要做的第一件事就是下载特权提升工具包、rootkit、他们的命令和控制系统以及他们真正想在机器上运行的任何东西。限制出站连接意味着他们无法下载特权提升工具包,这意味着他们只能以 Apache 用户或 Git 用户或他们设法攻击的任何用户身份运行。没有 root 权限,他们就无法隐藏,也无法修改防火墙。这不会永远阻止攻击者,但可能会阻止他足够长的时间,让你注意到他在那里,或者让他感到沮丧,以至于他放弃并去更容易的地方。
上述规则意味着,只有当远程文件托管在 SSL 上时,远程文件包含攻击才会起作用。如果您在此框和互联网之间放置一个代理服务器,并让它只允许某些 URL 模式,则可以阻止 RFI 的踪迹,同时仍允许正常运行。这是纵深防御。
答案2
除了其他人发布的关于缺少OUTPUT
链和重复ESTABLISHED
规则的评论之外,您还可以将 SSH(TCP /端口 22)等协议限制到特定 IP(如果适用)。
要检查您的设置,您可以尝试 NMAP 检查开放端口。如果您的防火墙规则变得更加复杂,这会更有用。
答案3
您应该从 /etc/network/interfaces 中的预设行运行脚本(参见man 5 interfaces
),以便在网络可用和启动服务之前将防火墙规则设置到位。rc.local 是最后运行的程序,因此存在一个不必要的时间窗口,在此期间所有内容均不受保护。
还应该记住,你正在做的这种事情并不是某种灵丹妙药。如果你正在启动其他服务但试图阻止访问,那么你首先就不应该启动它们。如果这里的想法是阻止访问你不打算启动的服务,这是否意味着有不值得信任的人已经在你的机器上做事了?在这种情况下,你已经输了,可以安全地假设,当有恶意用户在你的机器上运行代码时,你的防火墙规则也可能被操纵。
答案4
我开源iptables-样板几天前在 github 上。它本质上是一组很好的预定义 iptable 规则,并且有大量的注释。
也许使用和阅读可以帮助你