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:15eth0 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:27
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1eth1 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:29
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1eth2 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:2A
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr ::: 1/128 Scope:Hostppp0 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:1vlan1 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:27
UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1vlan2 Link encap:Ethernet HWaddr C0:C1:C0:1A:E0:28
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1wl0.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\necho "200 ovpn" >> /etc/iproute2/rt_tables\nip rule add from YOUR.WIFI.IP.S table ovpn\nRun Code Online (Sandbox Code Playgroud)\n\n并为表添加路由规则
\n\nip route add default via VPN.ROUTE.IP.ADDR dev vpn_dev table ovpn\nip route flush cache\nRun 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