我有一个带有以太网接口 (eth0) 的 Orangepi (armbian),我在其中为 AccessPoint 设置了一个接口 (wlan0),并安装了一个 VPN 客户端 (tun0)。目标是: 来自 wlan0 AP 的所有流量都定向到 vpn (tun0),反之亦然 来自系统进程、程序等的所有流量默认路由到 192.168.1.1 ISP 目的地
-------------------
| |
10.8.3.2/24---|tun0 wlan0 |----192.168.2.1/24
192.168.1.31/24---|eth0 | WIFI AP
| |
-------------------
我已激活转发:net.ipv4.ip_forward=1
并在 iptables 中添加规则: iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
结果:通过 AP 访问正常并且始终通过 VPN 路由正常
问题:所有流量都通过 VPN 路由,其想法是进程生成的流量通过默认 192.168.1.1 路由
如果我从终端执行 ping、traceroute 等,它路由 tun0,我明白为什么它分配 tun0 的 10.8.3.2 作为源 IP,我认为这就是问题所在,如果它分配 eth0 的 192.168.1.31,它会路由默认192.168。 1.1 就解决了。
VPN 客户端创建默认值:
0.0.0.0 10.8.3.1 128.0.0.0 UG 0 0 0 tun0
即使我删除它,一切仍然是一样的。
需要配置什么才能将其余流量默认路由到 192.168.1.1 ISP 目的地?
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.8.3.1 128.0.0.0 UG 0 0 0 tun0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
10.8.3.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
128.0.0.0 10.8.3.1 128.0.0.0 UG 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 wlan0
178.239.165.30 192.168.1.1 255.255.255.255 UGH 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
eth0: flags=4163 <UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.31 netmask 255.255.255.0 broadcast 192.168.1.255
ether 02:81:91:07:0c:a5 txqueuelen 1000 (Ethernet)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.8.3.2 netmask 255.255.255.0 destination 10.8.3.2
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255
ether 00:e0:4c:81:79:8a txqueuelen 1000 (Ethernet)
答案1
注意:ifconfig
不应route
再在 Linux 上使用,因为它们使用已弃用且过时的 Linux 内核 API。它们应该替换为ip link
,ip addr
和ip route
(以及来自ip路由2套房)。
基于策略的路由无法使用 Linux 上已弃用的命令来实现,只能使用ip路由2套件的命令。
当前的路由设置负责通过使用两个“半默认”路由而不是默认路由来覆盖原始默认路由(例如,def1
当服务器推送路由或者客户端覆盖它),所以实际的VPN路由都是:
0.0.0.0 10.8.3.1 128.0.0.0 UG 0 0 0 tun0
128.0.0.0 10.8.3.1 128.0.0.0 UG 0 0 0 tun0
并且由于它们比默认路由更窄,因此它们会覆盖任何目标的默认路由(不在其他路由条目中,例如为避免隧道信封的路由循环而显式添加的 VPN 远程端点)。
因此,仅删除第一个条目仍然会影响大约一半的互联网(例如:如果www.armbian.com
解析为 5.161.66.254,则将不再通过隧道到达,但如果www.debian.org
解析为 128.31.0.62,则将通过隧道到达)。删除两者当然会或多或少地禁用隧道。这些行为会影响主机和后面的节点无线局域网0。
这里基于策略的路由可用于区分路由/转发流量和源自主机本身的流量,以具有不同的路由结果。
OP的目标是让主机后面的节点(在LAN后面)使用VPN无线局域网0)但不是主机本身。无需对当前设置进行任何其他更改,这可以通过策略路由规则 + 覆盖当前覆盖的路由表手动完成:仅适用于主机忽略 CIDR 为 0 (0.0.0.0/0) 或 1 (0.0.0.0 /1 和 128.0.0.0/1:OpenVPN 的定义1方法)并重新指定新的默认路由(这将是原始的默认路由)。
下面的3条命令足以解决这个问题:
ip route add default via 192.168.1.1 dev eth0 table 1000
ip rule add pref 1000 iif lo lookup main suppress_prefixlength 1
ip rule add pref 1001 iif lo lookup 1000
这会:
仅适用于主机本身(
iif lo
主机发起流量的特殊语法),但不适用于路由/转发流量(将匹配iif wlan0
或取决于来自何处)iif eth0
,iif tun0
只要路由不匹配,就使用主路由表来检索路由t 来自默认路由或两个定义1“半默认”路线,感谢suppress_prefixlength
抑制器。仍然仅适用于主机本身,如果未找到路由,则使用路由表 1000 中重复的原始默认路由。
因此默认情况下允许主机在不使用 VPN 的情况下访问互联网。
除此之外:
任何路由/转发的流量都不受此设置的影响
因此将像以前一样继续通过 VPN 连接互联网。
返回主机本身的流量始终首先由当地的路由表因此不受此设置的影响。事实上,首选项 0 处的第一个路由规则处理当地的路由表,如下图:
# ip rule 0: from all lookup local 1000: from all iif lo lookup main suppress_prefixlength 1 1001: from all iif lo lookup 1000 32766: from all lookup main 32767: from all lookup default
主机仍然可以像往常一样使用 VPN 到达 10.8.3.0/24 的节点,或者通过无线到达 192.168.2.0/24 的节点,因为它们的路由的 CIDR 为 24,优于 1,因此不会被抑制。
注意:每当界面以太网0被管理性地放下(然后向上)路由表 1000 中的条目必须放回,因为它将被删除,就像在主要的路由表:这应该集成在以太网0界面设置而不仅仅是在启动时设置。
当然也存在其他不需要明确了解网关或自动执行此操作的方法,但它们可能会涉及 VPN 设置。这些命令可以由 VPN 工具作为脚本运行(可能能够在变量中提供网关),或者 VPN 的配置可能能够提供直接解决方案来解决此问题。我无法知道现有的信息。