在具有活动OpenVPN客户端的服务器上允许使用SSH

我有一个运行CentOS 7的VPS,我使用SSH连接。 我想在VPS上运行OpenVPN客户端,以便通过VPN路由互联网stream量,但仍然允许我通过SSH连接到服务器。 当我启动OpenVPN时,我的SSH会话被断开,我不能再连接到我的VPS。 如何configurationVPS以允许在VPS的实际IP(104.167.102.77)上打开传入的SSH(端口22)连接,但是仍然通过VPN路由传出stream量(如从VPS上的Web浏览器)?

我使用的OpenVPN服务是PrivateInternetAccess,示例config.ovpn文件是:

 客户
 dev tun
原始udp
远程nl.privateinternetaccess.com 1194
 resolv-retry无限
 nobind
坚持键
坚持-TUN
 ca ca.crt
 TLS客户端
 remote-cert-tls服务器
 AUTH-用户通
 COMP-LZO
动词1
 reneg-sec 0
 crl-verify crl.pem

VPS的ip地址:

  1:lo:mtu 65536 qdisc noqueue state UNKNOWN
    链接/回放00:00:00:00:00:00 brd 00:00:00:00:00:00
     inet 127.0.0.1/8作用域主机lo
       永远永远的preferred_lft永久valid_lft
     inet6 :: 1/128作用域主机
       永远永远的preferred_lft永久valid_lft
 2:ens33:mtu 1500 qdisc pfifo_fast状态UP qlen 1000
     link / ether 00:50:56:be:16:f7 brd ff:ff:ff:ff:ff:ff
     inet 104.167.102.77/24 brd 104.167.102.255范围全球ens33
       永远永远的preferred_lft永久valid_lft
     inet6 fe80 :: 250:56ff:febe:16f7 / 64范围链接
       永远永远的preferred_lft永久valid_lft
 4:tun0:mtu 1500 qdisc pfifo_fast状态UNKNOWN qlen 100
    链接/无
     inet 10.172.1.6 peer 10.172.1.5/32 scope global tun0
       永远永远的preferred_lft永久valid_lft

VPS的ip路由:

  0.0.0.0/1通过10.172.1.5 dev tun0
默认通过104.167.102.1 dev ens33原始静态度量1024
 10.172.1.1通过10.172.1.5 dev tun0
 10.172.1.5 dev tun0 proto内核作用域链接src 10.172.1.6
 104.167.102.0/24 dev ens33 proto kernel scope link src 104.167.102.77
 109.201.154.177 via 104.167.102.1 dev ens33
 128.0.0.0/1通过10.172.1.5 dev tun0 

我有一个类似的问题,并已尝试在此论坛post中描述的修复。

这个想法是,当你连接到你的公共IP地址时,返回的数据包将通过VPN路由。 您需要强制这些数据包在您的公共接口上路由。

这些路由命令将有希望的伎俩:

ip规则从xxxx表128添加

ip route add table 128 to yyyy / y dev ethX

IP路由添加表128默认通过zzzz

其中xxxx是您的公网IP,yyyy / y应该是您的公网IP地址的子网,ethX应该是您的公网以太网接口,zzzz应该是默认网关。

请注意,这不适用于我(使用Debian和PrivateInternetAccess),但可能会帮助你。

这可能有点晚,但…

问题是,OpenVPN修改了默认网关,除非您在启动OpenVPN之前设置了合适的路由,否则这会打破当前的SSH连接。

以下为我的作品。 它使用iptables和ip(iproute2)。 下面假设OpenVPN之前的默认网关接口是“eth0”。 我们的想法是确保在连接到eth0时,即使eth0不再是默认的网关接口,连接的响应数据包又会在eth0上返回。

您可以使用相同的号码作为连接标记,防火墙标记和路由表。 我使用不同的数字来使它们之间的区别更加明显。

 # set "connection" mark of connection from eth0 when first packet of connection arrives sudo iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234 # set "firewall" mark for response packets in connection with our connection mark sudo iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321 # our routing table with eth0 as gateway interface sudo ip route add default dev eth0 table 3412 # route packets with our firewall mark using our routing table sudo ip rule add fwmark 4321 table 3412 

===

更新:

Debian Jessie上面的工作很好。 但是在一个较旧的Wheezy系统中,我刚刚发现我需要在路由表项中添加“via”

 # our routing table with eth0 as gateway interface sudo ip route add default dev eth0 via 12.345.67.89 table 3412 

有“12.345.67.89”必须是原来的非VPN网关。

嗯听起来像IP子网重叠….不知道更多关于你的IPscheme,除了公共IP作为nl.privateinternetaccess.com您的VPNterminal,不能确定。

因此,例如,如果nl.privateinternetaccess.com另一端的远程子网是10.32.43.0/24,而您的实例位于子网为10.32.44.0/24的aws vpc中。 但你的源ssh客户端生活在10.32.43.0/24(你aws vpc的一边),它不会工作,因为返回sshstream量将被错误地通过vpn推到荷兰。

提供完整的IP /子网信息,以获得更多的帮助。

好吧,所以…看起来像你的默认路由是在隧道中,连接到nl后:

0.0.0.0/1通过10.172.1.5 dev tun0

所以你可以在连接后改变它。 很多时候VPN服务器给你虚假的路线。 特别是在马厩里。 在这种情况下,他们正在推送一个默认路由给你,所以从VPS框的所有stream量都将nl。 更改默认路由到104.167.102.x或任何你的子网网关是你的VPS提供商。