Coder Social home page Coder Social logo

nftables-nat-rust's Introduction


基于nftables的端口转发管理工具

用途:便捷地设置nat流量转发

适用于centos8及以后的redhat系发行版和支持nftables的debian系linux发行版如debian10

优势

  1. 实现动态nat:自动探测配置文件和目标域名IP的变化,除变更配置外无需任何手工介入
  2. 支持IP和域名
  3. 支持单独转发tcp或udp
  4. 支持转发到本机其他端口(nat重定向)【2023.1.17更新】
  5. 以配置文件保存转发规则,可备份或迁移到其他机器
  6. 自动探测本机ip
  7. 支持自定义本机ip【2023.1.17更新】
  8. 开机自启动
  9. 支持端口段
  10. 轻量,只依赖rust标准库

准备工作

  1. 关闭firewalld
  2. 关闭selinux
  3. 开启内核端口转发
  4. 安装nftables(一般情况下,centos8默认包含nftables)

以下一键完成:

# 关闭firewalld
service firewalld stop
systemctl disable firewalld
# 关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config  
# 修改内存参数,开启端口转发
echo 1 > /proc/sys/net/ipv4/ip_forward
sed -i '/^net.ipv4.ip_forward=0/'d /etc/sysctl.conf
sed -n '/^net.ipv4.ip_forward=1/'p /etc/sysctl.conf | grep -q "net.ipv4.ip_forward=1"
if [ $? -ne 0 ]; then
    echo -e "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
fi
# 确保nftables已安装
yum install -y  nftables

debian系说明 请自行使用apt安装nftables,并禁用iptables

使用说明

# 必须是root用户
# sudo su
# 下载可执行文件
curl -sSLf http://cdn.arloor.com/tool/dnat -o /tmp/nat
# curl -sSLf https://github.com/arloor/nftables-nat-rust/releases/download/v1.0.0/dnat -o /tmp/nat
install /tmp/nat /usr/local/bin/nat

# 创建systemd服务
cat > /lib/systemd/system/nat.service <<EOF
[Unit]
Description=dnat-service
After=network-online.target
Wants=network-online.target

[Service]
WorkingDirectory=/opt/nat
EnvironmentFile=/opt/nat/env
ExecStart=/usr/local/bin/nat /etc/nat.conf
LimitNOFILE=100000
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target
EOF

# 设置开机启动,并启动该服务
systemctl daemon-reload
systemctl enable nat

mkdir /opt/nat
touch /opt/nat/env
# echo "nat_local_ip=10.10.10.10" > /opt/nat/env #自定义本机ip,用于多网卡的机器

# 生成配置文件,配置文件可按需求修改(请看下文)
cat > /etc/nat.conf <<EOF
SINGLE,49999,59999,baidu.com
RANGE,50000,50010,baidu.com
EOF

systemctl restart nat

配置文件说明

/etc/nat.conf如下:

