因此,我有一台 ubuntu 16.04 服务器,我想使用 ddns iptables 规则将其保护到某些端口。我确实找到了一个脚本并尝试对其进行修改,因为我无法让它工作。脚本如下:
#!/bin/bash
#allow a dyndns name
HOSTNAME=xxx.ddns.xxx
LOGFILE=/home/ddns/Logs/ddns.log
exec > /home/ddns/Logs/ddns_update.log 2>&1
Current_IP=$(host $HOSTNAME | cut -f4 -d' ')
if [ $LOGFILE = "" ] ; then
echo $Current_IP > $LOGFILE
else
Old_IP=$(cat $LOGFILE)
if [ "$Current_IP" = "$Old_IP" ] ; then
echo IP address has not changed
else
iptables -D INPUT -s $Old_IP -p tcp -m tcp --dport 80 -j ACCEPT
iptables -D INPUT -s $Old_IP -p tcp -m tcp --dport 22 -j ACCEPT
iptables -D INPUT -s $Old_IP -p tcp -m tcp --dport 4000 -j ACCEPT
iptables -D INPUT -s $Old_IP -p tcp -m tcp --dport 4001 -j ACCEPT
iptables -D INPUT -s $Old_IP -p tcp -m tcp --dport 4003 -j ACCEPT
iptables -D INPUT -s $Old_IP -p tcp -m tcp --dport 4005 -j ACCEPT
iptables -D INPUT -s $Old_IP -p tcp -m tcp --dport 3000 -j ACCEPT
iptables -D INPUT -s $Old_IP -p tcp -m tcp --dport 30300 -j ACCEPT
iptables -A INPUT -p tcp --src $Current_IP --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --src $Current_IP --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --src $Current_IP --dport 4000 -j ACCEPT
iptables -A INPUT -p tcp --src $Current_IP --dport 4001 -j ACCEPT
iptables -A INPUT -p tcp --src $Current_IP --dport 4003 -j ACCEPT
iptables -A INPUT -p tcp --src $Current_IP --dport 4005 -j ACCEPT
iptables -A INPUT -p tcp --src $Current_IP --dport 3000 -j ACCEPT
iptables -A INPUT -p tcp --src $Current_IP --dport 30300 -j ACCEPT
echo $Current_IP > $LOGFILE
echo iptables have been updated
fi
fi
问题是,带有“旧 IP”的规则不会被删除。我(在日志中)得到的信息如下:
Bad rule (does a matching rule exist in that chain?).
我对 ubuntu 和脚本完全是个新手,因此我认为,我正在监督脚本的问题。
答案1
我注意到的一件事是,你试图一次性编辑很多规则。让我们把这事简单一点。定义你想在单独的规则组中为“ACCEPT”,但只需要将一个项目添加到 INPUT
iptables -N DYN_PORTS_PERMITTED
iptables -A DYN_PORTS_PERMITTED -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A DYN_PORTS_PERMITTED -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A DYN_PORTS_PERMITTED -p tcp -m tcp --dport 4000 -j ACCEPT
iptables -A DYN_PORTS_PERMITTED -p tcp -m tcp --dport 4001 -j ACCEPT
iptables -A DYN_PORTS_PERMITTED -p tcp -m tcp --dport 4002 -j ACCEPT
iptables -A DYN_PORTS_PERMITTED -p tcp -m tcp --dport 4003 -j ACCEPT
iptables -A DYN_PORTS_PERMITTED -p tcp -m tcp --dport 4005 -j ACCEPT
iptables -A DYN_PORTS_PERMITTED -p tcp -m tcp --dport 3000 -j ACCEPT
iptables -A DYN_PORTS_PERMITTED -p tcp -m tcp --dport 30300 -j ACCEPT
iptables -A DYN_PORTS_PERMITTED -j RETURN
这为哪些港口接受在名为“DYN_PORTS_PERMITTED”的备用表中。
保存您的iptables
规则,以便您拥有一组基本规则,并且您可以DYN_PORTS_PERMITTED
在可预见的未来保留该表。
现在,这套规则还没有制定出来,我故意地暂时不考虑源 IP。因为我们将以不同的方式处理它 - 在 INPUT 表中。
首先,删除表中所有独立的端口匹配规则INPUT
。有了表,我们就不再需要它们了DYN_PORTS_PERMITTED
。相反,你只需要这条规则表中INPUT
:
iptables -A INPUT -s IPADDRESS -j DYN_PORTS_PERMITTED
...这条规则会说“如果源 IP 是我们要使用的 IP 地址,那么就获取流量并根据DYN_PORTS_PERMITTED
表中的规则进行检查。
现在,您的脚本只需执行以下操作,而不必处理大量规则:
iptables -D INPUT -s OldIPAddress -j DYN_PORTS_PERMITTED
iptables -A INPUT -s NewIPAddress -j DYN_PORTS_PERMITTED
只需确保它DYN_PORTS_PERMITTED
保留在具有我所述规则的环境中 - 这样您就不需要有单独的规则来处理源 IP 数据,而只需在 DYN_PORTS_PERMITTED 中为流量定义端口匹配规则。然后,您只需在单个 INPUT 规则中更改 IP 地址。
在这种情况下,我假设您有一个默认的 INPUT 规则DROP
,否则您必须巧妙地制定规则。