USG多WAN口的端口映射 、转发、upnp

不论是USG还是EdgeRoute,在EdgeOS中仅支持一个WAN口的端口映射,upnp也只能应用到一个WAN口,所以,如果路由上用了多个WAN,实际是浪费,其他WAN口不会端口映射,会被闲置。而且,某些应用,比如emule,在启动了多wan的时候,如果连接服务器的时候被分配到pppoe1出去,而upnp建立在pppoe0上,那获得的就是lowid。所以本文,是在多个wan口上同时启用端口映射和upnp,本文直接用Linux命令对ubnt底层的iptables规则做了少许改进,让多个WAN口都能支持端口映射,包括upnp。本文不适合初学者,初学者论坛自行爬文。

作者使用的USG平台,Unifi会自动产生很多配置,如果是EdgeRoute,可能需要把下面关键的相关配置手动创建。
==============以下内容如果是USG,并启用了负载均衡(weight模式)可以跳过,如果是EdgeRoute,需要照着USG自动产生的配置,把这几点配置上===============
在Unifi中设置负载均衡模式,如果用的策略路由或者用的是EdgeRoute,则需要检查以下配置是否有,以下配置均是设置为负载均衡模式后,Unifi自动推送到USG的:

第一处检查,(wan2 是pppoe1)

sudo -i
iptables -t mangle -S
……
-A UBNT_WLBI_wan_failover -j CONNMARK --restore-mark --nfmask 0x7f800000 --ctmask 0x7f800000
-A UBNT_WLBI_wan_failover -m mark ! --mark 0x0/0x7f800000 -j RETURN
-A UBNT_WLBI_wan_failover -i pppoe0 -m state --state NEW -j MARK --set-xmark 0x64800000/0x7f800000
-A UBNT_WLBI_wan_failover -i pppoe1 -m state --state NEW -j MARK --set-xmark 0x65000000/0x7f800000
-A UBNT_WLBI_wan_failover -m mark ! --mark 0x0/0x7f800000 -j CONNMARK --save-mark --nfmask 0x7f800000 --ctmask 0x7f800000
……

unifi推送过来load balance group name是“wan_failover”,这几个rule的作用是标记每个连接入站的interface,等会回去的时候还是走原来的pppoe接口出去。

第二处检查


root@Gateway:/# ip rule list
0:      from all lookup local 
201:    from all fwmark 0x64800000/0x7f800000 lookup 201 
202:    from all fwmark 0x65000000/0x7f800000 lookup 202 
220:    not from all fwmark 0xffffffff lookup 220 
32766:  from all lookup main 
32767:  from all lookup default

以上每个标记值对应的高级策略路由规则

第三处检查

root@Gateway:/# iptables -t filter -S | grep pppoe
……
-A VYATTA_FW_IN_HOOK -i pppoe1 -j WAN_IN
-A VYATTA_FW_IN_HOOK -i pppoe0 -j WAN_IN
-A VYATTA_FW_LOCAL_HOOK -i pppoe1 -j WAN_LOCAL
-A VYATTA_FW_LOCAL_HOOK -i pppoe0 -j WAN_LOCAL
-A VYATTA_FW_OUT_HOOK -o pppoe1 -j WAN_OUT
-A VYATTA_FW_OUT_HOOK -o pppoe0 -j WAN_OUT

WAN_IN、WAN_LOCAL、WAN_OUT防火墙规则应用到了每个wan口上,在创建端口映射时,ubnt后台会自动在WAN_IN中放开相应的映射端口,这样就自动开放每个wan的映射端口了。

这几点项主要是确认两点:1、现在每个WAN口都具备了“从哪进来从哪出去”(第一处、第二处),2、每个WAN的防火墙规则都开放了映射端口的入站。如果你用USG,打开负载均衡这规则都是默认产生的。负载均衡不是必须的,只是负载均衡默认帮我们完成了很多必要前提,如果没有这些前提,比如你的多wan口是策略路由,那得手动实现以上功能,手动实现也不难,本文暂不讨论。