SINGLE,49999,59999,baidu.com
RANGE,50000,50010,baidu.com
  • 每行代表一个规则;行内以英文逗号分隔为4段内容
  • SINGLE:单端口转发:本机49999端口转发到baidu.com:59999
  • RANGE:范围端口转发:本机50000-50010转发到baidu.com:50000-50010
  • 请确保配置文件符合格式要求,否则程序可能会出现不可预期的错误,包括但不限于你和你的服务器炸掉(认真
  • # 开始的行会被当成注释

高级用法:

  1. 转发到本地:行尾域名处填写localhost即可,例如SINGLE,2222,22,localhost,表示本机的2222端口重定向到本机的22端口。
  2. 仅转发tcp/udp流量:行尾增加tcp/udp即可,例如SINGLE,10000,443,baidu.com,tcp表示仅转发tcp流量,SINGLE,10000,443,baidu.com,udp仅转发udp流量

如需修改转发规则,请vim /etc/nat.conf以设定你想要的转发规则。修改完毕后,无需重新启动vps或服务,程序将会自动在最多一分钟内更新nat转发规则(PS:受dns缓存影响,可能会超过一分钟)

一些需要注意的东西

  1. 本工具在centos8、redhat8、fedora31上有效,其他发行版未作测试
  2. 与前作arloor/iptablesUtils不兼容,在两个工具之间切换时,请重装系统以确保系统纯净!

如何停止以及卸载

## 停止定时监听域名解析地任务
service nat stop
## 清空nat规则
nft add table ip nat
nft delete table ip nat
## 禁止开机启动
systemctl disable nat

致谢

  1. 解决会清空防火墙的问题
  2. ubuntu18.04适配

常问问题

关于trojan转发

总是有人说,不能转发trojan,这么说的人大部分是证书配置不对。最简单的解决方案是:客户端选择不验证证书。复杂一点是自己把证书和中转机的域名搭配好。

小白记住一句话就好:客户端不验证证书。

用于多网卡的机器时,如何指定用于转发的本机ip

可以执行以下脚本来自定义本机ip,该示例是将本机ip定义为10.10.10.10

echo "nat_local_ip=10.10.10.10" > /opt/nat/env

如何查看最终的nftables规则

nft list ruleset

查看日志

执行

cat /opt/nat/nat.log

或执行

journalctl -exfu nat

联系

Telegram

赏个鸡腿吧

nftables-nat-rust's People

Contributors

arloor avatar epizza avatar hynor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nftables-nat-rust's Issues

不支持 TCP DNS

在封禁 UDP 外网的机器上,编辑 /etc/resolv.conf 启用 TCP DNS 后对转发不生效。
仍然无法解析 /etc/nat.conf 中的域名。

希望可以自定义本机ip

尽管现在可以自动探测本机ip,但是在多网卡的机器上就不方便使用了,比如两台通过iplc内网连接的机器,希望能加一个命令行参数手动指定

Does this utility support IPv6?

I tried adding 'SINGLE,30010,5001,fe80::211:32ff:fe82:5c7b' in /etc/nat.conf, No rule was added.
Am I missing something here?

`flush table ip nat` 替代 `flush ruleset`

/etc/nftables/nat-diy.nftflush ruleset 会清空全部 nftables 规则,是否考虑把 flush ruleset 替换成 flush table ip nat,这样清空 nftables 的规则仅限于 nftables-nat-rust 生成的,不会影响其他规则,同时无论 /etc/nftables/nat-diy.nft 是否已经载入转发规则都可以正常加载。

#!/usr/sbin/nft -f

add table ip nat
flush table ip nat

add table ip nat
add chain nat PREROUTING { type nat hook prerouting priority -100 ; }
add chain nat POSTROUTING { type nat hook postrouting priority 100 ; }

请求:提供 IPv6 支持

如题,现有的设计只能产生 IPv4 的 TCP/UDP 的转发脚本,而 nftables 本身也支持 IPv6 间的转发,可否增加脚本对这方面的解析和支持呢?

兼容下tailscale。。。

tailscale 会在 table ip nat 中增加项 ,如果采用
delete table ip nat 貌似会影响到 tailscale的工作。。。
image

nft无法正常启动

本机Centos7,正常安装运行nftables-nat-rust,运行/usr/local/bin/nat /etc/nat.conf 也正常显示规则列表,接着我手动添加nft规则 /usr/sbin/nft -f /etc/nftables/nat-diy.nft 时候会显示 Unable to initialize Netlink socket: Protocol not supported

记一下Ubuntu20上踩过的坑,供参考

lsmod | grep '^nf'
运行这个命令看看你的内核有没有nftables支持,nft_nat 模块等必须有。如果没有,先换内核再进行其他步骤
没有内核支持,运行/usr/local/bin/nat /etc/nat.conf能看到 Error: Could not process rule: Operation not supported错误

调整nf_conntrack hashsize参数,重启服务器后nft list ruleset没有规则

调整了以下参数,重启之后发现没有规则生成,经排查是因为设置了/etc/modprobe.d/nf_conntrack_hashsize.conf 这个导致的,如果我需要设置该参数,怎么能不出问题呢

/etc/sysctl.conf

net.netfilter.nf_conntrack_max = 262144
cat > /etc/modprobe.d/nf_conntrack_hashsize.conf << "EOF"
options nf_conntrack hashsize = 262144
EOF

没有端口监听

systemctl status nat
● nat.service - 动态设置nat规则
Loaded: loaded (/lib/systemd/system/nat.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Sat 2020-02-29 09:30:32 UTC; 23s ago
Process: 9454 ExecStart=/usr/local/bin/nat /etc/nat.conf (code=exited, status=101)
Main PID: 9454 (code=exited, status=101)

程序看起来是运行的,但是指定需要转发的端口并没有处于监听状态(运行 netstat -nap 命令查询)。 目前我的TCP转发主要靠HAPROXY实现,但UDP转发是一个难点。不知是否我对这个程序的理解有哪里不对?希望作者解答。(Ubuntu 18.0.4LTS,无iptable,无fairwalld,无selinux)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.