我有一个运行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提供商。