是否可以通过开放的 VPN 连接路由 VPS [Ubuntu] SSH 服务,但允许所有其他数据通过公共地址退出?需要使用什么样的 iptables 魔法才能实现这一目标?
SSH 数据 → 通过 OPEN VPN 所有其他数据 → 通过 Public
这是连接 VPN 之前的 ifconfig 详细信息
eth0 Link encap:Ethernet HWaddr 52:54:00:32:2a:e6
inet addr:18x.144.31.77 Bcast:185.144.31.255 Mask:255.255.254.0
inet6 addr: 2a03:a0e0:bad:bad::574/128 Scope:Global
inet6 addr: 2a03:a0e0:bad:bad::573/128 Scope:Global
inet6 addr: 2a03:a0e0:bad:bad::572/128 Scope:Global
inet6 addr: 2a03:a0e0:bad:bad::571/128 Scope:Global
inet6 addr: 2a03:a0e0:bad:bad::570/64 Scope:Global
inet6 addr: fe80::5054:ff:fe32:2ae6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:73928 errors:0 dropped:1 overruns:0 frame:0
TX packets:723 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4508581 (4.5 MB) TX bytes:95511 (95.5 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:25 errors:0 dropped:0 overruns:0 frame:0
TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2520 (2.5 KB) TX bytes:2520 (2.5 KB)
连接到VPN后
eth0 Link encap:Ethernet HWaddr 52:54:00:32:2a:e6
inet addr:185.144.31.77 Bcast:185.144.31.255 Mask:255.255.254.0
inet6 addr: 2a03:a0e0:bad:bad::574/128 Scope:Global
inet6 addr: 2a03:a0e0:bad:bad::573/128 Scope:Global
inet6 addr: 2a03:a0e0:bad:bad::572/128 Scope:Global
inet6 addr: 2a03:a0e0:bad:bad::571/128 Scope:Global
inet6 addr: 2a03:a0e0:bad:bad::570/64 Scope:Global
inet6 addr: fe80::5054:ff:fe32:2ae6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3749 errors:0 dropped:0 overruns:0 frame:0
TX packets:381 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:282634 (282.6 KB) TX bytes:60862 (60.8 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.2.62 P-t-P:10.8.2.61 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:65 errors:0 dropped:0 overruns:0 frame:0
TX packets:62 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:7025 (7.0 KB) TX bytes:16197 (16.1 KB)
答案1
iptables 的替代方案:使用网络命名空间。作为 root,做类似的事情
ip addr show dev tun0
ip netns add vpnssh
ip link set tun0 netns vpnssh
ip netns exec vpnssh su -c 'xterm &' user_name
其中tun0
是 OpenVPN 端点的网络接口和user_name
运行 的用户ssh
。请注意 的 inet(我们称之为vpn_local_ip
)和对等点 ( vpn_peer_ip
) 地址tun0
。
您现在有一个 xterm,其中所有子进程只能“看到” tun0
(使用 验证ip link
),但不幸的是,移动它会将其放下。所以在这个窗口中,sudo
使用
ip link set tun0 up
ip addr add vpn_local_ip peer vpn_peer_ip dev tun0
ip route del default
ip route add default via vpn_local_ip dev tun0
您现在可以ssh
在此窗口中运行,它将使用 OpenVPN 连接。根据需要编写所有内容的脚本(用于ip netns exec vpnssh ...
第二部分)。