虽然我长期从事编码工作并且了解一些系统管理背景,但我在网络领域还算是新手。而现在我距离我的目标只有一步之遥。
整个情况是:在家里,我使用一个 LinkSys E3000 作为网关(尚不清楚它的名字),无线 AP,没有其他路由/交换设备。它为 1 台 PC 和 1 台带 LAN 的 Mac、1 台 Mac Mini + 1 台 iPad + 2 台带 WIFI 的智能手机提供服务。
我的目标是在 E3000(带有 Tomato 固件)上使用 openvpn 客户端,并让我的 iPad 和智能手机的所有 WiFi 流量都通过它,而其他设备路由保持相同的非 openvpn 路由。
到目前为止,我能够将 E3000 上的 openvpn 客户端连接到 openvpn 服务器,并通过该 openvpn 连接隧道传输我所有设备的所有流量。剩下的就是如何选择性地按源 IP(至少我猜测是这样)路由到隧道,同时不打扰其他人。
过去几天我学习了一些“iptables”和“route”,但没有什么收获,所以我的问题来了。以下是一些信息,可以帮助您了解结构。
ifconfig -a 输出,一些无用的线被划掉了,在网页界面上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 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:27
inet 地址:192.168.1.1 Bcast:192.168.1.255 掩码:255.255.255.0 上行广播运行多播 MTU:1500 指标:1eth0 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:27
向上广播运行多播 MTU:1500 指标:1eth1 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:29
上行广播运行所有多播 MTU:1500 指标:1eth2 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:2A
上行广播运行所有多播 MTU:1500 指标:1lo 链路封装:本地环回
inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址:::1/128 范围:主机ppp0 链路封装:点对点协议
inet 地址:172.200.1.43 PtP:172.200.0.1 掩码:255.255.255.255 UP POINTOPOINT 运行多播 MTU:1480 度量:1vlan1 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:27
UP 广播运行所有多播 MTU:1500 指标:1vlan2 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:28
向上广播运行多播 MTU:1500 指标:1wl0.1 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:29
广播多播 MTU:1500 指标:1
brctl 显示输出
root@router:/tmp/home/root# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.c0c1c01ae027 no vlan1
eth1
eth2
在 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
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'
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
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
我注意到并尝试过的事情:* 在 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
如果我取消选中此选项,最后一行将不会出现。那么我猜我的问题可能可以通过 iptables 和 NAT 相关命令来解决,我只是没有足够的知识来弄清楚它们。我尝试运行
iptables -t nat -I POSTROUTING -s 192.168.1.6 -o tun11 -j MASQUERADE
在 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
提前感谢你的帮助和阅读,我希望我提供的所有信息对你有帮助:)
答案1
该固件是否支持iproute2,它可能支持基于源ip的多个路由表。
echo "200 ovpn" >> /etc/iproute2/rt_tables
ip rule add from YOUR.WIFI.IP.S table ovpn
并为表添加路由规则
ip route add default via VPN.ROUTE.IP.ADDR dev vpn_dev table ovpn
ip route flush cache
你可以参考这个:Linux 高级路由和流量控制 HOWTO :http://lartc.org/howto/index.html
或者,如果你是中国人,你可以阅读我关于这个主题的博客:http://wangxu.me/blog/p/675
希望这能有所帮助
答案2
我终于做到了:-)
我正在使用v1.28.9054 MIPSR2-beta K26 USB vpn3.6
,但应该可以在其他人身上起作用,因为它是网络。
OpenVPN 想要设置您的所有路由,您必须停止这种操作……
在 VPN 隧道/客户端/基本
在 VPN 隧道/客户端/高级中取消选中“在隧道上创建 NAT”
取消选中“重定向互联网流量”
自定义配置,添加行:route-nopull
在管理/脚本/防火墙中,确保您拥有:
iptables -I FORWARD -i br0 -o tun11 -j ACCEPT
iptables -I FORWARD -i tun11 -o br0 -j ACCEPT
iptables -I INPUT -i tun11 -j REJECT
iptables -t nat -A POSTROUTING -o tun11 -j MASQUERADE
重新启动,然后你就什么都没有了......
然后,在 VPN 启动脚本(最佳选择)中,或者如果您的 VPN 以 WAN 启动,请输入 Administration/Scripts/WANUP
sleep 30
ip route flush table 200
ip route flush cache
ip rule add from 192.168.1.11 lookup 200
ip rule add from 192.168.1.13 lookup 200
VPN_GW=`ifconfig tun11 | awk '/inet addr/ {split ($2,A,":"); print A[2]}'`
ip route add table 200 default via $VPN_GW dev tun11
这可能不是“最佳”或“正确”的方法,但它确实有效。现在只有192.168.1.11
和192.168.2.13
将通过 OpenVPN 隧道。所有其他设备及其流量都将本地传输。
这对我来说非常重要,因为我不想让我的 Transmission torrent 流量通过 VPN。像 SgtPepperKSU 这样的人看到这个可能就会笑了... 无论如何,从一个路由菜鸟到另一个...
答案3
我做了一些不同的事情,但仍然取得了大致相同的成果。我想在这里分享一下。
我将 Tomato 路由器设置为 OpenVPN 客户端,以便它通过 VPN 路由所有互联网流量。为此,我使用了 StrongVPN.com 的服务,他们提供了分步说明,因此这部分操作相当容易。谷歌搜索“Tomato OpenVPN 设置教程 StrongVPN”,你就会找到它
但是“选择性路由某些主机”的事情非常棘手。
我最终将其实现为“WAN UP”脚本(在 Tomato GUI 中:管理->脚本->WAN UP)。下面的代码是我放入该框中的。它有很多注释来解释发生了什么。它主要基于我在这里找到的代码:
http://linksysinfo.org/index.php?threads/route-only-specific-ports-through-vpn-openvpn.37240/
阅读这篇文章非常有帮助:
http://linux-ip.net/html/adv-multi-internet.html
代码如下:
# This code goes in the WAN UP section of the Tomato GUI.
#
# This script configures "selective" VPN routing. Normally Tomato will route ALL traffic out
# the OpenVPN tunnel. These changes to iptables allow some outbound traffic to use the VPN, and some
# traffic to bypass the VPN and use the regular Internet instead.
#
# To list the current rules on the router, issue the command:
# iptables -t mangle -L PREROUTING
#
# Flush/reset all the rules to default by issuing the command:
# iptables -t mangle -F PREROUTING
#
#
# First it is necessary to disable Reverse Path Filtering on all
# current and future network interfaces:
#
for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
echo 0 > $i
done
#
# Delete and table 100 and flush any existing rules if they exist.
#
ip route flush table 100
ip route del default table 100
ip rule del fwmark 1 table 100
ip route flush cache
iptables -t mangle -F PREROUTING
#
# Copy all non-default and non-VPN related routes from the main table into table 100.
# Then configure table 100 to route all traffic out the WAN gateway and assign it mark "1"
#
# NOTE: Here I assume the OpenVPN tunnel is named "tun11".
#
#
ip route show table main | grep -Ev ^default | grep -Ev tun11 \
| while read ROUTE ; do
ip route add table 100 $ROUTE
done
ip route add default table 100 via $(nvram get wan_gateway)
ip rule add fwmark 1 table 100
ip route flush cache
#
# Define the routing policies for the traffic. The rules will be applied in the order that they
# are listed. In the end, packets with MARK set to "0" will pass through the VPN. If MARK is set
# to "1" it will bypass the VPN.
#
# EXAMPLES:
#
# All LAN traffic will bypass the VPN (Useful to put this rule first, so all traffic bypasses the VPN and you can configure exceptions afterwards)
# iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1
# Ports 80 and 443 will bypass the VPN
# iptables -t mangle -A PREROUTING -i br0 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 1
# All traffic from a particular computer on the LAN will use the VPN
# iptables -t mangle -A PREROUTING -i br0 -m iprange --src-range 192.168.1.2 -j MARK --set-mark 0
# All traffic to a specific Internet IP address will use the VPN
# iptables -t mangle -A PREROUTING -i br0 -m iprange --dst-range 216.146.38.70 -j MARK --set-mark 0
# All UDP and ICMP traffic will bypass the VPN
# iptables -t mangle -A PREROUTING -i br0 -p udp -j MARK --set-mark 1
# iptables -t mangle -A PREROUTING -i br0 -p icmp -j MARK --set-mark 1
# By default all traffic bypasses the VPN
iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1
# Spotify explicitly uses the VPN
iptables -t mangle -A PREROUTING -i br0 -m iprange --dst-range 78.31.8.1-78.31.15.254 -j MARK --set-mark 0
iptables -t mangle -A PREROUTING -i br0 -m iprange --dst-range 193.182.8.1-193.182.15.254 -j MARK --set-mark 0