我有一个 VPN 客户端,它会接触路由表,然后继续监视它,如果它被接触则退出。这是端点(例如笔记本电脑)所需的设置。
我想使用一台小型 PC 作为 VPN 端点,并通过它为 LAN (192.168.0.0/24) 上的其他计算机路由。
由于我无法触及路由表,并且所有数据包都强制通过 VPN 设备tun0
,因此我想iptables
可以帮助我将 192.168.0.0 网络的数据包 POSTROUTEing 返回到设备eth1
。
但我不确定这将如何工作,因为一旦它退出,eth1
它应该解析 IPtoMAC,因为它已经在目标网络上,而且我不知道数据包是否已经解析或在它到达之前不会发生伊法斯。
有什么提示吗?
答案1
由于您没有提供更多信息,我不确定如何最好地回答。
因此,我尝试为您提供一些指导,故意忽略您无法修改路由表(您会明白为什么阅读我的建议):
取决于 VPN 客户端和在哪里它挂钩到内核的 FIB(转发信息库),您可能会幸运,因为 VPN 的 FIB 监控,或者使用您的表达式路由表,仅发生在local
和main
规则表中。您可以使用以下命令检查您的路由规则
ip rule show
对于标签“lookup”后面的每个字符串(它们是规则表条目),您可以从 FIB 查询相应的路由信息,使用
ip route show table <name>
如果运气好的话,您可以尝试构建符合您要求的规则,并在规则查找表中优先考虑它。例如(我编造了一些东西来让您领先),让我们添加一条比main
某些流程具有更高优先级的新规则:
ip rule add from 192.168.1.0/24 to 10.10.212.1/30 iif eth0 oif eth2 lookup 888 pref 12000
ip rule show
0: from all lookup local
12000: from 192.168.1.0/24 to 10.10.212.1/30 iif eth0 oif eth2 lookup 888
32766: from all lookup main
32767: from all lookup default
在标准 Linux(本文中为 Ubuntu)系统上,您将看到三个默认规则表local
、main
和default
,通常仅在调用时才能看到该main
表netstat -rn
。
现在我们想用新的路由条目填充查找表 888 中的 FIB 条目:
ip route add default via 10.37.129.4 dev eth2 table 888
让我们看看表 888 中的路由条目是什么样子的:
ip route show table 888
default via 10.37.129.4 dev eth2
我想你应该已经明白了。现在,关于您的特定路由需求,尚不清楚您到底想要实现什么目标。确保在使用规则表时刷新路由缓存:
ip route flush cache
请注意,使用 iproute2 架构,您基本上可以过滤和修改几乎任何 FIB 条目;规则条目甚至可以基于 fwmarks 和/或 u32 分类器来制作,如下所示(示例取自策略路由簿):
tc filter add dev eth1 parent ffff: protocol ip prio 1 u32 \
match ip src 10.1.1.0/24 classid :1
ip rule add fwmark 1 table 1 prio 15000 realms 3/4
ip route add default via 192.168.1.1 table 1 src 192.168.1.254
ip route flush cache
对于规则表条目中的混乱情况,很多年前我准备了一个小的 bash 片段,将我的系统恢复到原始路由规则状态:
: ${KEEP:="local main default"}
while read prio rule; do
continue=0
for keep in ${KEEP}; do
if [ "${rule//lookup ${keep}/}" != "${rule}" ]; then
continue=1
fi
done
if [ ${continue} -eq 0 ]; then
ip rule del prio ${prio%%:*} ${rule//all/0/0}
fi
done < <(ip rule show)
令人惊讶的是,似乎在存在十多年之后iproute2
,似乎仍然只有少数人知道存在一个超越经典的宇宙“破碎的”ifconfig
诸如或 之类的工具netstat
。