如何仅通过 openvpn 客户端在 Tomato 上隧道特定主机路由

如何仅通过 openvpn 客户端在 Tomato 上隧道特定主机路由

虽然我长期从事编码工作并且了解一些系统管理背景,但我在网络领域还算是新手。而现在我距离我的目标只有一步之遥。

整个情况是:在家里,我使用一个 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 指标:1

eth0 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:27
向上广播运行多播 MTU:1500 指标:1

eth1 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:29
上行广播运行所有多播 MTU:1500 指标:1

eth2 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:2A
上行广播运行所有多播 MTU:1500 指标:1

lo 链路封装:本地环回
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 度量:1

vlan1 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:27
UP 广播运行所有多播 MTU:1500 指标:1

vlan2 链路封装:以太网 HWaddr C0:C1:C0:1A:E0:28
向上广播运行多播 MTU:1500 指标:1

wl0.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.11192.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

相关内容