我有一个连接到远程 OpenVPN 服务器的 OpenVPN 客户端。我还使用 NAT(Masquerade),这样客户端后面的 LAN 就可以访问服务器后面的 LAN。
---------------- ---------------- --------------- ------------------
| Client LAN | <--> |OpenVPN Client| <--> |OpenVPN Server| <--> | Server Lan |
|192.168.1.0/24| | 10.9.0.82 | | 10.9.0.1 | | 172.31.0.0/20 |
---------------- ---------------- ---------------- -----------------
伪装:iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o tun0 -j MASQUERADE
一切运行良好(大多数时候)。
当我执行某些操作时,我认为发送大数据包时会出现这种情况。连接冻结。
例如:如果我在客户端 LAN 中打开 FileZilla 并通过 SSH 连接到服务器(在 LAN 服务器中)。它可以正常工作,我可以浏览、查看和传输小文件,但如果文件很大(> 20kb),它就会冻结。
一开始我以为可能是 MTU 问题或者别的什么问题,我尝试了几种方法(mssfix、fragment……)但都没有用。
但问题是,如果我连接到 OpenVPN 服务器(通过 SSH)并尝试传输文件。如果我连接到 IP 10.9.0.1,它就可以工作,但如果我使用 172.*,它就会冻结。
由于两者都是同一台服务器,只是由于接口而具有不同的 IP 并且通过相同的路径传输,所以我认为这不再是 MTU 问题。
我还认为这可能与 TSO 或 LRO 有关。因为我在 OpenVPN 客户端节点上监控了数据包(使用 Wireshark),它显示一些数据包大于 MTU。我认为操作系统可能正在创建一个大数据包,而 OpenVPN 无法正确处理它。但它也没有用。
在数据包跟踪中,我还可以看到很多“未捕获 TCP 上一个段”和“TCP 确认未见段”。因此数据包已发送,但没有确认。它继续尝试发送,直到 TCP 窗口已满,它才会重新传输(我认为,根据我的分析)...
我并没有被困住。
答案1
我的分析错了。这与 OpenVPN、Masquerade 无关……
在我的客户端 LAN 中,有一个具有非对称路由的 pfSense。
在状态超时(TCP 打开)之后,pfSense 正在终止状态,因为它是从另一条路径路由的,因此没有“答案”,从而导致连接冻结。
我改变了网络拓扑以使路由对称并且它起作用了。