如何向我的 Iptables 添加 dyndns 别名?

如何向我的 Iptables 添加 dyndns 别名?

首先:我知道这个老问题: iptables 允许 dyndns 域名和自动更新规则 但不知何故,它对我没有帮助。

问题

我工作电脑上的 Iptables 配置为删除所有来自互联网的请求除了少数选定的 IP 地址。这是因为我们每天面临大约 10,000 次攻击。有时我想从家里 ssh 进入我的工作电脑。然而在家里我没有静态 IP

我的解决方案(半工作)

所以我想我注册动态网络/etc/iptables并为该 dynalias添加一条规则myUser.dynalias.net

# in /etc/iptables

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT

-A RH-Firewall-1-INPUT -i lo -j ACCEPT
# namesevers
-A RH-Firewall-1-INPUT -p 50 -d some.local.ip -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -d the.same.local.ip -j ACCEPT
    # ...and so on...
# all connections already established (started outgoing from my machine)
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# allow local connections
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 --source some.local.ip/255.255.0.0 -j ACCEPT
# allow my dns
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 --source myuser.dynalias.net -j ACCEPT
# block all others (without answering - thus nobody is able to scan the network)
-A INPUT -p icmp --icmp-type echo-request -j DROP
-A RH-Firewall-1-INPUT -j DROP
COMMIT

此解决方案的缺陷

这种方法一直有效,直到我家的 IP 每天午夜被重置。所以周末我基本上就没法登录了。我的猜测是,我必须定期更新规则(例如使用 cron)。我的问题是:如何定期更新规则?出于某种原因,当我使用以下命令更新正在运行的系统上的表时:

更新命令(不起作用):

sudo iptables -D RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 --source ip.that's.listed.by.-L.option -j ACCEP
sudo iptables -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 --source myUser.dynalias.net -j ACCEP

更新后,我无法通过 ssh 进入我的工作电脑。唯一有帮助的办法就是打电话让别人重启我的工作电脑。尽管规则列出正确,但如果不重启,更改将不会生效:

username@server:~/bin$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
RH-Firewall-1-INPUT  all  --  anywhere             anywhere            
DROP       icmp --  anywhere             anywhere            icmp echo-request 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
RH-Firewall-1-INPUT  all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

Chain RH-Firewall-1-INPUT (2 references)
# some stuff (e.g. nameserver)
# ....
DROP       all  --  anywhere             anywhere    
ACCEPT     tcp  --  123-123-12-123.host.name.foo.bar.at  anywhere            state NEW tcp dpt:ssh 

在此列表中更新前后无区别根本没法 ssh 进入工作电脑。

答案1

以前,我也遇到过同样的问题,我的解决方案是创建一个模板iptables 规则文件,根据当前 dyndns 检索到的 IP 进行修改,然后使用 设置表iptable-restore。该例程定期测试 IP 并在需要时更新防火墙。

当同事要求使用相同的 ssh 服务器时,我放弃了这种方法,并且为两个 IP 设置系统虽然不是特别困难,但还是让我改变了主意。

我建议用其他方法解决这个问题。

一种常用的方法是使用软件来检测和阻止攻击。例如,fail2ban可以在运行时分析 ssh 日志并使用防火墙规则禁止/取消禁止可疑主机。

另一方面,denyhosts将可疑主机添加到/etc/hosts.deny,达到同样的目的fail2ban

另一个选择是使用第三方公共 ssh 服务器(参见 shellium、blinkensheel 等)作为到达您的个人 ssh 服务器的桥梁,在该服务器中您应该信任公共服务器而不要信任其他服务器,并且该服务器具有静态 IP。

我相信专家们可以提出比我建议的更好的解决方案。

相关内容