我正在使用 Ubuntu 16.04 LTS 安装一个全新的 VPS(来自 linode.com,如果重要的话)。我为 iptables 编写了以下脚本:
#!/bin/sh
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
该脚本应仅允许 22、80 和 443。它还允许传出 DNS 解析。
我以root身份创建并命名了这个脚本iptables.sh
然后把它放进去/etc/network/if-pre-up.d
。我也这么做了chmod +x
。
现在,重启后,这个脚本似乎没有被应用。我通过执行来验证这一点iptables -S
,结果如下:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
我该如何继续?我现在很困惑。
更新
我不知道为什么,但在重命名为 后uptables.sh
,iptables
重启后我无法再登录我的服务器。这让我想到现在脚本在启动过程中实际上已经执行(当它具有.sh
文件扩展名时,为什么没有执行?)并且我的脚本中存在错误。我太困惑了。
答案1
NEW 是单独的,RELATED、ESTABLISHED 是一起的。当您通过 ssh 连接时,目标可能是端口 22,但源端口是随机的,这就是为什么输出中的规则 #2 确实按预期运行。
iptables -I INPUT 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I OUTPUT 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
一旦这些规则到位,您的 DNS 请求将成为 RELATED、ESTABLISHED 流量的一部分,并且您可以删除端口 53 引用。