iptables 脚本更新 dyndns ip

iptables 脚本更新 dyndns ip

因此,我有一台 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,否则您必须巧妙地制定规则。

相关内容