![pfctl 在 NAT 后不中继 SYN、ACK 数据包](https://linux22.com/image/715680/pfctl%20%E5%9C%A8%20NAT%20%E5%90%8E%E4%B8%8D%E4%B8%AD%E7%BB%A7%20SYN%E3%80%81ACK%20%E6%95%B0%E6%8D%AE%E5%8C%85.png)
我正在尝试将 SSH 连接从 LAN 主机中继到 VPN 之外的主机。LAN 中只有一台路由器主机具有 VPN 连接,可供 LAN 中的其他主机重用。
以下是路由器上的 pfctl 配置。
extif = "utun0"
intif = "en1"
set skip on lo0
set ruleset-optimization none
set optimization normal
set timeout { tcp.established 360, tcp.closing 60 }
nat log on $extif from $intif:network to any -> ($extif)
pass in log on $extif from any to any
pass out log on $extif from any to any
pass in log on $intif from any to any
pass out log on $intif from any to any
上面的 utun0 接口(其 IP 地址为 10.66.20.3)是面向 VPN 的接口。
LAN主机IP地址为192.168.1.34。
我尝试通过 SSH 进入的 VPN 之外的主机的 IP 地址为 172.19.13.63。
问题是路由器的 pfctl 仅对 SYN 数据包执行 NAT,但没有向 LAN 主机返回 172.19.13.63 的 SYN ACK 应答。
同时,路由器成功地对来自 LAN 主机的 ICMP 数据包进行了 NAT,即 192.168.1.34 ping 172.19.13.63,并且我在 tcpdump 中看到路由器执行了 NAT。
下面是我从 LAN 主机 (192.168.1.34) 访问 SSH 主机 (172.19.13.63:22) 时执行 sudo pfctl -ss 的结果:ALL tcp 192.168.1.34:50298 -> 10.66.20.3:37149 -> 172.19.13.63:22 ESTABLISHED:SYN_SENT
tcpdump 还确认 SYN ACK 没有被转发回 LAN 主机。
应该在 pfctl 配置文件中进行哪些更改才能使 NAT 正确地为与 VPN 之外的主机的 SSH 连接工作?
下面是wireshark对utun0接口的截图:
以下是 SSH 连接尝试期间 pfctl 中的状态:
$ sudo pfctl -s all | grep "\.34" | grep tcp
ALL tcp 172.19.13.63:22 <- 192.168.1.34:51856 CLOSED:SYN_SENT
ALL tcp 192.168.1.34:51856 -> 10.66.20.3:42525 -> 172.19.13.63:22 ESTABLISHED:SYN_SENT