此脚本的目的是仅允许通过 VPN 的流量,但 localhost<->localhost 和传入 SSH 流量除外。但是当我通过 SSH 运行脚本时,我会断开连接并被迫重新启动虚拟机。我的脚本有什么问题吗?
#!/bin/bash
iptables -F
#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT
#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
答案1
您的#SSH
规则意味着 ssh 是一种单向通信形式,但事实并非如此。数据正在发送中和后退。
由于您无法提前知道客户端的端口号,因此处理此问题的正常方法是允许被视为的连接“成立”或“相关”到已建立的连接。为此,您需要:
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
在DROP
规则之前(最好在顶部,因为规则是按顺序处理的,并且这两个规则将适用于大多数数据包)。
有关于 TCP 连接如何变为 ESTABLISHED 的解释这里;本质上,服务器回复您的规则允许的数据包这一事实#SSH
INPUT
使得情况如此。
答案2
输出链负责任何数据包出去。
您的脚本仅允许出站数据包发送至隧道接口、本地主机和位于 123.123.123.123 的远程主机。
如果您连接到服务器的方式要求 SSH 守护程序将数据包发送到上述目的地之一以外的目的地,则流量将不会被允许出去。
要允许从 SSH 守护程序到 SSH 客户端的出站数据包,您需要添加以下规则:
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
如果您仅从单个位置进行连接,您可能还需要将目标 IP 标准添加到上述规则中。该规则需要出现在输出链的最终“删除其他任何内容”规则之前。