找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 19571|回复: 14

迄今为止最完美最彻底的openwrt多Wan口upnp解决方案!包含单线多拨、多线多拨场景。

  [复制链接]
发表于 2023-3-6 18:58 | 显示全部楼层 |阅读模式
本帖最后由 jyyyc 于 2023-3-8 21:19 编辑

Openwrt 多wan口upnp端口映射分流真香的解决方法,包含单线多拨、多线多拨场景。


去年下半年开始喜欢在软路由倒腾业务,用Openwrt单线多拨、多线多拨都搞过。业务也不止跑一个,最开始用mwan的ip分流,防火墙做端口映射。怎奈ttnode的端口老是飘,如果是升级Openwrt系统,那不仅端口全部都飘,有时连绑定的id也会跑,你想想ttnode一个容器4个端口,你跑三四个容器,不仅要重新绑定id,还要重新一个个去映射端口,烦。大家都是做技术的,这种办法既折磨又打脸。

本来这个问题可用upnp可以搞定,但我也查了网上无数文章,发现Openwrt下的upnp问题老生常谈,有个别的解决办法,但他们都没有搞定多拨加负载均衡的场景,尤其是两出口以上,根本不可能。无奈很多人选择加虚拟化外套或者前段再加个iKuai。这种方案也是特别麻烦,我非常怕麻烦,就是想用一个Openwrt搞定一切。仔细研究了半个月,终于搞定了,现分享出来以回馈我过去看过的各种各样的好教程。这是迄今为止最完美最彻底的openwrt多Wan口upnp解决方案!

现在分两个部分,先讲映射再说分流。

对外多出口,对内多网段的UPnP ,我是这么发现解决思路的。我发现openwrt启动后默认没有开启那个“启动 UPnP 与 NAT-PMP 服务”的选项,但docker默认的bridge网络照样可以产生映射记录,去查看“系统->进程”搜索upnp,果然看到它的运行程序:

miniupnpd -d -i pppoe-wan pppoe-wanb -o 117.174.127.112 -a docker0 -S -N -A allow 0 65535 0.0.0.0 0 0 65535

查看文档得知-d调试模式(可以去掉)。-i就是你对外的“interface”,-o后面是docker探测到的真实外网IP, -a是你的内网“device”,-S安全模式,-N是启用NAT-PMP功能,-A是范围权限,实际参数是0-65535 0.0.0.0/0 0-65535,(可以不填)。


对于怎样开启多路upnp,有两种方案:

1:有的版本miniupnpd -i后可以跟两个“interface”,就像上面的案列,用空格分开就行,对应两个外网。还想监视多个本地网段?你想当然的在-a后面填多个内网“device”也用空格分开?不行的!正确的做法应该是重复-a device1,-a device2这样。内网device去这里能查到:/etc/config/network

2:运行两个独立的miniupnpd 进程,比如像上面的案列可以改成类似这样:
miniupnpd -i pppoe-wan -o 117.174.127.112 -a macvlan1 -S -N &
miniupnpd -i pppoe-wanb -o 114.114.114.115 -a br-lan -S -N &
可以用这样的案列分别运行N次,左边外网右边内网,就分别独立监视着N个网段和外网。我觉得这种方式更妥,各司其职,逻辑清晰。

这里需要注意,如果你是大内网,这个-o后面可以不填你的真实外网IP,随便弄个假的公网IP也行,我们目的只是打通本地的。这里为啥一定要填个假公网IP?因为新版miniupnpd 查到你的外网接口上的IP不是公网,就直接停止服务了,stun模式又好像不能用,只能妥协填个假的。如果你就是想自动查询并填上大内网的真实对外IP,也可以,把上面的命令改进一下:
miniupnpd -i pppoe-wan -o $(curl -s --interface pppoe-wan ifconfig.me) -a device1 -S -N &
miniupnpd -i pppoe-wanb -o $(curl -s --interface pppoe-wanb ifconfig.me) -a br-lan -S -N &

但如果你的出口本来就是公网IP,那直接去掉-o ip,miniupnpd 会直接从你填的pppoe接口那里查到公网IP,这时乱填假IP反而有副作用(公网变成NAT)。公网的pppoe接口miniupnpd 启动参数就像这样就行,更简洁
miniupnpd -i pppoe-wanc -a macvlan3 -S -N &

