![OpenVPN 运行时无法通过真实 IP 从 WAN SSH 进入 LAN 设备](https://linux22.com/image/1580986/OpenVPN%20%E8%BF%90%E8%A1%8C%E6%97%B6%E6%97%A0%E6%B3%95%E9%80%9A%E8%BF%87%E7%9C%9F%E5%AE%9E%20IP%20%E4%BB%8E%20WAN%20SSH%20%E8%BF%9B%E5%85%A5%20LAN%20%E8%AE%BE%E5%A4%87.png)
我有一台启用了 OpenVPN 的 Ubuntu 设备,并连接到 TP-Link 路由器后面的 LAN 上。以下是已知的信息:
- 在 LAN 内部,我可以直接通过 SSH 进入设备(VPN 已启动或停止)。
- 当在局域网之外并且 OpenVPN 停止时,我可以通过端口转发(WAN 端口 22106)连接到设备。
- 当在 LAN 之外并启动 OpenVPN 时,我无法再通过真实 IP 通过 SSH 进入设备。
- 没什么特别的
iptables -L
,只是 UFW 噪音
当建立 VPN 连接时,有什么想法如何通过真实的 ISP IP(而不是 VPN IP)通过 SSH 进入设备?
解决方案:
这是一个可行的完整解决方案。创建一个虚拟适配器,为其分配一个未使用的相邻 IP,并添加规则和查找表以使用相同的接口来处理出站数据包。此外,将 WAN 端口转发到该新静态 IP 上的设备端口 22。
ip addr add 192.168.0.6 dev eth0:0
ip rule add from 192.168.0.6 table 1234
ip route add default via 192.168.0.1 dev eth0:0 table 1234
先前的尝试:
以下是我在 Stack Exchange 上尝试过的各种解决方案但都失败了。
cat /etc/iproute2/rt_tables
echo 200 isp2 >> /etc/iproute2/rt_tables
## FAILED - Direct ISP IP SSH okay, LAN SSH blocked
ip rule add from 192.168.0.106 table isp2
ip route add default via 192.168.0.1 dev eth0 table isp2
## FAILED - Direct ISP IP SSH okay, LAN SSH blocked
ip rule add from 192.168.0.106 table isp2 priority 900
ip rule add from dev eth0 table isp2 priority 1000
ip route add default via 192.168.0.1 dev eth0 table isp2
ip rule add iif eth0 table isp2 priority 1000
## FAILED - No effect
iptables -A PREROUTING -t mangle -p tcp --dport 222 -j MARK --set-mark 1
ip rule add fwmark 1 table isp2
ip route add default via 192.168.0.1 dev eth0 table isp2
## FAILED - No effect
iptables -t mangle -A OUTPUT -p tcp --dport 222 -o eth0 -j MARK --set-mark 1
ip rule add fwmark 1 table isp2
ip route add 0.0.0.0/0 table isp2 dev eth0
## FAILED - No effect
ip rule add from 192.168.0.106 table isp2
ip route add table isp2 to 192.168.0.106/32 dev eth0
ip route add table isp2 default via 192.168.0.1
## FAILED - No effect
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234
iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321
ip route add default dev eth0 table 3412
ip rule add fwmark 4321 table 3412
## FAILED - Direct ISP IP SSH okay, LAN SSH blocked
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234
iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321
ip route add default via 192.168.0.1 dev eth0 table 3412
ip rule add fwmark 4321 table 3412
## FAILED - Direct ISP IP SSH okay, LAN SSH blocked
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234
iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321
ip route add default via 192.168.0.1 dev eth0 table isp2
ip rule add fwmark 4321 table isp2
更新:更多失败的尝试
## FAILED
iptables -t mangle -A OUTPUT -p tcp --dport 22106 -o eth0 -j MARK --set-mark 1 && \
iptables -t mangle -A OUTPUT -p tcp --dport 222 -o eth0 -j MARK --set-mark 1 && \
iptables -t mangle -A OUTPUT -p tcp --dport 22 -o eth0 -j MARK --set-mark 1 && \
ip rule add fwmark 1 table isp2 && \
ip route add default via 192.168.0.1 dev eth0 table isp2
更新:添加了 sshd (192.168.0.106:22) 和 LAN 计算机 (192.168.0.114) 之间交换的 tcpdump 输出。ACK 数据包正在通过 eth0 发送回,但未到达 .114 计算机。此时我可以从 LAN 外部进行 ssh,但 LAN 内部失败。添加的唯一 ip 规则是:
# WAN SSH okay, LAN SSH fails
ip rule add from 192.168.0.106 table isp2
ip route add default via 192.168.0.1 dev eth0 table isp2
WAN(静态 IP)<--> 路由器 <--> 服务器(192.168.0.106)
尝试路由器转发:
22106/TCP --> 192.168.0.106:22 (same result as above)
22106/TCP --> 192.168.0.106:22106 (same result as above)
ip a
OpenVPN启动时的设备:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:1e:06:36:2b:05 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.106/24 brd 192.168.0.255 scope global dynamic noprefixroute eth0
valid_lft 3068726852sec preferred_lft 3068726852sec
inet6 fe80::a15b:2d6f:2dc9:8892/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.7.0.10 peer 10.7.0.9/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::7d84:a8cc:f96e:6f11/64 scope link stable-privacy
valid_lft forever preferred_lft forever
设备/etc/ssh/sshd_config
(其他均为默认设置并已注释掉):
Port 22
Port 22106
ListenAddress 192.168.0.106:22
ListenAddress 0.0.0.0:22106
AllowAgentForwarding yes
AllowTcpForwarding all
GatewayPorts yes
X11Forwarding yes
PermitTunnel yes
DisableForwarding no
设备netstat -tlpn
:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 455/systemd-resolve
tcp 0 0 0.0.0.0:22106 0.0.0.0:* LISTEN 9312/sshd
tcp 0 0 192.168.0.106:22 0.0.0.0:* LISTEN 9312/sshd
设备ufw status
:
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22106/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
22106/tcp (v6) ALLOW Anywhere (v6)
答案1
以不同的方式重述你的问题:
我可以本地连接到运行 OpenVPN 的服务器。我可以从我的网络外部连接到同一台服务器,因为我设置了端口转发。但是,如果 OpenVPN 正在运行,则任何从我的网络外部连接的尝试都将失败,因为非本地流量的默认路由是沿着隧道的,并且没有本地发起的会话,因此它会被丢弃。我想在我的 vpn 运行时从我的网络外部连接到服务器。
我建议使用虚拟接口。
ifconfig eth0:0 192.168.0.107
(如果这个 IP 在你的局域网上是空闲的)
将在 eth0 上启动虚拟子接口。添加端口转发规则以使用此 IP 并进行测试。现在,无论隧道状态如何,您都应该全局拥有一个管理 IP。
不要忘记使用适合您的 Linux 风格的正确界面配置来坚持它。
答案2
这是意料之中的。当 openvpn 运行时,它会通过 vpn 设置默认路由,因此出站数据包将通过该路由,并且可能会由于大多数提供商运行的出口过滤而被丢弃。
有许多解决方案/解决方法,但没有一个是既简单又强大的。
SSH 到 OpenVPN IP,当然假设这是一个真实的 IP 或端口映射。
在 ssh 服务器上使用基于策略的路由,通过以太网接口路由 ssh 流量
2a. 使用特定(即外部客户端 IP)路由出路由器接口 - 更具体的路由。优先考虑,这样可以工作,但不会流向该 IP 的流量。然后使用 vua VPN。
- 在路由器上添加 VPN 服务器,并让客户端在使用 SSH 之前连接到 VPN。务必通过 VPN 公布 LAN 范围。
更新
我怀疑你的第二条和第三条失败的规则大部分都在那里,只是它们使用了端口 222 而不是端口 22 或端口 22106,并且语法有些错误。我会尝试:
iptables -t mangle -A OUTPUT -p tcp --dport 222106 -o eth0 -j MARK --set-mark 1
ip rule add fwmark 1 table isp2
ip route add default via 192.168.0.1 dev eth0 table isp2