使用 FreeBSD 通过 OpenVPN 在特定接口上路由流量

使用 FreeBSD 通过 OpenVPN 在特定接口上路由流量

我想在 FreeBSD 客户端和 (Arch) Linux 服务器之间设置 OpenVPN,以便

  • 所有从 FreeBSD 通过隧道设备明确发送的 Internet 流量均通过 OpenVPN 路由

  • FreeBSD 端的默认网关/路由保持不变。

换句话说,如果我curl --interface tun0 example.com在 FreeBSD 上做类似的事情,我希望请求example.com通过 OpenVPN 路由,但如果我这样做,curl example.com我希望忽略 VPN 隧道。

至此,我已经成功在两台机器之间建立了基本的连接,并且双方都可以看到对方。

我可以通过隧道从远程计算机上运行的 Web 服务器获取数据:

$ curl 10.8.0.1
<!DOCTYPE html>
...

为了完整起见,我还测试了如果我显式指定接口会发生什么,并且它有效:

$ curl --interface 10.8.0.14 10.8.0.1
<!DOCTYPE html>
...

$ curl --interface tun0 10.8.0.1
<!DOCTYPE html>
...

但是,使用任何其他主机/IP 的接口都会失败:

$ curl --interface tun0 example.com
*hang*

$ curl --interface tun0 93.184.216.34  # (the IP I got for example.com)
*hang*

当我执行此操作时,OpenVPN(在 FreeBSD 端)不会打印任何内容RwRw,因此我假设(并且我认为正确)FreeBSD 的网络堆栈配置不充分,无法知道如何tun0通过 OpenVPN 正确路由任意流量。

我发现的所有配置此类路由的示例都是 Linux 特定的;我该为 FreeBSD 做什么?

我可以在 FreeBSD 和 Linux 端进行任意更改,如果这样可以使配置更容易的话。

我最初打算将其发布到网络工程.stackexchange.com,但是自由软件开放VPN标签没有在那里定义,所以我在这里发布。

答案1

这个答案

有关多个网关的更详细说明,请参阅这里

要点是使用新的路由表。

这就是我使用的 - 服务器10.8.0.1/24和客户端10.8.0.2/24

echo "10 vpn" >> /etc/iproute2/rt_tables
ip route add default via 10.8.0.1 dev tun0 table vpn
ip rule add from 10.8.0.2/24 table vpn
ip rule add to 10.8.8.1/24 table vpn
ip route flush cache

第一行应该在重新启动后保留,但规则不会。

编辑: 在 openvpn 连接时运行命令的更好方法是使用upopenvpn 配置文件中的指令:

up /etc/openvpn/tun0_up.sh

相关内容