在为今年硬件路由器实验配置上网隧道时, 我需要在主机R上将主机A与主机R之间的GRE隧道转发到主机R与主机B之间。一开始, 我尝试使用ip6tables (底层也是nftables)的nat表来进行DNAT和SNAT, 但是发现GRE报文似乎无法命中nat表中的规则。经过尝试, GRE报文可以命中mangle表中的规则, 但是mangle表似乎无法修改源和目标IP地址。经过进一步学习, 我注意到nftables更加灵活, 它的mangle表可以直接修改IP分组头的各项字段, 因此我也成功编制了如下脚本来实现上述目标:
#!/bin/sh PEER1_IP=A的IP地址 PEER2_IP=B的IP地址 nft add rule ip6 mangle PREROUTING meta l4proto gre ip6 saddr "${PEER1_IP}" counter packets 0 bytes 0 ip6 daddr set "${PEER2_IP}" nft add rule ip6 mangle PREROUTING meta l4proto gre ip6 saddr "${PEER2_IP}" counter packets 0 bytes 0 ip6 daddr set "${PEER1_IP}" nft add rule ip6 mangle POSTROUTING meta l4proto gre oifname "接口1" counter packets 0 bytes 0 ip6 saddr set "R的接口1的IP地址" nft add rule ip6 mangle POSTROUTING meta l4proto gre oifname "接口2" counter packets 0 bytes 0 ip6 saddr set "R的接口2的IP地址"
特此记录。
另外, 今天配网时我顺便测试发现北京联通又不验证IPv6源地址了。
发表评论