标签 nftables 下的文章

NFTables NAT Rust

基于 nftables 的高性能 NAT 端口转发管理工具,使用 Rust 语言开发。

核心特性

  • 动态 NAT 转发:自动监测配置文件和目标域名 IP 变化,实时更新转发规则
  • IPv4/IPv6 双栈支持:完整支持 IPv4 和 IPv6 NAT 转发
  • 灵活配置:支持传统配置文件和 TOML 格式,满足不同使用场景
  • 精准控制:支持单端口、端口段、TCP/UDP 协议选择
  • 本地重定向:支持端口重定向到本机其他端口
  • Docker 兼容:与 Docker 网络完美兼容
  • 高性能轻量:基于 Rust 编写,仅依赖标准库和少量核心库
  • 开机自启:支持 systemd 服务管理,开机自动启动
  • 域名解析:支持域名和 IP 地址,自动 DNS 解析和缓存
  • Web 管理界面:提供可视化的 WebUI 管理配置和查看规则


系统要求

适用于以下 Linux 发行版:

  • CentOS 8+ / RHEL 8+ / Fedora
  • Debian 10+ / Ubuntu 18.04+
  • 其他支持 nftables 的现代 Linux 发行版

系统准备

CentOS / RHEL / Fedora

# 关闭 firewalld
systemctl disable --now firewalld

# 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 安装 nftables
yum install -y nftables

Debian / Ubuntu

# 安装 nftables
apt update && apt install -y nftables

# 禁用 iptables(可选)
systemctl disable --now iptables

快速安装

升级也使用相同的安装命令

方法一:TOML 配置文件版本(推荐)

