我正在尝试设置软件路由器,目的是将数据包路由到路由器上的代理服务器。我正在阅读的教程有以下路由规则:
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
以及以下 iptables 规则:
iptables -t mangle -N V2RAY
iptables -t mangle -A V2RAY -d [Private Addresses] -j RETURN
iptables -t mangle -A V2RAY -p udp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A V2RAY -p tcp -j TPROXY --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j V2RAY
整个过程运行完美。但现在我正转向使用以避免任何启动脚本,并且在转换为语言systemd-networkd
时遇到了麻烦。ip route add local 0.0.0.0/0 dev lo table 100
systemd-networkd
我的第一个问题是,这条路线有什么作用? 到目前为止,我的理解是:
iptables
添加防火墙墙标1.- 该规则选择所有标记为 1 的数据包来使用路由表 100。
- 该路由被添加到表 100 中,因此它仅适用于标记 1 的数据包。
- “0.0.0.0/0”部分表示它是一条默认路由。
- 但是这里的“本地”是什么意思?为什么
device lo
?为什么这里需要路由?iptables 不能直接处理这个问题吗?
我的第二个问题是如何在 中做到这一点systemd-networkd
。
对于匹配带有标记 1 的数据包,这似乎很容易(并且在我的路由器上运行良好):
[Match]
Name = *
[RoutingPolicyRule]
FirewallMark = 1
Table = 100
但我不确定是否Name = *
需要。这是否确保来自任何设备的任何数据包(只要它有标记 1)都将使用表 100 进行路由?或者我可以在这里匹配某些特定的网络设备吗?
但是,我无法在 systemd-networkd 中创建路由。到目前为止,我的尝试是:
[Match]
Name = lo
[Route]
Type = local
Destination = 0.0.0.0/0
Table = 100
但这似乎没有效果:ip route show table 100
实际上给出了:
Error: ipv4: FIB table does not exist.
Dump terminated
我该如何处理这个问题?
答案1
[Match]
Name = lo
[RoutingPolicyRule]
FirewallMark = 1
Table = 100
Priority = 100
[Route]
Table = 100
Destination = 0.0.0.0/0
Type = local
将它们合并为一个文件