![使用 FreeBSD 通过 OpenVPN 在特定接口上路由流量](https://linux22.com/image/9424/%E4%BD%BF%E7%94%A8%20FreeBSD%20%E9%80%9A%E8%BF%87%20OpenVPN%20%E5%9C%A8%E7%89%B9%E5%AE%9A%E6%8E%A5%E5%8F%A3%E4%B8%8A%E8%B7%AF%E7%94%B1%E6%B5%81%E9%87%8F.png)
我想在 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 连接时运行命令的更好方法是使用up
openvpn 配置文件中的指令:
up /etc/openvpn/tun0_up.sh