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

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

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

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

在四处search时,我发现build议要设置iptables规则,路由规则或将ListenAddress添加到sshd_config。 哪些适用于我的情况?

这是我的路线

内核IP路由表
目标网关Genmask标志度量参考使用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
 loopback * 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

要解决这个问题,你需要设置iptables和路由规则。 您遇到的具体问题是,传出的SSH数据包将通过您的匿名VPN通道接口而不是您的以太网接口进行路由。 这是因为您的VPN软件设置了一个路由规则,通过隧道接口发送任何和所有未处理的stream量。 很好的匿名您的networkingstream量; 不适合build立SSH连接到您的计算机。

有几种方法可以解决这个问题,但是我会和你们分享一个在相同情况下为我工作的方法。 以下是我们需要做的事情:

  1. 创build一个新的IP规则表来处理非VPNstream量
  2. 添加一个IP规则来查找我们的非VPN表,用于标记特定netfilter掩码的任何数据包
  3. 添加一个IP路由,它将指导我们的非VPN表中的所有stream量使用您的以太网接口而不是隧道
  4. 添加一个iptables规则来标记所有的SSHstream量与我们指定的netfilter掩码

注意:我正在和Raspbian一起做下面的工作,所以你可能需要调整一些命令来适合你的发行版。

创build一个新的IP规则表

首先检查iproute2的表定义文件。 我们要确保我们不使用任何现有规则表的名称或编号。

cat /etc/iproute2/rt_tables 

您可能会看到以下内容:

 # reserved values 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 

为新的规则表select一个任意的数字和名称 – 上面没有使用的东西。 我将使用数字201和名称novpn为这个答案的其余部分。

将定义直接附加到定义文件或在您select的文本编辑器中进行编辑:

 echo "201 novpn" >> /etc/iproute2/rt_tables 

添加一个新的IP规则来查找无VPN表

检查处理netfilter掩码的任何现有的ip规则:

 ip rule show | grep fwmark 

如果grep什么都没有,那么你就清楚了。 如果确实打印了一些行,请记下每行中fwmark单词右侧的hex数字。 您将需要select一个当前未使用的号码。 由于我没有现有的fwmark规则,我select了65号。

 ip rule add fwmark 65 table novpn 

这样做会导致带有netfilter掩码65的任何数据包查找我们的新novpn表以获取如何路由数据包的说明。

将新表中的所有stream量都指向以太网接口

 ip route add default via YOUR.GATEWAY.IP.HERE dev eth0 table novpn 

这里要注意的重要的事情是dev eth0 。 这将强制所有通过novpn表的stream量只使用硬件以太网接口,而不是VPN创build的虚拟隧道接口。

现在将是刷新iproutecaching的好时机,以确保您的新规则和路线立即生效:

 ip route flush cache 

指示防火墙规则用指定的netfilter掩码标记所有的SSH通信

 iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65 

这里有太多的select可供我深入解释。 我强烈build议您阅读iptables的手册页,以了解这里发生了什么:

 man iptables 

简而言之,我们将一个输出规则附加到防火墙的mangle表(用于专门的数据包处理),指示它将标记来自源端口22的任何TCP数据包与我们指定的netfilter掩码65进行标记。

接下来是什么?

在这一点上,你应该准备好testingSSH。 如果一切顺利的话,你应该会遇见快乐的“login as”提示符。

为了安全起见,我build议您指示您的防火墙删除来自隧道接口的任何传入SSH请求:

 iptables -A INPUT -i tun0 -p tcp -m tcp --dport 22 -j DROP 

请注意,上述所有说明都是暂时的(创build规则表ID除外) – 下次重新启动计算机时,它们将被清除。 让他们永久是我留给你的一个练习。