有了以上两点,要实现多WAN的端口映射就容易了。
=====================以下是真正敲命令的时候===================
思路很简单,把ubnt自动创建的iptable映射规则apply到其他端口就可以了。
1、如下:(在pppoe1上启用端口转发,默认是pppoe0)

iptables -w -t nat -A UBNT_PFOR_DNAT_HOOK -i pppoe1 -m set --match-set ADDRv4_pppoe1 dst -j UBNT_PFOR_DNAT_RULES

2、如果开启了hairpin,Unifi默认开启,还需要以下命令,eth1是LAN;eth1.130是作者建立的guest vlan(如你没有,则不需要第二行)

iptables -w -t nat -A UBNT_PFOR_DNAT_HOOK -i eth1 -m set --match-set ADDRv4_pppoe1 dst -j UBNT_PFOR_DNAT_RULES
iptables -w -t nat -A UBNT_PFOR_DNAT_HOOK -i eth1.130 -m set --match-set ADDRv4_pppoe1 dst -j UBNT_PFOR_DNAT_RULES

接下来,还是通过Unifi WEB创建端口转发,
2018-06-28_10-16-21.png
就是这个界面,和原来一样的方法创建端口转发,不过现在创建的端口映射规则会同时作用到WAN2口上(原来只会作用到WAN1上)。举个例子,原来,你只能通过ftp://wan1_ip访问nas,现在你可以同时通过ftp://wan2_ip访问,这个两个ip都可以访问ftp,有点多线机房的感觉。

最好配合ddns,分别配置wan1和wan2的ddns,然后在外网,就可以分别通过ddns访问了,这个配置需要在config.gateway.json实现,怎么实现,有时间再说。

前面手动创建的端口转发没问题了,下面开始upnp,默认ubnt的负载均衡模式下upnp是残的,比如前面说的,emule,启动连接时,如果正好被负载均衡到了WAN2出去,在服务器上注册的ip是wan2的ip,但wan2并没有被upnp注册端口转发,所以得到的就是lowid,这个现象是实测,不是瞎猜的。
思路和上面一样,把miniupnpd自动创建的iptable映射规则apply到其他端口就可以了,稍微有点不同的是,防火墙规则是miniupnpd来开放。
1、把miniupnpd开放的防火墙端口规则apply到及其他interface(wan2 是pppoe1)

iptables -w -t filter -I FORWARD -i pppoe1 ! -o pppoe1 -j MINIUPNPD(注意是-I)

2、把miniupnpd创建的映射规则apply到及其他interface

iptables -w -t nat -A PREROUTING -i pppoe1 -j MINIUPNPD
iptables -w -t nat -A POSTROUTING -o pppoe1 -j MINIUPNPD-POSTROUTING                                              
iptables -w -t mangle -A PREROUTING -i pppoe1 -j MINIUPNPD

最后测试一下:
emule启动时,无论随机到哪个wan口出去,都可以获得HighID,UDP也可以显示通过防火墙。
下图是某次启动,tcp注册到了pppoe1,udp注册到了pppoe2
2018-06-03_12-12-10.png
下图是另一次启动,tcp和udp都注册到了pppoe2
2018-06-03_12-12-33.png

最后,把以上命令保存一个shell,放到/config/script/post-config.d/,这样每次启动都能自动执行。

1赞

真好很需要。但是不明觉厉,先收藏了

很有用,但是遇上一个wan是移动宽带的(不给公网ip),p2p怎么整

这个太有用了,但是小白完全看不懂啊~~

正好遇到此问题,wan1 电信静态地址,wan 2 移动静态地址,光猫pppoe,都有公网ip,但按此操作无效,是不是固件更新过失效了?望赐教。。

刚需,但是网络小白,能做到一线多拨已属不易,UPNP真是有点力不从心了。
楼主可以给点更详细的过程吗?谢谢