如何仅通过番茄上的 openvpn 客户端隧道特定主机路由

kco*_*ome 6 route iptables openvpn

我在网络世界中相对新手,虽然我做了编码并且知道一些系统管理员背景很长一段时间。在这里,我离目的地只有一步之遥。

整体情况是:在家里我使用一台LinkSys E3000作为网关(不知道这是不是它的名字),无线AP,没有其他路由/交换设备。它为 1 台 PC 和 1 台带 LAN 的 Mac、1 台 Mac Mini + 1 台 iPad + 2 台带 WIFI 的智能手机提供服务。

我的目标是在 E3000 上使用 openvpn 客户端(带有番茄固件)并使我的 iPad 和智能手机的所有 WiFi 流量都通过它,而其他设备的路由保持相同的非 openvpn 路由。

到目前为止,我能够将 E3000 上的 openvpn 客户端连接到 openvpn 服务器,通过该 openvpn 连接隧道传输我所有设备的所有流量。剩下的是如何通过源 IP(至少在我的猜测中)有选择地路由到隧道,同时不打扰其他人。

在过去的几天里,我学习了一些“iptables”和“route”,但运气不佳,所以我的问题来了。这里有一些信息可以帮助您获得结构。

ifconfig -a 输出,把一些无用的线划掉,在web界面中C0:C1:C0:1A:E0:28是WAN,C0:C1:C0:1A:E0:27是LAN,C0:C1:C0:1A :E0:29 是 2.4G wifi AP,C0:C1:C0:1A:E0:2A 是 5G wifi AP。

root@router:/tmp/home/root# ifconfig -a

br0 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:27
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST0 Metric:15

eth0 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:27
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

eth1 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:29
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1

eth2 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:2A
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr ::: 1/128 Scope:Host

ppp0 Link encap:Point-to-Point Protocol
inet addr:172.200.1.43 PtP:172.200.0.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING MULTICAST MTU:1480 Metric:1

vlan1 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:27
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1

vlan2 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:28
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

wl0.1 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:29
BROADCAST MULTICAST MTU:1500 Metric:1

brctl 显示输出

root@router:/tmp/home/root# brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.c0c1c01ae027   no      vlan1
                            eth1
                            eth2
Run Code Online (Sandbox Code Playgroud)

在 openvpn 路由脚本之前

root@router:/tmp/home/root# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.200.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         172.200.0.1     0.0.0.0         UG    0      0        0 ppp0
Run Code Online (Sandbox Code Playgroud)

openvpn 服务器推送

PUSH: Received control message: 'PUSH_REPLY,redirect-gateway,dhcp-option DNS 8.8.8.8,route 172.20.0.1,topology net30,ping 10,ping-restart 120,ifconfig 172.20.0.6 172.20.0.5'
Run Code Online (Sandbox Code Playgroud)

openvpn 的股票路由脚本

Apr 24 14:52:06 router daemon.notice openvpn[1768]: /sbin/ifconfig tun11 172.20.0.6 pointopoint 172.20.0.5 mtu 1500
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 72.14.177.29 netmask 255.255.255.255 gw 172.200.0.1
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 0.0.0.0 netmask 128.0.0.0 gw 172.20.0.5
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 128.0.0.0 netmask 128.0.0.0 gw 172.20.0.5
Apr 24 14:52:08 router daemon.notice openvpn[1768]: /sbin/route add -net 172.20.0.1 netmask 255.255.255.255 gw 172.20.0.5
Run Code Online (Sandbox Code Playgroud)

openvpn后的路由

root@router:/tmp/home/root# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.20.0.5      0.0.0.0         255.255.255.255 UH    0      0        0 tun11
72.14.177.29    172.200.0.1     255.255.255.255 UGH   0      0        0 ppp0
172.200.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
172.20.0.1      172.20.0.5      255.255.255.255 UGH   0      0        0 tun11
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         172.20.0.5      128.0.0.0       UG    0      0        0 tun11
128.0.0.0       172.20.0.5      128.0.0.0       UG    0      0        0 tun11
0.0.0.0         172.200.0.1     0.0.0.0         UG    0      0        0 ppp0
Run Code Online (Sandbox Code Playgroud)

我注意到并尝试过的事情: * 在 openvpn 客户端的 Web 界面上有一个选项“在隧道上创建 NAT”,如果我检查这个,有以下脚本(可能在 openvpn 连接建立后执行)

root@router:/tmp/home/root# cat /tmp/etc/openvpn/fw/client1-fw.sh
#!/bin/sh
iptables -I INPUT -i tun11 -j ACCEPT
iptables -I FORWARD -i tun11 -j ACCEPT
iptables -t nat -I POSTROUTING -s 192.168.1.0/255.255.255.0 -o tun11 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

如果我取消选中此选项,则不会出现最后一行。然后我想我的问题可能会通过 iptables 和 NAT 相关命令解决,我只是没有足够的知识来弄清楚它们。我试过跑

iptables -t nat -I POSTROUTING -s 192.168.1.6 -o tun11 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

openvpn连接后手动(192.168.1.6是我iPad的IP地址),然后我的iPad通过openvpn隧道上网,但是所有其他设备都无法上网。

如果需要,这里是关于 NAT 的 iptables

root@router:/tmp/home/root# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            192.168.1.0/24      
WANPREROUTING  all  --  0.0.0.0/0            172.200.1.43        
upnp       all  --  0.0.0.0/0            172.200.1.43        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           
SNAT       all  --  192.168.1.0/24       192.168.1.0/24      to:192.168.1.1 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain WANPREROUTING (1 references)
target     prot opt source               destination         
DNAT       icmp --  0.0.0.0/0            0.0.0.0/0           to:192.168.1.1 

Chain upnp (1 references)
target     prot opt source               destination         
DNAT       udp  --  0.0.0.0/0            0.0.0.0/0       udp dpt:5353 to:192.168.1.3:5353 
Run Code Online (Sandbox Code Playgroud)

提前感谢您的帮助和阅读本文,我希望我提供了您需要帮助的所有信息:)

小智 2

该固件是否支持iproute2,iproute2可能支持多个基于src ip的路由表。

\n\n
echo "200 ovpn" >> /etc/iproute2/rt_tables\nip rule add from YOUR.WIFI.IP.S table ovpn\n
Run Code Online (Sandbox Code Playgroud)\n\n

并为表添加路由规则

\n\n
ip route add default via VPN.ROUTE.IP.ADDR dev vpn_dev table ovpn\nip route flush cache\n
Run Code Online (Sandbox Code Playgroud)\n\n

你可以参考这个:Linux高级路由和流量控制HOWTO \xef\xbc\x9a http://lartc.org/howto/index.html

\n\n

或者,作为中国人,您可以阅读我关于此主题的博客:http://wangxu.me/blog/p/675

\n\n

希望这可以帮助

\n