我有一个虚拟专用服务器,我想在我的服务器连接到 VPN 服务时运行 Web 服务器
当与我的提供商的 VPN 连接未建立时,我可以使用此服务器执行任何操作:ssh、scp、http 等。
一旦 openvpn 运行并连接到提供商的 VPN 服务,服务器就无法以任何方式访问,当然这是有充分理由的
图片是这样的:
My VPS ------------
+----------------+ / \
| | / Internet / 101.11.12.13
| 50.1.2.3|-----------------\ cloud /----<--- me@myhome
| | / \
| 10.80.70.60| / \
+----------------+ \ \
: \_____________/
: :
: :
: :
: :
+------------------+ :
| 10.80.70.61 | :
| \ | :
| \ | :
| 175.41.42.43:1197|..............:
| 175.41.42.43:yy|
| ..... |
| 175.41.42.43:xx|
+------------------+
Legend
------ Line No VPN connection present
...... Line VPN connection established
需要澄清的事情:
- 上面和下面的所有IP地址和端口号都是虚构的
- 带有端口号 xx、yy 以及介于两者之间的任何内容的行是我的假设,而不是我所知道的事实。
- 我设置了一个 cron 作业,每分钟运行一次 ping 我的另一个 VPS,运行 apache2 在 apache2 日志中,我可以看到当 VPN 处于活动状态时,原始 IP 地址从 50.1.2.3 更改为 175.41.42.43,因此 VPN 工作正常
OpenVPN 日志显示这些:
UDPv4 link remote: [AF_INET]175.41.42.43:1197
[ProviderName] Peer Connection Initiated with [AF_INET]175.41.42.43:1197
TUN/TAP device tun0 opened
do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 local 10.80.70.60 peer 10.80.70.61
此时,我希望能够在 VPN 已启动并使用 PuTTY 的情况下从图片中myhome
的ssh 到 。My VPS
过去,在我的一个工作场所,我收到了一个非常奇怪的序列,用于 ssh 进入一台极其安全的服务器,该服务器的@
字符串中有三个标志。因此,正如我想象的那样,它从一个盒子跳到另一个盒子,但由于跳盒运行的是某些版本的 Windows 操作系统以及其上的专有应用程序,因此我无法看到幕后发生的情况。所以我没有太注意。现在我开始意识到,我可能也处于同样或相似的情况。
使用图表和/或日志片段中的 IP 地址和端口,有人可以告诉我如何穿越此隧道并访问我的服务器吗?
答案1
您会被锁定在 VPS 之外,因为一旦 VPN 服务启动,您的 ssh 数据包将通过 VPN 而不是 VPS 的公共 IP 50.2.1.3 进行路由。
让我们假设您的服务器:
- 公共IP是50.1.2.3(根据您的示例设置)
- 公共IP子网是50.1.2.0/24
- 默认网关可能是 50.1.2.1
- eth0 是设备到网关
使用 iproute2 执行以下操作:
ip rule add table 128 from 50.1.2.3
ip route add table 128 to 50.1.2.0/24 dev eth0
ip route add table 128 default via 50.1.2.1
然后运行您的 OpenVPN 客户端配置:openvpn --config youropenvpn-configfile.ovpn &
然后,当您的服务器连接到 VPN 服务时,您将能够通过 ssh 登录到您的服务器。
您需要添加适当的 iptable 过滤器来限制非 ssh:22 会话对您的公共 IP 的访问。
要详细了解这些命令,请参阅相关答案。
答案2
这可能有点晚了,但是......
问题是默认网关会被 OpenVPN 更改,这会中断您当前的 SSH 连接,除非您在启动 OpenVPN 之前设置适当的路由。
以下内容对我有用。它使用 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网关。
答案3
此外六氯代苯回答,如果您想让这些更改在重新启动后永久生效,您可以使用以下网络管理器命令:
nmcli connection modify ens192 +ipv4.routing-rules "priority 100 from 50.1.2.3 table 128"
nmcli connection modify ens192 +ipv4.routes "0.0.0.0/0 50.1.2.1 table=128, 50.1.2.0/24 onlink=true table=128"
第一行是创建rule
,第二行创建两者routes
。请注意,这0.0.0.0/0
相当于default
原始答案中的
答案4
假设您有一台连接到 OpenVPN 主机的客户端 PC。
对于通过 VPN 隧道的 SSH:https://askubuntu.com/questions/1069846/connected-to-openvpn-server-but-cant-ssh
在 OpenVPN 主机上:
$ sudo ufw启用
$ sudo ufw允许1194/udp注释“允许OpenVPN连接”
$ sudo ufw允许从10.8.0.1/24到任何端口22 proto tcp注释“允许VPN客户端使用SSH”
在客户端:
确保 OpenSSH 已安装并正在运行,并且端口 22 在防火墙上打开。
然后: $ ssh[电子邮件受保护] (将“用户”更改为您在服务器/主机上的登录名)。