Openvpn 服务器未将 ping 流量从 tun0 转发到 eth0 以供子网中其余主机使用

Openvpn 服务器未将 ping 流量从 tun0 转发到 eth0 以供子网中其余主机使用

目前我有一个带路由(非桥接)的 openvpn 服务器和客户端设置

当我尝试从客户端 ping 到服务器 IP 地址时,它工作正常。但是当我尝试 ping openvpn 服务器后面的其余子网主机时,它不起作用。有人能发现我的设置中明显有问题吗?(openvpn 服务器位于 10.10.145.181,主机位于 10.10.146.8 IP 地址。它们位于两个独立的子网中。我可以通过 ssh 直接进入该主机从 10.10.145.181 ping 10.10.146.8。只有当我通过 VPN 连接时它才不起作用。)

据我所知,ping 流量通过 tun0 接口到达 vpn 服务器,但 vpn 服务器没有通过 eth0 将其转发到适当的主机,因此 ping 的主机看不到任何流量并且数据包被丢弃。但是什么原因造成的?openvpn 中是否有将流量从 tun0 转发到 eth0 的设置?

以下是我的观察...

在 openvpn 客户端主机上:

> ping 10.10.146.8
PING 10.10.146.8 (10.10.146.8) 56(84) bytes of data.
<no further output>

在 openvpn 服务器主机上:

> sudo tcpdump -i tun0 'icmp[icmptype] = icmp-echo or icmp[icmptype] = icmp-echoreply'
00:34:32.624639 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1863, length 64
00:34:33.634564 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1864, length 64
00:34:34.640753 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1865, length 64
00:34:35.648922 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1866, length 64
00:34:36.659062 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1867, length 64
00:34:37.665402 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1868, length 64
00:34:38.673295 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1869, length 64
00:34:39.685336 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1870, length 64
00:34:40.687703 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1871, length 64
00:34:41.695766 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 1644, seq 1872, length 64
> sudo tcpdump -i eth0 'icmp[icmptype] = icmp-echo or icmp[icmptype] = icmp-echoreply'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
04:14:48.583673 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 4807, seq 442, length 64
04:14:49.592908 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 4807, seq 443, length 64
04:14:50.600010 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 4807, seq 444, length 64
04:14:51.616401 IP 10.10.0.6 > 10.10.146.8: ICMP echo request, id 4807, seq 445, length 64

在我尝试 ping 的子网中的主机(10.10.146.8)上:

> sudo tcpdump -i eth0 'icmp[icmptype] = icmp-echo or icmp[icmptype] = icmp-echoreply'
sudo: unable to resolve host ip-10-10-146-8
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
<no further output>

系统日志(openvpn日志)显示:

Jul  8 00:36:25 ip-10-10-145-181 ovpn-server[1513]: xyz/<ip_address>:35315 UDPv4 READ [133] from [AF_INET]<ip_address>:35315: P_DATA_V1 kid=0 DATA len=132 
Jul  8 00:36:25 ip-10-10-145-181 ovpn-server[1513]: xyz/<ip_address>:35315 TUN WRITE [84]

openvpn 客户端上的 netstat:

10.10.0.1       10.10.0.5       255.255.255.255 UGH       0 0          0 tun0
10.10.0.5       0.0.0.0         255.255.255.255 UH        0 0          0 tun0
10.10.146.0     10.10.0.5       255.255.255.0   UG        0 0          0 tun0

openvpn 服务器上的 netstat:

10.10.0.0       10.10.0.2       255.255.255.0   UG        0 0          0 tun0
10.10.0.2       0.0.0.0         255.255.255.255 UH        0 0          0 tun0
10.10.145.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0

我在 openvpn 服务器配置中有一个语句来从客户端路由流量并且我确实看到了这种情况的发生。

push "route 10.10.146.0 255.255.255.0"

Andrew 问题的附加信息

> echo "sysctl -a | grep 'forwarding = 1'" | sudo -s
error: permission denied on key 'vm.compact_memory'
error: permission denied on key 'net.ipv4.route.flush'
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.lo.forwarding = 1
net.ipv4.conf.eth0.forwarding = 1
net.ipv4.conf.tun0.forwarding = 1
error: permission denied on key 'net.ipv6.route.flush'



> sudo iptables -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         


> sudo iptables -L FORWARD
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

更新:实际上,现在我看到服务器上的 eth0 上有流量,但该流量没有进入网络并被其他主机接收。我认为这是 Amazon VPC 的问题。

答案1

好的,经过几个小时的调查我终于明白了这一点。

问题出在转发设置上。转发到 eth0 端口的数据包没有网络内主机的正确源 IP 地址。该 IP 地址来自 VPN。

05:07:43.991961 IP 10.8.0.6 > 10.10.146.8: ICMP echo request, id 3497, seq 499, length 64

您可以通过在 Linux 操作系统中启用相当于 NAT 的功能(在路由器上)来切换:

iptables -t nat -A POSTROUTING -o <eth0 or whatever else> -j MASQUERADE

这为我解决了这个问题。

答案2

当 LAN 上主机的默认网关不是 OpenVPN 服务器时,可能会发生此问题。在这种情况下,主机需要 VPN 地址的静态路由,以便回复发往 VPN 服务器而不是默认网关。

在 LAN 主机上,检查路由(route print对于 Windows、route -n对于 Linux、ǹetstat -rn对于 Mac)。

答案3

我通过谷歌找到了这个帖子,非常感谢,这个信息很有用。我遇到了完全相同的问题,这个信息部分解决了这个问题。

伪装它,它成功了。但就我的目的而言,这还不够好,也不是我的解决方案,也不是最终答案,我仍在尝试在不使用伪装的情况下转发它。就我的目的而言,单独获取连接是不够的。因为我需要源 IP 来进行日志识别和访问控制。伪装让它连接上了,但却被盲目接受。连接总是看起来像是来自一个虚假的 IP 地址。

我有一个 SQL 服务器,它必须根据通过 VPN 后的源 IP 地址接受/拒绝连接。最好还保留访问 IP 的日志记录,以帮助跟踪错误或防止黑客入侵。

仍然想知道为什么除非伪装,否则 VPN 的这个端点不会发生转发。怀疑是本地防火墙或安全问题造成的。

当您浏览此主题时,请分享一些经验或建议。谢谢。

相关内容