可以把命令加到系统自动启动中去使用就方便了,记得把系统自带的那个关了以免冲突。修改或启动新的miniupnpd监视进程时要搜一下进程先把同网段的结束了,以免冲突。




对于怎样多业务分流,我使用Docker的macvlan加路由表。

我是多个WAN口开多个macvlan,而不是开一个macvlan里面再划分IP网段分流。我觉得这样更直观,而且流量更分散均衡。

比如我开个veth1,IP用192.168.10.0/24,再开个veth2,IP用192.168.20.0/24,以此类推,这样我看到容器IP就知道它是哪条线哪个出口的。开macvlan指定硬网口的时候,我也是直接指定pppoe相应的那个网口,比如veth1的网口是eth0,它是第一个wan口,上面也运行着第一路pppoe拨号。这样的好处也是直观,而且pppoe流量已经隧道封装了,网卡也不用开混杂模式,流量互不影响。

开好macvlan之后,现在不用mwan分流了,得自己配路由表了。开始没摸过Linux的路由表,看着就头疼,其实也很好理解。

这里以两条线为列。找到/etc/iproute2/rt_tables,在里面建立两个表并指定他们的优先级,你打开后可以看到了255 local,254 main这样的格式,照着原格式在后面加200 wan1,210 wan2(数字越小优先级越高)。

路由表设置好后需要在这两张空表中分别增加两个网关,对应两条线路:

ip route add default via (第一个pppoe的网关IP) dev pppoe-wan table wan1
ip route add default via (第二个pppoe的网关IP) dev pppoe-wanb table wan2

然后需要在这两张路由表中分别增加那两个macvlan的网段:

ip route add 192.168.10.0/24 dev (你的macvlan1) table wan1
ip route add 192.168.20.0/24 dev (你的macvlan2) table wan2

然后你需要把两个网段的流量分别导进对应的表:

ip rule add from 192.168.10.0/24 table wan1
ip rule add from 192.168.20.0/24 table wan2


把它们划进新路由表去后你发现从br-lan就访问不了它们了,那你可以把你默认的局域网段192.168.100.0/24 br-lan也加进去:

ip route add 192.168.100.0/24 dev br-lan table wan1
ip route add 192.168.100.0/24 dev br-lan table wan1
(如果你不需要在局域网段管理访问里面的业务不加也行)


这样就大功告成了吗?没有,这样确实可以正常映射,正常分流了,但如果出现两种情况就报废了,1掉电重启,2pppoe掉线重播。掉电后路由表全部清空,而且pppoe掉线重播后网关的IP会变,你不可能随时监视着。而且手动去查IP然后改也痛苦。所以需要把这些代码写进pppoe程序的自动运行脚本里面,我这台机器的路径在/lib/netifd/ppp-up(/etc/里也有一个脚本但我这不生效),打开文件在代码最后面增加这样的代码:

case "$IFNAME" in
    pppoe-wan)
        # 添加到 wan1 路由表
                ip route flush table wan1 # 首先复位路由表
                ip route add default via $IPREMOTE dev pppoe-wan table wan1
                ip route add 192.168.10.0/24 dev (你的macvlan1) table wan1
                ip rule add from 192.168.10.0/24 table wan1
                ip route add 192.168.100.0/24 dev br-lan table wan1
        ;;
    pppoe-wanb)
        # 添加到 wan2 路由表
                ip route flush table wan2
                ip route add default via $IPREMOTE dev pppoe-wanb table wan2
                ip route add 192.168.20.0/24 dev (你的macvlan2) table wan2
                ip rule add from 192.168.20.0/24 table wan2
                ip route add 192.168.100.0/24 dev br-lan table wan2
        ;;
Esac

其中$IPREMOTE是网关文件中早就赋值好了,你直接用就行了。只需把dev名称和网段换成你自己的就行,如果三条线就把2改成3,wanb改成wanc加进去就行了,以此类推(所以说用简单直观的方法会更好)。另外提一下你的macvlan真实名称可以在/etc/config/network里查到(就是对应的device设备)这样不论掉电,还是掉网,只要能重新拨号成功,一切分流动作都可自动恢复。完美主义者在这里还可以再次改进代码,拨号同时自动探测大内网真实对外IP重新部署miniupnpd,把上面的代码移过来,增加一个部署前把之前的旧的结束就行,我这边已经搞定了。