bash <(curl -sSLf https://us.arloor.dev/https://github.com/arloor/nftables-nat-rust/releases/download/v2.0.0/setup.sh) toml

方法二:传统配置文件版本

bash <(curl -sSLf https://us.arloor.dev/https://github.com/arloor/nftables-nat-rust/releases/download/v2.0.0/setup.sh) legacy

WebUI 管理界面

本项目现已支持 Web 管理界面,可以通过浏览器方便地管理 NAT 配置。

  • 基于 JWT 的安全认证
  • 支持 HTTPS/TLS 加密传输
  • 可视化编辑配置文件(支持传统格式和 TOML 格式)
  • 实时查看 nftables 规则
  • 现代化的用户界面

安装管理界面 WebUI

bash <(curl -sSLf https://us.arloor.dev/https://github.com/arloor/nftables-nat-rust/releases/download/v2.0.0/setup-console.sh) # -p 5533  -k /root/.acme.sh/arloor.dev/arloor.dev.key -c /root/.acme.sh/arloor.dev/fullchain.cer 
  1. 安装过程会交互式提示输入用户名和密码。密码会保存在 systemd 文件中,注意安全。
  2. 通过 -p 参数可以指定 WebUI 监听端口,默认端口为 5533。
  3. 通过 -c-k 参数可以指定自定义 TLS 证书和私钥文件路径,如果未提供,将自动生成自签名证书。
  4. 安装脚本会自动检测现有 NAT 服务的配置格式,并根据配置格式生成相应的 systemd service 文件。

安装完成后,访问 https://your-server-ip:5533 即可使用管理界面。详细文档请查看 nat-console/README.md

升级 WebUI

bash <(curl -sSLf https://us.arloor.dev/https://github.com/arloor/nftables-nat-rust/releases/download/v2.0.0/setup-console-assets.sh)
systemctl restart nat-console

配置说明

TOML 配置文件(推荐)

配置文件位置:/etc/nat.toml

优势

  • 支持配置验证,保证格式正确
  • 支持注释,便于维护
  • WebUI 可视化编辑和验证
  • 结构化配置,可读性更好
# ============ 基础转发示例 ============ # 1. 单端口转发 - HTTPS 流量转发 [[rules]] type = "single" sport = 10443 # 本机监听端口 dport = 443 # 目标服务端口 domain = "example.com" # 目标域名或 IP 地址 protocol = "all" # 协议: all, tcp 或 udp ip_version = "ipv4" # IP 版本: ipv4, ipv6 或 all comment = "转发 HTTPS 到 example.com" # 2. 端口段转发 - 批量游戏端口 [[rules]] type = "range" port_start = 20000 # 起始端口 port_end = 20100 # 结束端口(含) domain = "game.example.com" protocol = "tcp" # 仅 TCP 协议 ip_version = "all" # 同时支持 IPv4 和 IPv6 comment = "游戏服务器端口段" # 3. UDP 专用转发 - DNS 服务 [[rules]] type = "single" sport = 5353 # 本机 DNS 端口 dport = 53 # 目标 DNS 端口 domain = "8.8.8.8" # 也可以直接使用 IP 地址 protocol = "udp" # 仅 UDP 协议 ip_version = "ipv4" comment = "DNS 查询转发" # ============ 本地重定向示例 ============ # 4. 单端口重定向到本机服务 [[rules]] type = "redirect" sport = 8080 # 外部访问端口 dport = 3128 # 本机实际服务端口 protocol = "all" ip_version = "ipv4" comment = "代理服务端口重定向" # 5. 端口段重定向到本机 [[rules]] type = "redirect" sport = 30001 # 起始端口 sport_end = 30100 # 结束端口 dport = 45678 # 本机目标端口 protocol = "tcp" ip_version = "all" comment = "批量端口重定向到本机" # ============ 高级场景示例 ============ # 6. 强制 IPv6 转发 [[rules]] type = "single" sport = 9001 dport = 9090 domain = "ipv6.example.com" protocol = "all" ip_version = "ipv6" # 仅使用 IPv6 进行转发 comment = "IPv6 专用服务" # 7. 双栈支持示例 - 自动选择 IPv4/IPv6 [[rules]] type = "single" sport = 10080 dport = 80 domain = "dual-stack.example.com" # 域名同时有 A 和 AAAA 记录 protocol = "tcp" ip_version = "all" # 根据客户端 IP 版本自动选择 comment = "双栈 Web 服务" 

传统配置文件

配置文件位置:/etc/nat.conf

基础格式

  • SINGLE,本机端口,目标端口,目标地址[,协议][,IP版本] - 单端口转发
  • RANGE,起始端口,结束端口,目标地址[,协议][,IP版本] - 端口段转发
  • REDIRECT,源端口,目标端口[,协议][,IP版本] - 重定向到本机端口
  • REDIRECT,起始端口-结束端口,目标端口[,协议][,IP版本] - 端口段重定向

参数说明

  • 协议可选值:tcpudpall(默认为 all
  • IP 版本可选值:ipv4ipv6all(默认为 all
  • # 开头的行为注释

配置示例

# ============ 基础转发 ============ # 单端口转发 - HTTPS 流量
SINGLE,10443,443,example.com

# 端口段转发 - 游戏服务器端口(20000-20100)
RANGE,20000,20100,game.example.com

# ============ 协议指定 ============ # 仅转发 TCP 流量 - Web 服务
SINGLE,10080,80,web.example.com,tcp

# 仅转发 UDP 流量 - DNS 查询
SINGLE,5353,53,8.8.8.8,udp

# ============ 本地重定向 ============ # 单端口重定向到本机服务
REDIRECT,8080,3128

# 端口段重定向到本机(30001-30100 → 45678)
REDIRECT,30001-30100,45678

# TCP 专用重定向
REDIRECT,7000-7100,8080,tcp

# ============ IPv6 支持 ============ # 强制使用 IPv6 转发
SINGLE,9001,9090,ipv6.example.com,all,ipv6

# 双栈支持(根据客户端自动选择)
SINGLE,10080,80,dual-stack.example.com,tcp,all

# 禁用的规则(以 # 开头) # SINGLE,3000,3000,disabled.example.com 

使用方法

启动 / 停止服务

# 启动服务
systemctl start nat

# 停止服务
systemctl stop nat

# 重启服务
systemctl restart nat

# 查看服务状态
systemctl status nat

# 开机自启
systemctl enable nat

# 取消开机自启
systemctl disable nat

修改配置

修改配置文件后,程序会在 60 秒内自动应用新配置,无需手动重启服务。

# TOML 版本
vim /etc/nat.toml

# 传统版本
vim /etc/nat.conf

查看日志

# 实时查看日志
journalctl -fu nat

# 查看详细日志
journalctl -exfu nat

# 查看最近 100 行日志
journalctl -u nat -n 100

查看 nftables 规则

# 查看所有规则
nft list ruleset

# 仅查看 NAT 表
nft list table ip self-nat
nft list table ip6 self-nat6

高级配置

自定义源 IP(多网卡场景)

默认使用 masquerade 自动处理 SNAT。如需指定源 IP:

# 设置自定义源 IP echo "nat_local_ip=10.10.10.10" > /opt/nat/env

# 重启服务
systemctl restart nat

Docker 兼容性

本工具已与 Docker 完全兼容。程序会自动调整 nftables 规则以适配 Docker 网络。

说明:Docker v28 将 filter 表 forward 链默认策略改为 DROP,本工具会自动将其重置为 ACCEPT 以确保 NAT 规则正常工作。

注意事项

REDIRECT 类型限制

REDIRECT 类型工作在 PREROUTING 链,仅对外部流量有效:

  • 有效:外部机器访问重定向端口 → 成功重定向
  • 无效:本机进程访问重定向端口 → 不会重定向

原因:本机流量直接进入 OUTPUT 链,不经过 PREROUTING 链。

示例

# 配置:REDIRECT,8000,3128
curl http://remote-server:8000  # ✅ 成功重定向到 3128
curl http://localhost:8000      # ❌ 不会重定向,直接访问 8000 

TLS/Trojan 转发

转发 TLS/Trojan 等加密协议时,常见问题是证书配置错误。

解决方案

  1. 简单:客户端禁用证书验证
  2. 推荐:正确配置证书和域名,确保证书域名与中转机匹配

许可证

本项目采用 MIT License 开源协议。

相关链接


注意:与旧版 iptablesUtils 不兼容,切换时请先卸载旧版或重装系统。


📌 转载信息
转载时间:
2026/1/11 08:53:11

拉取 cf ip 写入到配置文件,不存在 /etc/nftables.d 先手动 mkdir 创建一下

#!/usr/bin/env sh set -eu

DIR="/etc/nftables.d"
OUT4="${DIR}/cf-set-v4.nft"
OUT6="${DIR}/cf-set-v6.nft" mkdir -p "$DIR"

tmp4="$(mktemp)"
tmp6="$(mktemp)" # v4 set block
{
  echo "set cf_ipv4 {" echo "        type ipv4_addr;" echo "        flags interval;" echo "        elements = {"
  curl -fsSL https://www.cloudflare.com/ips-v4 \
    | awk 'NF{print "                " $0 ","}' echo "        }" echo "}"
} > "$tmp4" # v6 set block
{
  echo "set cf_ipv6 {" echo "        type ipv6_addr;" echo "        flags interval;" echo "        elements = {"
  curl -fsSL https://www.cloudflare.com/ips-v6 \
    | awk 'NF{print "                " $0 ","}' echo "        }" echo "}"
} > "$tmp6"

install -m 0644 "$tmp4" "$OUT4"
install -m 0644 "$tmp6" "$OUT6" rm -f "$tmp4" "$tmp6" 

生成的配置文件类似

set cf_ipv4 {
        type ipv4_addr;
        flags interval;
        elements = {
                173.245.48.0/20,
                103.21.244.0/22,
                103.22.200.0/22,
                103.31.4.0/22,
                141.101.64.0/18,
                108.162.192.0/18,
                190.93.240.0/20,
                188.114.96.0/20,
                197.234.240.0/22,
                198.41.128.0/17,
                162.158.0.0/15,
                104.16.0.0/13,
                104.24.0.0/14,
                172.64.0.0/13,
                131.0.72.0/22,
        }
}

修改 /etc/nftables.conf

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
        include "/etc/nftables.d/cf-set-v4.nft"
        include "/etc/nftables.d/cf-set-v6.nft"

        chain input {
                type filter hook input priority filter;
                iif lo accept;
                ct state established,related accept;

                # SSH
                tcp dport 22 accept;
                
                # 这里是关键配置,以80为例子,只允许cf的ip访问,其他的drop
                tcp dport 80 ip  saddr @cf_ipv4 accept;
                tcp dport 80 ip6 saddr @cf_ipv6 accept;
                tcp dport 80 drop;
        }

        chain forward {
                type filter hook forward priority filter;
        }

        chain output {
                type filter hook output priority filter;
        }
}

使其生效

nft -f /etc/nftables.conf

检查规则集合是否正确

nft list set inet filter cf_ipv6
nft list set inet filter cf_ipv4

检查 nftables 是否启动

systemctl status nftables
systemctl enable nftables
systemctl restart nftables

📌 转载信息
原作者:
dhb
转载时间:
2025/12/30 12:15:53