|
1 | 1 | +++ |
2 | 2 | date = '2025-09-23T21:05:32+08:00' |
3 | | -draft = true |
4 | | -title = 'Routeros_ipv6' |
| 3 | +draft = false |
| 4 | +title = 'RouterOS的IPv6多网段统一进行NAPT转换' |
| 5 | +lastmod = '2025-10-04T16:38:46+08:00' |
5 | 6 | +++ |
6 | 7 |
|
7 | | -使用napt,对于eui64: |
| 8 | +## 前言 |
| 9 | + |
| 10 | +终于决定给社团的网络修一修了~ |
| 11 | + |
| 12 | +## 实践 |
| 13 | + |
| 14 | +### 内网划分 |
| 15 | + |
| 16 | +对于内网的划分是这样的: |
| 17 | + |
| 18 | +使用`ULA`子网:`fd11:4514:5a51::/48` |
| 19 | + |
| 20 | +然后划分四个网段,分别给设施、1-3楼用户。 |
| 21 | + |
| 22 | +- `fd11:4514:5a51:0::/64`,尽量使用`EUI64`分配地址,同时分配公网前缀用于`IPv6`访问。 |
| 23 | +- `fd11:4514:5a51:[1-3]::/64`,仅仅分配`ULA`,不分配公网前缀,使得设备流量分流到三条移动宽带。 |
| 24 | + |
| 25 | +### /DNPT规则 |
| 26 | + |
| 27 | +相比之前使用的`fc00-fc03`网段来说,可以少写很多规则,直接转换`/60`的前缀即可。 |
| 28 | + |
| 29 | +参考如下: |
| 30 | + |
| 31 | +```shell |
| 32 | + 3 ;;; PCC-1 Output |
| 33 | + 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="" |
| 34 | + |
| 35 | + 4 ;;; PCC-2 Output |
| 36 | + 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="" |
| 37 | + |
| 38 | + 5 ;;; PCC-3 Output |
| 39 | + 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="" |
| 40 | + |
| 41 | + 6 ;;; PCC-1 Output NPT |
| 42 | + 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="" |
| 43 | + |
| 44 | + 7 ;;; PCC-2 Output NPT |
| 45 | + 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="" |
| 46 | + |
| 47 | + 8 ;;; PCC-3 Output NPT |
| 48 | + 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="" |
| 49 | + |
| 50 | +9 ;;; PCC-1 Input NPT |
| 51 | + 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="" |
| 52 | + |
| 53 | +10 ;;; PCC-2 Input NPT |
| 54 | + 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="" |
| 55 | + |
| 56 | +11 ;;; PCC-3 Input NPT |
| 57 | + 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="" |
| 58 | +``` |
| 59 | + |
| 60 | +总共9条规则就可以解决,依次是出站PCC规则分流,出站规则,入站DNPT规则。 |
| 61 | + |
| 62 | +## 问题 |
| 63 | + |
| 64 | +### 脚本自动更新问题 |
| 65 | + |
| 66 | +我真的非常不愿意去看RouterOS的脚本,太乱了,沿用了之前的内容,只是修改了其中的网段。 |
| 67 | + |
| 68 | +### 入站问题 |
| 69 | + |
| 70 | +按照现有的规则,实际上是无法入站的,需要单独添加一条规则,而且似乎只对`EUI64`的地址生效。 |
| 71 | + |
| 72 | +``` |
| 73 | + 2 ;;; PCC-1 LAN_Device |
| 74 | + chain=prerouting action=accept dst-address=2409:8a20:ae0:6af0::/64 log=no log-prefix="" |
| 75 | +``` |
| 76 | + |
| 77 | +其实,对于隐私地址,防火墙也非常难以匹配规则,因为后缀变,运营商的前缀也跟着变,一般解决方案都是`socat`或者反向匹配(目标地址写`::be24:11ff:fe82:8282/::ffff:ffff:ffff:ffff`这样)。 |
| 78 | + |
| 79 | +### 内网访问问题 |
| 80 | + |
| 81 | +对于内网v6互访(从0网段到1)是失败的,我怀疑是PCC规则误伤了,但是排查还是挺困难的,因为RouterOS的日志调试我根本不会用,不出日志,你说要是有个`tcpdump`我就会了... |
| 82 | + |
| 83 | +## 补充 |
| 84 | + |
| 85 | +### 关于EUI64和RFC4291 |
| 86 | + |
| 87 | +使用`NAPT`,对于`EUI64`: |
| 88 | + |
| 89 | +```bash |
8 | 90 | 2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 |
9 | | - link/ether 00:0c:29:80:e3:fe brd ff:ff:ff:ff:ff:ff |
| 91 | + link/ether 00:0c:29:65:43:21 brd ff:ff:ff:ff:ff:ff |
10 | 92 | altname enp11s0 |
11 | | - inet 192.168.114.3/24 brd 192.168.114.255 scope global dynamic ens192 |
| 93 | + inet 192.168.114.39/24 brd 192.168.114.255 scope global dynamic ens192 |
12 | 94 | valid_lft 13117sec preferred_lft 13117sec |
13 | | - inet6 2409:8a20:ae0:6af0:20c:29ff:fe80:e3fe/64 scope global dynamic mngtmpaddr |
| 95 | + inet6 fd11:4514:5a51:0:20c:29ff:fe65:4321/64 scope global dynamic mngtmpaddr |
| 96 | + valid_lft 6993sec preferred_lft 3393sec |
| 97 | + inet6 2409:8a20:ae0:6af0:20c:29ff:fe65:4321/64 scope global dynamic mngtmpaddr |
14 | 98 | valid_lft 7124sec preferred_lft 3524sec |
15 | | - |
16 | | -出来的ip地址: |
17 | | -curl 6.ipw.cn |
18 | | -2409:8a20:ae0:6af0:20c:29ff:fe80:e3fe |
| 99 | +``` |
19 | 100 |
|
20 | 101 | 开启了隐私拓展后: |
21 | 102 |
|
22 | | -3: enp0s20f0u3u4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 |
23 | | - link/ether 00:e0:4c:68:09:ce brd ff:ff:ff:ff:ff:ff |
| 103 | +```bash |
| 104 | +4: enp0s20f0u3u4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 |
| 105 | + link/ether 01:e0:22:65:43:21 brd ff:ff:ff:ff:ff:ff |
24 | 106 | altname enx00e04c6809ce |
25 | | - inet6 fd11:4514:5a51:0:81e3:4643:cd5c:7b73/64 scope global dynamic noprefixroute |
26 | | - valid_lft 7194sec preferred_lft 3594sec |
27 | | - |
| 107 | + inet 192.168.101.80/24 brd 192.168.101.255 scope global dynamic noprefixroute enp0s20f0u3u4 |
| 108 | + valid_lft 8484sec preferred_lft 8484sec |
| 109 | + inet6 fd11:4514:5a51:1:ff9d:d0eb:c4f3:ad54/64 scope global dynamic noprefixroute |
| 110 | + valid_lft 7117sec preferred_lft 3517sec |
28 | 111 | ❯ curl 6.ipw.cn |
29 | | -2409:8a20:bc5:c950:9b1b:4643:cd5c:7b73 |
| 112 | +2409:8a20:ae0:1361:cfab:d0eb:c4f3:ad543 |
| 113 | +``` |
| 114 | + |
| 115 | +其中65-80的这一段,若不是真实反应MAC地址,那么好像在`SNPT`的时候不会为你保留。 |
| 116 | + |
| 117 | +有人说,变化是因为要符合校验和,但是对于`EUI64`地址好像并不需要啊,这是为什么呢? |
| 118 | + |
| 119 | +查了下,发现`EUI64`并没有强制要求必须保留,所以为了效率和随机性,就找了一个能够唯一标识的地址使用了。 |
30 | 120 |
|
31 | | -其中65-80的这一段,若不是真实反应mac地址,那么好像在snpt的时候不会为你保留。 |
| 121 | +## 总结 |
32 | 122 |
|
| 123 | +感觉调RouterOS完全就是在猜啊,没有wrt类那种我理解的感觉,希望以后能找到个大佬浇浇我。 |
0 commit comments