自用的 nftables 端口转发工具,主要用于 Debian / Ubuntu 服务器。
默认读取本地配置文件 /etc/nat.conf,配置写法尽量简单:
本地端口:远程IP或域名:远程端口
保存配置文件后,服务会自动检测变更并重新加载 nftables 规则。
- 默认本地配置:
/etc/nat.conf - 简化转发格式:
本地端口:远程IP或域名:远程端口 - 默认转发类型:
single - 默认协议:
all - 默认 IP 版本:
all - 支持 IPv4 / IPv6
- 支持域名解析
- 支持 systemd 开机自启
- 兼容旧格式和 TOML 格式
默认安装简化配置模式:
bash <(curl -sSLf https://raw.githubusercontent.com/Taylor000/nftables-nat-rust/master/setup.sh)停止并取消 nat.service 开机自启,移除本项目生成的 nftables 规则,保留程序和 /etc/nat.conf:
bash <(curl -sSLf https://raw.githubusercontent.com/Taylor000/nftables-nat-rust/master/clear-rules.sh)完整卸载 nat.service、程序文件,并清理本项目生成的 nftables 规则。默认保留 /etc/nat.conf:
bash <(curl -sSLf https://raw.githubusercontent.com/Taylor000/nftables-nat-rust/master/uninstall.sh)如果连配置文件也要一起删:
REMOVE_NAT_CONFIG=1 bash <(curl -sSLf https://raw.githubusercontent.com/Taylor000/nftables-nat-rust/master/uninstall.sh)两个项目共用 /etc/nat.conf。如果当前使用 Realm,执行:
bash <(curl -sSLf https://raw.githubusercontent.com/Taylor000/nftables-nat-rust/master/switch-to-nft.sh)脚本会备份并保留 /etc/nat.conf,停止并禁用 realm.service,然后安装并启动 nat.service。
执行一键安装或切回 nft 后,nat.service 会重新读取 /etc/nat.conf 并恢复开机自启。
安装脚本会自动完成这些步骤:
- 安装基础依赖:
curl、nftables - 启用
nftables - 尝试关闭旧的
iptables/ip6tables服务 - 下载并安装
/usr/local/bin/nat - 创建
/etc/nat.conf - 创建并启动
nat.service
一般不需要手动执行。排查环境问题时可以单独运行:
apt update
apt install -y curl nftables
systemctl enable --now nftables
systemctl disable --now iptables 2>/dev/null || true
systemctl disable --now ip6tables 2>/dev/null || true安装后会创建:
- 程序:
/usr/local/bin/nat - 配置:
/etc/nat.conf - 示例:
/etc/nat_example.conf - 服务:
nat.service
编辑 /etc/nat.conf:
vim /etc/nat.conf最简单的格式:
# 本机 10000 端口转发到 1.2.3.4:443
10000:1.2.3.4:443
# 本机 10001 端口转发到 example.com:443
10001:example.com:443
# IPv6 地址建议加中括号
10002:[2001:db8::1]:443
这类配置会自动转换成程序内部支持的:
type = "single"
protocol = "all"
ip_version = "all"修改并保存 /etc/nat.conf 后,服务会自动重新加载规则,不需要手动重启。
如果需要端口段、指定协议、本地重定向或 Drop 规则,仍然可以在 /etc/nat.conf 里使用旧格式:
# 单端口转发
SINGLE,10000,443,example.com,tcp,all
# 端口段转发
RANGE,20000,20100,example.com,tcp,all
# 本地重定向
REDIRECT,8080,3128,all,all
# Drop 规则
DROP,input,src_ip=1.2.3.4,dst_port=22,tcp
TOML 模式仍然保留:
bash <(curl -sSLf https://raw.githubusercontent.com/Taylor000/nftables-nat-rust/master/setup.sh) toml# 查看状态
systemctl status nat
# 启动
systemctl start nat
# 停止
systemctl stop nat
# 重启
systemctl restart nat
# 开机自启
systemctl enable nat
# 实时日志
journalctl -fu natforward-statusnft list ruleset
nft list table ip self-nat
nft list table ip6 self-natss -lntp 看不到这些转发端口是正常的。这个工具创建的是 nftables DNAT 规则,不会启动进程监听本地端口。
如果日志里只看到类似下面的内容,说明配置行被注释了,不会生成转发规则:
# 33351:node.example.com:33344
有效规则不要带 #:
33351:node.example.com:33344
如果用 vi / vim 编辑时,回车后下一行自动出现 #,这是编辑器的自动续注释功能。可以在 vim 里执行:
:set formatoptions-=r formatoptions-=o也可以直接删掉行首的 #,确保真正的转发行长这样:
33351:node.example.com:33344
REDIRECT工作在PREROUTING链,只对外部访问有效,本机访问不会触发。- Docker v28 可能把
FORWARD默认策略设为DROP,程序会自动调整为ACCEPT。 - 从旧版 iptables 工具迁移时,建议先清理旧规则,避免规则互相影响。