Mis*_*saz 3 networking firewall ipv6 nftables
在 nftables 中,我可以使用以下规则来匹配 IPv4 UDP DNS 数据包。
ip protocol udp udp dport 53 accept
Run Code Online (Sandbox Code Playgroud)
但 IPv6 变体
ip6 protocol udp udp dport 53 accept
Run Code Online (Sandbox Code Playgroud)
失败,nftables 说
v0001.nft:39:5-12: Error: syntax error, unexpected protocol
ip6 protocol udp udp dport 53 accept
^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
特尔;博士:
一定要使用inet系列表而不是默认的ip系列,如wiki 中所述:
IPv4/IPv6 数据包都将遍历相同的规则。IPv4 数据包的规则不会影响 IPv6 数据包。两种 L3 协议的规则都会影响两者。
不要使用重复的规则。inet系列的目标是分解常见规则:
# nft add rule inet mytable myuserchain udp dport 53 accept
Run Code Online (Sandbox Code Playgroud)
将影响 IPv4 和 IPv6。
如果您真的想区分它们,请使用meta nfproto XX
,不要使用ipXX protocol YY
:
# nft add rule inet mytable myuserchain meta nfproto ipv4 udp dport 53 accept
# nft add rule inet mytable myuserchain meta nfproto ipv6 udp dport 53 accept
Run Code Online (Sandbox Code Playgroud)
此外,虽然 OP 的示例规则没有显示这种情况,
如果您想完全匹配整个第 4 层协议而不使用关联的特定匹配 ( tcp
, udp
...) 同样,您可以执行以下操作:
# nft add rule inet mytable myuserchain meta nfproto ipv4 meta l4proto udp
# nft add rule inet mytable myuserchain meta nfproto ipv6 meta l4proto udp
Run Code Online (Sandbox Code Playgroud)
详情请阅读下文。
您的问题不包括实际的重要信息:此规则添加到的表。
我假设您确实在使用inet系列表,它可以同时处理 IPv4 和 IPv6。
不是这样的:
nft add ip table mytable
Run Code Online (Sandbox Code Playgroud)
或这个(这是相同的):
nft add table mytable
Run Code Online (Sandbox Code Playgroud)
但像这样:
nft add table inet mytable
Run Code Online (Sandbox Code Playgroud)
您稍后编写的每个命令都必须包含inet否则它仍会尝试添加ip。喜欢:
nft add chain inet mytable myuserchain
Run Code Online (Sandbox Code Playgroud)
现在因为IPv4和IPv6的布局有点不同,所以它们在规则语法中的关联关键字也有所不同。IPv6 固定报头不直接包括它携带的协议。它在“Next Header”中包含了下一个标头的协议,并且它在nftables 中的关联关键字是nexthdr
。但是下一个标头实际上并不总是带有数据有效载荷的标头,它可以是任何其他扩展标头,并且您可能有一个 IPv6 UDP 数据包,其中 IPv6 的固定标头的下一个标头值不是 UDP。
因此,虽然 IPv4 可以像这样正常工作:
nft add rule inet mytable myuserchain ip protocol udp udp dport 53 accept
Run Code Online (Sandbox Code Playgroud)
它的直接 IPv6 等效项似乎可以工作,但并不总是适用于:
nft add rule inet mytable myuserchain ip6 nexthdr udp udp dport 53 accept
Run Code Online (Sandbox Code Playgroud)
因为它不会匹配包含Extension Headers 的数据包。当然,考虑到可能存在多个扩展标头,这对于nftables的最终用户来说将是一场噩梦,必须处理这个问题。
由于系统已经知道所有这些,您真正关心的信息:IPv4 与 IPv6(不是 IPv4 UDP 与 IPv6 UDP 的事实,这是一种获取ip
和ip6
接受的语法解决方法:UDP 在下一个(最终)中单独处理匹配关键字udp
),可用作元信息而不是数据包的内容信息:
Run Code Online (Sandbox Code Playgroud)nfproto <protocol> meta nfproto ipv4 meta nfproto != ipv6 meta nfproto { ipv4, ipv6 }
当它不是要使用的语法时,您只是试图解决它的语法变通方法(当检查一次就足够了时,它会检查两次 UDP)。这两种情况的正确语法应该是:
nft add rule inet mytable myuserchain meta nfproto ipv4 udp dport 53 accept
nft add rule inet mytable myuserchain meta nfproto ipv6 udp dport 53 accept
Run Code Online (Sandbox Code Playgroud)
第 4 层协议也存在相同的情况,以防以后没有使用特定匹配:
Run Code Online (Sandbox Code Playgroud)l4proto <protocol> meta l4proto 22 meta l4proto != 233 meta l4proto 33-45 meta l4proto { 33, 55, 67, 88 } meta l4proto { 33-55 }
这里 22 并不意味着端口 22,它意味着协议 22,又名xns-idp。
请注意,使用更具体的匹配已经在结果字节码中隐含地包含那些元过滤器(可以使用 进行检查nft -a --debug=netlink list ruleset
)。只有在不需要进一步过滤时才明确需要它们。
那是关于语法的。当然,inet表的整个目标是避免规则重复。所以在这种情况下,两者都应该简单地替换为:
nft add rule inet mytable myuserchain udp dport 53 accept
Run Code Online (Sandbox Code Playgroud)
它将处理 IPv4 和 IPv6:因为这就是这个表族存在的目的。
注意:protocol
可能最好用于桥族表的情况。
归档时间: |
|
查看次数: |
525 次 |
最近记录: |