要解决此问题,您将需要建立两个 iptables和路由规则。您遇到的特定问题是传出的SSH数据包是通过匿名VPN隧道接口而不是以太网接口路由的。发生这种情况是因为您的VPN软件设置了路由规则,以通过隧道接口发送所有未处理的流量。有利于匿名化网络流量;对建立与计算机的SSH连接不利。
有几种方法可以解决此问题,但是我将与您分享在相同情况下为我工作的一种方法。这是我们需要做的:
- 创建一个新的IP规则表以处理非VPN流量
- 添加IP规则以查找我们的no-VPN表中是否有标有特定netfilter掩码的所有数据包
- 在我们的no-VPN表中添加一个IP路由,该路由将所有流量定向为使用您的以太网接口而不是隧道
- 添加iptables规则,以我们指定的netfilter掩码标记所有SSH流量
注意:在执行以下操作时,我正在与Raspbian一起工作,因此您可能需要稍微调整一些命令以适合您的发行版。
创建一个新的IP规则表
首先检查iproute2的表定义文件。我们要确保我们不使用任何现有规则表的名称或编号。
cat /etc/iproute2/rt_tables
您可能会看到以下内容:
# reserved values
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
为您的新规则表选择任意数字和名称-上面未使用的任何内容。novpn
在此答案的其余部分中,我将使用数字201和名称。
将定义直接附加到定义文件,或在您选择的文本编辑器中对其进行编辑:
echo "201 novpn" >> /etc/iproute2/rt_tables
添加新的IP规则以查找no-VPN表
检查是否有任何现有的处理netfilter掩码的ip规则:
ip rule show | grep fwmark
如果grep没有任何反应,那么您就没有问题了。如果确实打印出一些行,请注意fwmark
每行中单词右侧的十六进制数字。您将需要选择一个当前未使用的号码。由于我没有现有的fwmark规则,因此我选择了数字65。
ip rule add fwmark 65 table novpn
这会导致任何带有netfilter掩码65的数据包查找我们的新novpn
表,以获取有关如何路由数据包的说明。
引导新表中的所有流量使用以太网接口
ip route add default via YOUR.GATEWAY.IP.HERE dev eth0 table novpn
这里要注意的重要一点是dev eth0
。这将强制所有通过novpn
表的流量仅使用硬件以太网接口,而不是您的VPN创建的虚拟隧道接口。
现在是刷新iproute缓存的好时机,以确保新规则和路由立即生效:
ip route flush cache
指示防火墙规则以指定的netfilter掩码标记所有SSH流量
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65
这里有太多可供我深入解释的选择。我强烈建议您阅读iptables手册页,以了解此处的情况:
man iptables
简而言之:我们将输出规则附加到防火墙的mangle表(用于特殊的数据包处理),指示它使用我们指定的netfilter掩码65标记来自源端口22的任何TCP数据包。
接下来是什么?
此时,您应该已经准备好测试SSH。如果一切顺利,您将得到愉快的“登录为”提示。
为了安全起见,建议您指示防火墙丢弃来自隧道接口的所有传入SSH请求:
iptables -A INPUT -i tun0 -p tcp -m tcp --dport 22 -j DROP
请注意,以上所有说明都是暂时的(创建规则表ID除外)-下次重新启动计算机时,它们将被清除。使它们永久化是我留给您的一项练习。