跳过正文
  1. 文章/

RouterOS的IPv6多网段统一进行NAPT转换

··1070 字·3 分钟
目录

前言
#

终于决定给社团的网络修一修了~

实践
#

内网划分
#

对于内网的划分是这样的:

使用ULA子网:fd11:4514:5a51::/48

然后划分四个网段,分别给设施、1-3楼用户。

  • fd11:4514:5a51:0::/64,尽量使用EUI64分配地址,同时分配公网前缀用于IPv6访问。
  • fd11:4514:5a51:[1-3]::/64,仅仅分配ULA,不分配公网前缀,使得设备流量分流到三条移动宽带。

/DNPT规则
#

相比之前使用的fc00-fc03网段来说,可以少写很多规则,直接转换/60的前缀即可。

参考如下:

 3    ;;; PCC-1 Output
      chain=prerouting action=mark-packet new-packet-mark=PCC-1 passthrough=yes src-address=fd11:4514:5a51::/60 dst-address-list=!ULAs per-connection-classifier=src-address:3/0 log=no log-prefix="" 

 4    ;;; PCC-2 Output
      chain=prerouting action=mark-packet new-packet-mark=PCC-2 passthrough=yes src-address=fd11:4514:5a51::/60 dst-address-list=!ULAs per-connection-classifier=src-address:3/1 log=no log-prefix="" 

 5    ;;; PCC-3 Output
      chain=prerouting action=mark-packet new-packet-mark=PCC-3 passthrough=yes src-address=fd11:4514:5a51::/60 dst-address-list=!ULAs per-connection-classifier=src-address:3/2 log=no log-prefix="" 

 6    ;;; PCC-1 Output NPT
      chain=postrouting action=SNPT src-prefix=fd11:4514:5a51::/60 dst-prefix=2409:8a20:ae0:6af0::/60 src-address=fd11:4514:5a51::/60 packet-mark=PCC-1 log=no log-prefix="" 

 7    ;;; PCC-2 Output NPT
      chain=postrouting action=SNPT src-prefix=fd11:4514:5a51::/60 dst-prefix=2409:8a20:ae0:1360::/60 src-address=fd11:4514:5a51::/60 packet-mark=PCC-2 log=no log-prefix="" 

 8    ;;; PCC-3 Output NPT
      chain=postrouting action=SNPT src-prefix=fd11:4514:5a51::/60 dst-prefix=2409:8a20:bc5:c950::/60 src-address=fd11:4514:5a51::/60 packet-mark=PCC-3 log=no log-prefix="" 

9    ;;; PCC-1 Input NPT
      chain=prerouting action=dnpt src-prefix=2409:8a20:ae0:6af0::/60 dst-prefix=fd11:4514:5a51::/60 dst-address=2409:8a20:ae0:6af0::/60 log=no log-prefix="" 

10    ;;; PCC-2 Input NPT
      chain=prerouting action=dnpt src-prefix=2409:8a20:ae0:1360::/60 dst-prefix=fd11:4514:5a51::/60 dst-address=2409:8a20:ae0:1360::/60 log=no log-prefix="" 

11    ;;; PCC-3 Input NPT
      chain=prerouting action=dnpt src-prefix=2409:8a20:bc5:c950::/60 dst-prefix=fd11:4514:5a51::/60 dst-address=2409:8a20:bc5:c950::/60 log=no log-prefix="" 

总共9条规则就可以解决,依次是出站PCC规则分流,出站规则,入站DNPT规则。

问题
#

脚本自动更新问题
#

我真的非常不愿意去看RouterOS的脚本,太乱了,沿用了之前的内容,只是修改了其中的网段。

入站问题
#

按照现有的规则,实际上是无法入站的,需要单独添加一条规则,而且似乎只对EUI64的地址生效。

 2    ;;; PCC-1 LAN_Device
      chain=prerouting action=accept dst-address=2409:8a20:ae0:6af0::/64 log=no log-prefix=""

其实,对于隐私地址,防火墙也非常难以匹配规则,因为后缀变,运营商的前缀也跟着变,一般解决方案都是socat或者反向匹配(目标地址写::be24:11ff:fe82:8282/::ffff:ffff:ffff:ffff这样)。

内网访问问题
#

对于内网v6互访(从0网段到1)是失败的,我怀疑是PCC规则误伤了,但是排查还是挺困难的,因为RouterOS的日志调试我根本不会用,不出日志,你说要是有个tcpdump我就会了…

补充
#

关于EUI64和RFC4291
#

使用NAPT,对于EUI64:

2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:65:43:21 brd ff:ff:ff:ff:ff:ff
    altname enp11s0
    inet 192.168.114.39/24 brd 192.168.114.255 scope global dynamic ens192
       valid_lft 13117sec preferred_lft 13117sec
    inet6 fd11:4514:5a51:0:20c:29ff:fe65:4321/64 scope global dynamic mngtmpaddr 
       valid_lft 6993sec preferred_lft 3393sec
    inet6 2409:8a20:ae0:6af0:20c:29ff:fe65:4321/64 scope global dynamic mngtmpaddr 
       valid_lft 7124sec preferred_lft 3524sec

开启了隐私拓展后:

4: enp0s20f0u3u4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 01:e0:22:65:43:21 brd ff:ff:ff:ff:ff:ff
    altname enx00e04c6809ce
    inet 192.168.101.80/24 brd 192.168.101.255 scope global dynamic noprefixroute enp0s20f0u3u4
       valid_lft 8484sec preferred_lft 8484sec
    inet6 fd11:4514:5a51:1:ff9d:d0eb:c4f3:ad54/64 scope global dynamic noprefixroute 
       valid_lft 7117sec preferred_lft 3517sec
❯ curl 6.ipw.cn
2409:8a20:ae0:1361:cfab:d0eb:c4f3:ad543

其中65-80的这一段,若不是真实反应MAC地址,那么好像在SNPT的时候不会为你保留。

有人说,变化是因为要符合校验和,但是对于EUI64地址好像并不需要啊,这是为什么呢?

查了下,发现EUI64并没有强制要求必须保留,所以为了效率和随机性,就找了一个能够唯一标识的地址使用了。

总结
#

感觉调RouterOS完全就是在猜啊,没有wrt类那种我理解的感觉,希望以后能找到个大佬浇浇我。