使用 iptables,我需要阻止服务器上的所有出站流量,但以下情况除外:
- SSH 访问少量 IP 地址
- 对同一组 IP 地址进行 HTTPS 访问
有人能给我展示一套合适的规则吗?
谢谢。
答案1
iptables -I OUTPUT -d <remote_ip> -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -s <remote_ip> -p tcp --sport 22 -j ACCEPT
iptables -I OUTPUT -d <remote_ip> -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -s <remote_ip> -p tcp --sport 443 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
您需要为每个 IP 输入前 4 条规则。但请注意,因为您必须通过此计算机上的控制台登录;所有其他访问都将被阻止。
答案2
现在我了解了你的问题的背景,请尝试:
iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 8.8.8.8 --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -s 8.8.8.8 --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp -s 10.11.12.13/24 --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -s 10.11.12.13/24 --dport 443 -j ACCEPT
等等。这将设置默认策略为 DROP,然后仅允许列出的 IP 地址(或范围)访问。第二行允许相关流量(例如正在进行的 SSH 会话的出站数据包),第三和第四个示例用于 DNS 查找。
不要忘记您需要与第 2 行类似的 INPUT 规则。
答案3
上述帖子将实现阻止除 SSH 和 HTTPS 之外的所有传出流量,但它们不会满足您上面(在评论中)提出的目标:
我希望通过 SSH 登录的用户无法从这台机器发送数据。
考虑以下情况:如果我可以通过 SSH 访问您的设备,我可以使用 SSH 隧道将任何数据上传到不受信任的位置,并通过您允许传出流量的目的地之一进行传输。因此,如果您希望敏感数据不会以任何方式复制到网络之外,我认为仅通过在包含敏感数据的主机上设置 iptable 规则无法解决问题。