自从把mwan删除,我这Upnp后直接变成映射公网型,业务效果明显更好!腰也不酸了,腿也不抽筋了。


还有手工设置单线多播,多线多播

其实也很简单。多线多播好理解,一个wan口对应一个账号就行。而手工单线多播,需要在单网口上增加多个macvlan,每个macvlan的mac地址不一样就行。在Openwrt的接口管理的设备管理列表里,点添加设备配置,设备类型是macvlan,基设备就是对应的硬网口,随机填个mac,模式私有就行,一个基设备可以承载多个macvlan设备(对应多个拨号线路),添加好设备后在“接口”界面添加新wan口时,选你刚才加的macvlan设备就行了。

我发现Openwrt可玩性相当高,上面的基设备可以不选硬网口。你可以先在基设备上建立一个或多个vlan设备,再以此vlan设备为基设备再建立多个macvlan设备,网口流量会自动进入至某vlan中,再在上面跑多个pppoe。所以去弄个网管交换机,还可以扩展wan口,单线多播,多线多播都更方便操作,真香!

Openwrt就是个五脏俱全的Linux系统,以前只摸Windows,通过捣鼓它还学了不少Linux的知识了,真香!


觉得有帮助,领个红包吧!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
发表于 2023-3-8 10:02 | 显示全部楼层
楼主,lan端 macvlan3 怎么划分能细说下吗?或者把你的network文件分享下

点评

你不应该说lan端的macvlan,因为每个macvlan相当于都是独立的lan,它们与默认的br-lan平起平坐。只是基设备不同而已。基设备不用br-lan的网卡,可以用wan口的网卡,这样不用开混杂模式。虽然与是wan口同享硬网口,但  详情 回复 发表于 2023-3-8 20:58
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2023-3-8 20:58 | 显示全部楼层
本帖最后由 jyyyc 于 2023-3-8 21:07 编辑
小熊仔 发表于 2023-3-8 10:02
楼主,lan端 macvlan3 怎么划分能细说下吗?或者把你的network文件分享下

你不应该说lan端的macvlan,因为每个macvlan相当于都是独立的lan,它们与默认的br-lan平起平坐。只是基设备不同而已。基设备不用br-lan的网卡,可以用wan口的网卡,这样不用开混杂模式。虽然与是wan口同享硬网口,但它在系统中的逻辑划分区域是独立的lan区,所以没有冲突一切正常!是的,同一个网口又跑wan出口数据又跑lan区域数据,因为wan口数据pppoe封装好了不影响。建立好后防火墙都归到Lan,没划分路由表分流前都可以相互ping通

点评

能否告知如何配置macvlan(毕竟还是要基于一个物理端口的),配置好了是否需要配置vlan才能连接到该端口  详情 回复 发表于 2023-3-9 14:05
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2023-3-9 14:05 | 显示全部楼层
jyyyc 发表于 2023-3-8 20:58
你不应该说lan端的macvlan,因为每个macvlan相当于都是独立的lan,它们与默认的br-lan平起平坐。只是基设 ...

能否告知如何配置macvlan(毕竟还是要基于一个物理端口的),配置好了是否需要配置vlan才能连接到该端口

点评

openwrt中docker界面和接口设备中都可以配macvlan,macvlan甚至可以建立在虚拟网卡上一切正常使用,只是虚拟网卡重启会消失导致macvlan建立失败,当然如果你在启动时先建立指定名称的虚拟网卡,这个macvlan也能正常  详情 回复 发表于 2023-3-13 22:44
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2023-3-13 22:44 | 显示全部楼层
小熊仔 发表于 2023-3-9 14:05
能否告知如何配置macvlan(毕竟还是要基于一个物理端口的),配置好了是否需要配置vlan才能连接到该端口

