You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用nftables Maps简化WireGuard场景下的多IP对应DNAT规则配置

如何使用nftables Maps简化WireGuard场景下的多IP对应DNAT规则配置

嘿,我完全懂你现在的困扰——重复写一堆几乎一模一样的DNAT规则不仅繁琐,后期维护也麻烦。用nftables的map特性确实能完美解决这个问题,咱们一步步把你的配置简化:

第一步:把重复的IP映射定义成Map

你之前尝试的define思路是对的,但更规范的做法是把这个映射直接放在ip nat表中,这样规则和映射的关联更清晰。替换掉你原来分散的DNAT规则,先在nat表里定义一个camera_dnat_map

table ip nat {
    # 定义WireGuard IP到本地摄像头IP的映射表
    map camera_dnat_map {
        type ipv4_addr : ipv4_addr  # 键是WireGuard端的IP,值是本地摄像头IP
        elements = {
            10.10.0.150 : 10.0.1.150,
            10.10.0.151 : 10.0.1.151,
            10.10.0.152 : 10.0.1.152,
            10.10.0.153 : 10.0.1.153,
            10.10.0.154 : 10.0.1.154
        }
    }

    chain prerouting {
        type nat hook prerouting priority 0;
        # 用一条规则代替所有重复的DNAT配置
        iifname "wg0" tcp dport 80 ip daddr @camera_dnat_map dnat to map @camera_dnat_map
    }

    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        oifname "eth0" masquerade
    }
}

第二步:理解这条简化规则的作用

这条规则会自动匹配:

  • 来自WireGuard接口(iifname "wg0")的流量
  • 目标端口为80的TCP流量
  • 目标IP是camera_dnat_map里定义的任意一个WireGuard IP

一旦匹配成功,nftables会自动把目标地址替换成map中对应的本地摄像头IP,完全替代了你之前写的5条重复规则。

保持原有Filter配置不变

你原来的ip filter表配置不需要修改,forward链里的ct status dnat accept已经能正确放行经过DNAT的流量,确保转发正常工作。

后续维护更轻松

以后如果要新增摄像头,只需要在camera_dnat_mapelements里加一行新的键值对(比如10.10.0.155 : 10.0.1.155),然后重载nftables配置就可以了,再也不用复制粘贴重复的规则。

验证配置是否生效

你可以用以下命令查看加载后的规则,确认map和DNAT规则是否正确:

nft list table ip nat

备注:内容来源于stack exchange,提问作者zorael

火山引擎 最新活动