匿名化 OpenVPN 允许 SSH 访问内部服务器

Lio*_*nel 10 vpn ssh openvpn

我正在使用匿名 VPN,但希望通过 SSH 访问内部计算机。

如何通过 SSH 访问我的内部计算机?当我执行ssh 98.123.45.6 时,连接超时。

  • 来自有线电视提供商的 IP 地址:98.123.45.6
  • 通过 VPN 的匿名 IP:50.1.2.3
  • 内部电脑:192.168.1.123

在四处搜索时,我发现建议设置 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 连接。

有几种方法可以解决此问题,但我将与您分享在相同情况下对我有用的方法。这是我们需要做的:

  1. 创建一个新的 IP 规则表来处理非 VPN 流量
  2. 添加 IP 规则以查找我们的 no-VPN 表,以查找任何标有特定网络过滤器掩码的数据包
  3. 添加一个 IP 路由,引导我们的 no-VPN 表中的所有流量使用您的以太网接口而不是隧道
  4. 添加 iptables 规则以使用我们指定的 netfilter 掩码标记所有 SSH 流量

注意:我在执行以下操作时使用 Raspbian,因此您可能需要稍微调整命令以适合您的发行版。

创建新的 IP 规则表

首先检查 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)

添加新的 IP 规则以查找 no-VPN 表

检查处理 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)

指示防火墙规则使用指定的 netfilter 掩码标记所有 SSH 流量

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 的创建)——它们将在您下次重新启动计算机时清除。让它们永久化是我留给你的练习。