openwrt中docker界面和接口设备中都可以配macvlan,macvlan甚至可以建立在虚拟网卡上一切正常使用,只是虚拟网卡重启会消失导致macvlan建立失败,当然如果你在启动时先建立指定名称的虚拟网卡,这个macvlan也能正常恢复。vlan和macvlan完全是两个不同的东西。macvlan相当于一个虚拟出的lan,使用感觉与你正常lan一样,只是三层ip段和网关不同样而已,链路层是通的,不同局域网段能直接ping通。vlan是在同一个网线或交换机上跑多个lan数据的技术,不同lan id之间的信号是彻底隔离的,链路层(电信号)是不通的,必须用交换机把lan的id去掉转换成正常lan信号,通信设备才能收到。这些都是基础知识,为什么不该补补基础?
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2023-3-19 14:18 来自手机 | 显示全部楼层
怎么运行两个upnp啊

点评

哎, 你的问题实在有点小白。我上面案列不就是写的两行执行命令吗?这里的实现方式全在命令行那里,不是WEB界面。  详情 回复 发表于 2023-5-22 12:41
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2023-5-22 12:41 | 显示全部楼层
319226 发表于 2023-3-19 14:18
怎么运行两个upnp啊

哎, 你的问题实在有点小白。我上面案列不就是写的两行执行命令吗?这里的实现方式全在命令行那里,不是WEB界面。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2023-5-22 16:53 | 显示全部楼层
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2023-5-23 10:32 | 显示全部楼层
思考了,感谢,抽空试试
这事纠结许久了,一直没有完美答案,前一阵还将多拨停了,光猫口单独拉了另外几路分出去,要是谁能改下现在的miniupnp luci文件,让用户可像动态域名一样选择硬件界面或进出口就好了
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2023-6-11 19:40 | 显示全部楼层


/usr/sbin/miniupnpd -f /var/etc/miniupnpd.conf




楼主好,上面这个是我的系统-进程里面唯一跟UPNP有关的进程,而且CPU占用率不低,猜测应该就是它了。


我的/etc/config/network文件中的表述如下:



config device 'macvlandev_macvlan1'
        option name 'macvlan1'
        option ifname 'eth1'
        option type 'macvlan'

config interface 'vwan1'
        option ifname 'eth1'
        option proto 'pppoe'
        option metric '41'


请教一下,是否将以下命令放到 系统-计划任务 中随系统启动,然后手动关闭系统
/usr/sbin/miniupnpd -f /var/etc/miniupnpd.conf
这个进程就可以了?


miniupnpd -i vwan1-o $(curl -s --interface vwan1 ifconfig.me) -a macvlandev_macvlan1 -S -N &


感谢赐教
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2023-8-24 03:53 | 显示全部楼层
谢谢分享
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2024-1-4 08:48 | 显示全部楼层
思路不错,不过现在还有ipv6了,ipv6如何写路由表分流呢?
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2024-10-15 08:37 | 显示全部楼层
看起来好复杂,有界面化的方法就好了
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2025-2-19 09:10 | 显示全部楼层
成功开启,感谢楼主。
小白建议:
先关闭自带upnp选项
然后进命令行 输入
miniupnpd -i 上网端口 -o 114.114.114.115 -a 本地端口 -S -N &
上网端口换成自己的wan口,有两个就输入两次
本地端口换成自己的lan口,一般只有一个 br-lan
完事

只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2025-6-26 22:07 | 显示全部楼层
楼主,想请教一下,$(curl -s --interface pppoe-wan ifconfig.me)←这个指的是大内网宽带自动查询并获取真实外网IP吗,我是双Wan分别各自拨号一次,Wan1是电信(有公网和v6),Wan2是移动(无公网,有v6),局域网下绝大多数设备都要走Wan1,只有NAS(NAS也走Wan1)里的Transmission想要走Wan2(移动),Transmission已经通过在Nas新建一个macvlan网络来获取独立的局域网ip,比如主路由是10.10.10.1,Nas是10.10.10.10,而Transmission虽然是在Nas里通过docker部署的,但通过macvlan实现了访问地址是10.10.10.20:port,与Nas不在同一个局域网ip,这种情况能实行双UPNP吗
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /2 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2026-8-24 00:38

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 电话:13506125623

快速回复 返回顶部 返回列表