我正在使用匿名 VPN,但希望通过 SSH 访问内部计算机。
如何通过 SSH 访问我的内部计算机?当我执行ssh 98.123.45.6 时,连接超时。
在四处搜索时,我发现建议设置 iptables 规则、路由规则或将 ListenAddress 添加到 sshd_config。其中哪些适用于我的情况?
这是我的路线:
内核IP路由表 目标网关 Genmask Flags Metric Ref Use Iface 10.115.81.1 10.115.81.9 255.255.255.255 UGH 0 0 0 tun0 10.115.81.9 * 255.255.255.255 UH 0 0 0 tun0 50.1.2.3-sta ddwrt 255.255.255.255 UGH 0 0 0 eth0 192.168.1.0 * 255.255.255.0 U 202 0 0 eth0 169.254.0.0 * 255.255.0.0 U 204 0 0 vboxnet0 环回 * 255.0.0.0 U 0 0 0 lo 默认 10.115.81.9 128.0.0.0 UG 0 0 0 tun0 128.0.0.0 10.115.81.9 128.0.0.0 UG 0 0 0 tun0 默认 ddwrt 0.0.0.0 UG 202 0 0 eth0
小智 15
要解决此问题,您将需要建立两个iptables和路由规则。您遇到的具体问题是传出的 SSH 数据包是通过匿名 VPN 隧道接口而不是以太网接口路由的。发生这种情况是因为您的 VPN 软件设置了路由规则以通过隧道接口发送任何和所有未处理的流量。适合匿名化您的网络流量;不利于与您的计算机建立 SSH 连接。
有几种方法可以解决此问题,但我将与您分享在相同情况下对我有用的方法。这是我们需要做的:
注意:我在执行以下操作时使用 Raspbian,因此您可能需要稍微调整命令以适合您的发行版。
首先检查 iproute2 的表定义文件。我们要确保不使用任何现有规则表的名称或编号。
cat /etc/iproute2/rt_tables
Run Code Online (Sandbox Code Playgroud)
您可能会看到以下内容:
# reserved values
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
Run Code Online (Sandbox Code Playgroud)
为您的新规则表选择一个任意数字和名称——上面没有使用的任何内容。我将novpn
在本答案的其余部分使用数字 201 和名称。
将定义直接附加到定义文件或在您选择的文本编辑器中编辑它:
echo "201 novpn" >> /etc/iproute2/rt_tables
Run Code Online (Sandbox Code Playgroud)
检查处理 netfilter 掩码的任何现有 ip 规则:
ip rule show | grep fwmark
Run Code Online (Sandbox Code Playgroud)
如果 grep 什么也没出现,你就清楚了。如果它确实打印了一些行,请记下fwmark
每行中单词右侧的十六进制数。您需要选择一个当前未使用的号码。由于我没有现有的 fwmark 规则,我选择了数字 65。
ip rule add fwmark 65 table novpn
Run Code Online (Sandbox Code Playgroud)
这会导致任何具有 netfilter 掩码 65 的数据包查找我们的新novpn
表以获取有关如何路由数据包的说明。
ip route add default via YOUR.GATEWAY.IP.HERE dev eth0 table novpn
Run Code Online (Sandbox Code Playgroud)
这里要注意的重要一点是dev eth0
。这会强制通过该novpn
表的所有流量仅使用硬件以太网接口,而不是您的 VPN 创建的虚拟隧道接口。
现在是刷新 iproute 缓存的好时机,以确保您的新规则和路由立即生效:
ip route flush cache
Run Code Online (Sandbox Code Playgroud)
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65
Run Code Online (Sandbox Code Playgroud)
这里有太多的选择让我无法深入解释。我强烈建议您阅读 iptables 的手册页以了解这里发生的事情:
man iptables
Run Code Online (Sandbox Code Playgroud)
简而言之:我们将一个输出规则附加到防火墙的 mangle 表(用于专门的数据包处理),指示它使用我们指定的 netfilter 掩码 65 标记源自源端口 22 的任何 TCP 数据包。
此时,您应该准备好测试 SSH。如果一切顺利,您应该会看到愉快的“登录身份”提示。
为了安全起见,我建议您指示防火墙丢弃来自隧道接口的任何传入 SSH 请求:
iptables -A INPUT -i tun0 -p tcp -m tcp --dport 22 -j DROP
Run Code Online (Sandbox Code Playgroud)
请注意,上述所有指令都是暂时的(除了规则表 ID 的创建)——它们将在您下次重新启动计算机时清除。让它们永久化是我留给你的练习。