IPTables 规则允许传入 SSH 连接

IPTables 规则允许传入 SSH 连接

此脚本的目的是仅允许通过 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 标准添加到上述规则中。该规则需要出现在输出链的最终“删除其他任何内容”规则之前。

相关内容