我有一台装有 Debian wheezy 的 Raspberry pi。存在三个连接:
eth0: native usb ethernet, connected to the router.
eth1: plug-in usb ethernet adapter
tun0: tunnel created by openconnect vpn client
现在,我想在eth1
和之间创建一个桥接tun0
,以便所有来自 的流量eth1
都路由到 VPN。操作系统上运行的应用程序不需要 VPN 连接。
------------------------
| OS Local --> eth0 --|--> router
| |
| Debian Wheezy |
| |
--|--> eth1 --> tun0 ----|--> vpn server
------------------------
我做了一些研究,发现它tun0
是一个第 3 层设备,而是eth1
一个第 2 层设备。它们不能直接互相通信。我首先想到的是,我是否可以创建一个tun1
frometh1
并连接tun1
。tun0
但这可能吗?我该怎么做?
有什么想法吗?谢谢。
更新: vpn连接后当前路由表:
default dev tun0 scope link
default via 192.168.0.1 dev eth0 metric 202
44.33.22.11 via 192.168.0.1 dev eth0 src 192.168.0.14
172.18.2.0/24 dev tun0 scope link
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.14 metric 202
答案1
你需要实现策略路由,这意味着有两个路由表。我们不会触碰main
已经正确设置的路由表。如果您启用了 IPv4 转发,它将自动通过 OpenVPN 推送来自 eth1 的数据包。
首先,我们需要了解 OpenVP 如何设置路由表。为此,从命令行启动 OpenVPN 客户端:
sudo openvpn --config YourConfigFile.conf
(或YourConfigFile.ovpn
,无论你使用哪个)。最后几行将告诉你如何设置新的路由表,例如在我的情况下它说:
2015 年 7 月 14 日星期二 18:58:07 /sbin/ip route 通过 192.168.105.1 添加 My.Server.Public.IPaddress/32
2015 年 7 月 14 日星期二 18:58:07 /sbin/ip route 通过 10.8.73.5 添加 0.0.0.0/1
2015 年 7 月 14 日星期二 18:58:07 /sbin/ip route 通过 10.8.73.5 添加 128.0.0.0/1
2015 年 7 月 14 日星期二 18:58:07 /sbin/ip route 通过 10.8.73.5 添加 192.168.73.0/24
2015 年 7 月 14 日星期二 18:58:07 /sbin/ip route 通过 10.8.73.5 添加 10.8.73.0/24
2015 年 7 月 14 日星期二 18:58:07 初始化序列已完成
上述路由应引入可执行文件中,但其中一些数字是此特定 VPN 实例所特有的。然而,OpenVPN 提供了有用的环境变量,这些变量将保存上述使用的接口的值,并且非常方便:在此特定情况下,它们是
route_net_gateway -> 192.168.105.1
route_vpn_gateway -> 10.8.73.5
因此,您需要添加到文件(我们称之为/etc/openvpn/route_up.sh
)的行是:
/sbin/ip route add Your.OpenVPN.Server.IPAddress/32 via $route_net_gateway table vpn
/sbin/ip route add 0.0.0.0/1 via $route_vpn_gateway table vpn
/sbin/ip route add 128.0.0.0/1 via $route_vpn_gateway table vpn
/sbin/ip route add Remote.LAN.Net/24 via $route_vpn_gateway table vpn
/sbin/ip route add 172.18.2.0/24 via $route_vpn_gateway table vpn
请记住在上面替换远程服务器的 IP 地址及其本地 LAN如果你使用它;如果您只是使用 OpenVPN 获取服务器的 IP,那么您根本不需要倒数第二条语句。请记住使文件可执行chmod 700 route_up.sh
。
此外,您还必须创建一个新文件,/etc/openvpn/route_down.sh
同样也是可执行文件,它会拆除完全相同的路线(只需更改add
为del
)。
现在我们需要告诉你的 OpenVPN 避免实现路由,因为我们将手动执行此操作:在你的 YourConfigFile.conf 中,添加以下行:
route-nopull
up /etc/openvpn/route_up.sh
down /etc/openvpn/route_down.sh
最后,我们需要为 VPN 设置不同的路由表。添加一个新的路由表,我们称之为vpn
:
echo 200 vpn >> /etc/iproute2/rt_tables
现在我们引入一条规则:
ip rule add from 10.0.0.0/24 table vpn
我假设后面的网络eth1
是10.0.0.0/24
,如果不是,请相应地进行更改。
最后,你必须引入一个 MASQUERADE iptables 规则:
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
就是这个。
答案2
如果我理解正确的话,您正在尝试建立双以太网 VPN 直通,数据通过该直通进入eth1
,并eth0
连接到路由器(传出到互联网)。
您可以使用 iptables 将eth1
流量重定向到tun0
:
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
sudo iptables -A FORWARD -i tun0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o tun0 -j ACCEPT