routeros7 的源进源出的 bug

277 天前
 terrancesiu
说下环境,联通 3 条宽带,3 个 ipv4 公网属于同一 25 的的子网。
需求是
pppoe-out1 国内出站和入站
pppoe-out2 国内三网的 wireguard 入站和出站
pppoe-out3 国外策略路由的入站的出站

按常规的操作做了源进源出后,ipv6 没问题,ipv4 的 tcp 没问题,但是 ipv4 的 udp 会失败,导致基于 udp 的 wireguard 从 pppoe-out2 入站和出站失效。

后来浏览 mikrotik 的论坛,发现老外也提到这个问题

只需要建立三个策略路由表,出口分别是三个接口,最后在策略路由规则增加对应接口的地址即可。操作如下(省略了源进源出的 mangle 配置):
/routing table
add disabled=no fib name=pppoe-out1-routing
add disabled=no fib name=pppoe-out2-routing
add disabled=no fib name=pppoe-out3-routing

/ip route
add distance=1 dst-address=0.0.0.0/0 gateway=pppoe-out1 routing-table=pppoe-out1-routing scope=30 target-scope=10
add distance=1 dst-address=0.0.0.0/0 gateway=pppoe-out2 routing-table=pppoe-out2-routing scope=30 target-scope=10
add distance=1 dst-address=0.0.0.0/0 gateway=pppoe-out3 routing-table=pppoe-out3-routing scope=30 target-scope=10

/routing rule
add action=lookup comment=pppoe-out1 disabled=no src-address=你的 pppoe-out1 的公网地址 table=pppoe-out1-routing
add action=lookup comment=pppoe-out2 disabled=no src-address=你的 pppoe-out2 的公网地址 table=pppoe-out2-routing
add action=lookup comment=pppoe-out3 disabled=no src-address=你的 pppoe-out3 的公网地址 table=pppoe-out3-routing

最后在更新 ddns 脚本里加上一小段把这个 rule 更新下,所有问题修复了。
1612 次点击
所在节点    宽带症候群
7 条回复
jmxct520
277 天前
nb ,我头疼了好几个月了,老板 NB
514146235
277 天前
这个不是 v7 的 bug ,用法就是这样的。
ppbaozi
277 天前
"常规的操作"的操作是什么
terrancesiu
277 天前
wacke
277 天前
其实不是 ipv4 udp 会有问题。。。。根源是 wireguard 的 ipv4 不遵循源进源出,而是直接使用默认路由表的默认路由。。。
参考: https://www.v2ex.com/t/856378
https://github.com/openwrt/packages/issues/9538

这个鸟问题 wireguard 官方是完全不打算修正。。。
onion83
277 天前
v4/v6 双栈自动添加路由规则脚本,可在 /ppp/profiles 新建一个 profiles 在 on up 中填入,然后 pppoe 拨号时引入

```
{
:local ifc WZ-CTC-300M; # FIXME pppoe 接口
:local itb ctc; # FIXME 自定义路由表

:delay 3s;
:local ipv4 [/ip/address get [find interface=$ifc] address];
:local ipv6 [/ipv6/address get [find interface=$ifc and global] address];
:local ipv4 [:pick $ipv4 0 [:find $ipv4 "/"]]
:local ipv6 [:pick $ipv6 0 [:find $ipv6 "/"]]

:if ($ipv4 != "") do={
/routing/rule remove [find comment="$itb-v4"];
/routing/rule add action=lookup-only-in-table src-address=$ipv4 table=$itb comment="$itb-v4";

/routing/rule remove [find comment="$itb-v6"];
/routing/rule add action=lookup-only-in-table src-address=$ipv6 table=$itb comment="$itb-v6";

:put $ipv4; :put $ipv6;
:log warning "[redail] $ifc -- IP changed to $ipv4 / $ipv6";
} else={
:log warning "[redail] IP address not available. Redial may not have occurred.";
}
}
```
说明:
---------------
1 、以上脚本未经长时间测试,请谨慎修改使用
2 、其中 ipv6 部分为根据 prefix 在 pool 中手动分配,其它情况请酌情修改 (参考: https://post.smzdm.com/p/aqm47w6p/)
terrancesiu
277 天前
@wacke 感谢提示

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1014327

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX