我正在尝试在我的 20.04 Ubuntu Web 服务器上设置显式允许策略。通过运行以下命令:
iptables -P INPUT DROP
还添加了 ssh、http 和 https 规则。 产生以下规则集:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:https
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
一切按预期运行。但是,当尝试通过 snap 安装 certbot 或克隆 github repo 时。连接被阻止。通过暂时允许所有 INPUT 进行验证:
iptables -P INPUT DROP
我的问题是,我该如何确定要创建哪些 INPUT 规则来支持这些操作?或者将来的任何其他操作?
我知道我可能需要端口号,但我不知道如何确定它是什么。或者是否只需允许来自该源的所有 INPUT(即,https://api.snapcract.io,https://github.com)?
在此先感谢您的帮助。
答案1
您需要允许响应您启动的任何传出会话的数据包。需要此规则:
sudo iptables -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
其中:$EXTIF 是您的接口名称;$UNIVERSE 是 0.0.0.0/0(或省略);$EXTIP 是您的 IP 地址(也可以省略)。
为了帮助确定服务器正常运行可能需要哪些额外的 INPUT 规则,请在控制传递到默认 DROP 策略之前添加一条日志记录规则作为最后的 INPUT 链规则。
sudo iptables -A INPUT -j LOG --log-prefix "INPUT DROP:" --log-level info
请小心,因为它可能会生成大量日志条目。默认情况下,日志条目/var/log/syslog
将以/var/log/kern.log
此外,您没有本地接口 ACCEPT 规则(除非您列出的规则没有接口,请使用sudo iptables -xvnL
)。您需要一个(在上述规则之前):
sudo iptables -A INPUT -i lo -j ACCEPT