首先:我知道这个老问题: 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。
我相信专家们可以提出比我建议的更好的解决方案。