从OpenVPN客户端到服务器故障排除TCP; 但ping,traceroute工作

我正在解决OS X Mavericks上的OpenVPN服务器安装问题。 在10.9升级之前,这一切工作,我试图将问题隔离到基本或我的服务器/客户端设置。

除了VPN服务器本身之外,VPN客户端能够build立TCP连接到整个Internet和LAN上的每个盒子。 此外,VPN客户端能够成功ping和追踪路由服务器,这是一跳。

我很茫然,并会感激任何指针。

我的服务器在10.0.1 / 24接口en0上是10.0.1.3。 我的VPN在tun0的10.8.0 / 24上。 防火墙被禁用,但是必须在基于pf的防火墙上启用NAT,以便客户端访问Internet,这是使用pfctl pf.conf行来完成的,

nat on en0 from { 10.8.0.0/24 10.0.1.0/24 } to any -> (en0) pass all 

在服务器和客户端之间观察到的TCP返回链路断开,是否启用了防火墙,导致我排除了防火墙的原因。 数据包转发使用BSD命令启用:

 /usr/sbin/sysctl -w net.inet.ip.fw.enable=1 /usr/sbin/sysctl -w net.inet.ip.forwarding=1 

看起来VPN没有正确地从服务器通过tun0返回[SYN,ACK]数据包到VPN客户端。 什么会阻止来自VPN客户端的数据包通过tun0接口到达LAN? 到VPN客户端的数据包将在en0上返回,而不是在tun0上,这将中断连接。 下面的示例使用wireshark来捕获tun0和en0上的端口22数据包。 以下是我在wireshark上看到的内容:

 server [10.0.1.3]$ ssh [email protected] # Successful tun0: 10.8.0.1 -> 10.8.0.10 ssh [SYN] 10.8.0.10 ssh -> 10.8.0.1 [SYN,ACK] 10.8.0.1 -> 10.8.0.10 ssh [ACK] ... en0: <No packets> iPhone [10.8.0.10]$ ssh [email protected] # Unsuccessful tun0: 10.8.0.10 -> 10.0.1.3 ssh [SYN] 10.8.0.10 [TCP Retransmission] -> 10.0.1.3 ssh [SYN] 10.8.0.10 [TCP Retransmission] -> 10.0.1.3 ssh [SYN] 10.8.0.10 [TCP Retransmission] -> 10.0.1.3 ssh [SYN] 10.8.0.10 [TCP Retransmission] -> 10.0.1.3 ssh [SYN] ... en0: 10.0.1.3 ssh -> 10.8.0.10 [SYN,ACK] 10.0.1.3 [TCP Retransmission] ssh -> 10.8.0.10 [SYN,ACK] 10.0.1.3 [TCP Retransmission] ssh -> 10.8.0.10 [SYN,ACK] 10.0.1.3 [TCP Retransmission] ssh -> 10.8.0.10 [SYN,ACK] 10.0.1.3 [TCP Retransmission] ssh -> 10.8.0.10 [SYN,ACK] 10.0.1.3 [TCP Retransmission] ssh -> 10.8.0.10 [SYN,ACK] ... 

我正在通过“ networking故障排除工具 ”一书试图追踪这个问题。 它的第一个使用netstat的例子显示了一个如下所示的路由表,其中172.16.2.1和172.16.2.255地址的显式分辨率。

 bsd1# netstat -rn Routing tables Internet: Destination … 172.16.1/24 172.16.2.1 xl1 172.16.2/24 link#2 xl1 172.16.2.1 0:10:7b:66:f7:62 xl1 172.16.2.255 ff:ff:ff:ff:ff:ff xl1 

但是我的tun0的实际路由表如下所示:

 server$ netstat -rn default 10.0.1.1 UGSc 157 21721 en0 … 10.8/24 10.8.0.2 UGSc 1 6 tun0 10.8.0.2 10.8.0.1 UH 2 0 tun0 

在tun0接口上没有任何显式的10.8.0.1或10.8.0.255 – 应该有吗? 如果是这样,那么我怎么加这个路线呢? 难道这就是为什么从服务器返回的数据包在默认的en0接口上被发回?

任何指针将不胜感激。

正如您在最后一条评论中正确指出的那样,这是一个路由问题。 我有一个类似的情况,我希望所有的OpenVPN客户端(在我的情况下,networking10.8.0.0/24在tun0)NAT编辑(或伪装)的en0接口(在我的情况下172.16.172.2/24)的地址我的OpenVPN服务器访问本地networking时172.16.172.0/24

症状是,我可以访问172.16.172.0/24networking上的所有主机,但不能访问172.16.172.2本身,我不得不通过它的tun0接口地址返回到OpenVPN服务器,但问题困扰了我。

经过大量的尝试和错误,我find了解决办法。 在pf.conf中的下面的传递行将确保从VPNnetworking到VPN接口到达OpenVPN服务器的内部接口的数据包在VPN接口上被路由回去。 还请注意我的天然线 – 我本质上是防止NAT,如果stream量的目的地是内部接口。

 int_if="en0" vpn_if="tun0" vpnnet="10.8.0.0/24" no nat on ! $vpn_if from $vpnnet to ($int_if) nat on ! $vpn_if from $vpnnet to any -> ($int_if) pass in log quick on $vpn_if reply-to $vpn_if from $vpnnet to $int_if