我有三台机器正在尝试通过 TUN 连接进行协调。
FREEBSD
在 VPN 上
的本地子网 10.0.202.1/24 上运行 OpenVPN 服务器 (tun) 10.0.200.21/24 的盒子
REMOTE
VPN 上的 公有 IP 10.0.202.6/24
WEBSERVER
本地子网上的 10.0.200.31/24
我可以通过 OpenVPN 连接REMOTE
到 VPN FREEBSD
,连接正常,但配置不正确。当我尝试通过在的浏览器中输入 的 IP 地址从 连接REMOTE
到 时,无法访问。如果我直接连接到本地子网,则可以访问。WEBSERVER
WEBSERVER
REMOTE
WEBSERVER
REMOTE
我在排除故障时了解到了以下内容。
REMOTE
可以 ping 通FREEBSD
它,甚至可以通过 SSH 连接它。FREEBSD
在的以太网端口上设置的数据包捕获未捕获REMOTE
来自 的 VPN IP 10.0.202.6 或发往 的数据包。因此 REMOTE 的数据包未到达本地子网。- 这openvpn.log文件
FREEBSD
包含以下行:GET INST BY VIRT: 10.0.200.31 [failed]
因此,看起来 OpenVPN 没有将 TUN 设备上接收到的数据包转发到FREEBSD
以太网适配器并转发到本地子网。
我的 server.conf 文件中确实有以下行。
push "route 10.0.200.0 255.255.255.0"
我尝试添加此行,但没有帮助。
route 10.0.200.0 255.255.255.0
这是路由表FREEBSD
路由表 互联网: 目标网关标志 Refs 使用 Netif 过期 默认 10.0.200.1 UGS 0 4306 re0 10.0.200.0 链接#9 U 0 61582 re0 10.0.200.21 链接#9 UHS 0 41 lo0 10.0.201.0 10.0.200.1 UGS 0 0 re0 10.0.202.0 10.0.202.2 UGS 0 0 tun0 10.0.202.1 链接#12 UHS 0 0 lo0 10.0.202.2 链接#12 UH 0 0 tun0 本地主机链接#11 UH 0 193743 lo0
我在网上读到过这条GET INST BY VIRT: 10.0.200.31 [failed]
消息,有人建议 Linux 机器运行以下命令。
echo 1 > /proc/sys/net/ipv4/ip_forward
我不敢运行它,因为我不理解它,也不想陷入FREEBSD
一个陌生的配置。我还强烈倾向于修改 server.conf 文件以自动创建必要配置的解决方案,以便在关闭 OpenVPN 时对其进行适当的管理和拆除。
这个问题的解决方案是什么?
答案1
找到问题了。原来 FreeNAS(基于 FreeBSD 的 NAS 设备软件,我上面提到的)FREEBSD
已将设置net.inet.ip.forwarding
为 0。可以使用命令查看sysctl -a | grep net.inet.ip.forwarding
。为了让数据包转发,我必须执行sysctl net.inet.ip.forwarding=1
。
此更改在重启后不会保留。我想我可能必须使用 /etc/rc.conf 文件并进行设置gateway_enable="YES"
,但到目前为止,我发现此设置在重启之前不会得到处理,不幸的是,在 FreeNAS 上,rc.conf 似乎每次重启都会被覆盖。可能可以将此变量写入 /etc/defaults/rc.conf,它应该存储系统的默认值,并被 rc.conf 中的自定义配置覆盖,但 /etc/defaults/rc.conf 文件顶部有一个警告,不要编辑它。
因此,这个问题还没有完全解决,但至少我已经弄清楚了问题是什么。现在我明白了这一点,我现在注意到登录本地子网上的 https Web 管理设备存在问题。这将是另一个需要解决的问题。
答案2
好的,您的 VPN 客户端有一条路由可以访问网络10.0.200.0/24
,您的 VPN 服务器也有一条路由。但问题是您的 Web 服务器10.0.200.31
有一条路由可以访问10.0.202.0/24
网络吗?
在 freebsd 机器上执行 tcpdump。我怀疑你会看到来自10.0.202.6
主机的流量被转发,但你看不到任何返回流量。