nftables设置nat转发(基于centos8)

nftables具有脚本编程能力,并且使用脚本更新规则具有事务性,要么全部成功,要么全部不成功。这两个特性很有趣,今天用nftables的编程能力来做下nat转发。

nftables脚本

废话不多说,直接上nftables脚本。假设这个脚本在/etc/nftables/diy.nft

#!/usr/sbin/nft -f

define localIP = 172.17.37.225
define remoteIP = xx.xx.xx.xx
define remotePort = xx
define localPort = xx
delete 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 ; }
add rule ip nat PREROUTING tcp dport $localPort counter dnat to $remoteIP:$remotePort
add rule ip nat PREROUTING udp dport $localPort counter dnat to $remoteIP:$remotePort
# masquerade为自动寻找网卡ip
# add rule ip nat POSTROUTING ip daddr $remoteIP tcp dport $remotePort counter masquerade
# add rule ip nat POSTROUTING ip daddr $remoteIP tcp dport $remotePort counter masquerade
add rule ip nat POSTROUTING ip daddr $remoteIP tcp dport $remotePort counter snat to $localIP
add rule ip nat POSTROUTING ip daddr $remoteIP udp dport $remotePort counter snat to $localIP

执行脚本

假设这个脚本在/etc/nftables/diy.nft

chown root /etc/nftables/diy.nft
chmod u+x /etc/nftables/diy.nft
/etc/nftables/diy.nft

这样就将上述脚本执行了。

开机运行以上脚本

前提条件:你的nftables脚本在/etc/nfatables文件夹下

1 编辑/etc/sysconfig/nftables.conf

增加这样一行:

include "/etc/nftables/diy.nft"

2 开机运行该脚本

systemctl enable nftables

3 不重启,立即执行该脚本

systemctl start nftables

一些其他情况

1 关于端口段的nat,只需要在脚本中采取如下表现形式:

nft add rule ip nat PREROUTING tcp dport 20000-30000 counter dnat to 8.8.8.8:20000-30000

要注意,源端口段和目标端口段一定要一样,不然nat会出现不符合预期的情况。

2 nat转发首先需要开启ip_forward功能

    echo "端口转发开启"
    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

参考文档

redhat8 nftables



nftables nat规则生成工具

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

适用于centos8、redhat8、fedora31和支持nftables的debian系linux发行版如debian10

准备工作

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

以下一键完成:

service firewalld stop
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config  
sed -n '/^net.ipv4.ip_forward=1/'p /etc/sysctl.conf | grep -q "net.ipv4.ip_forward=1"
echo 1 > /proc/sys/net/ipv4/ip_forward
if [ $? -ne 0 ]; then
    echo -e "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
fi
yum install -y  nftables

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

使用说明

# 必须是root用户
# sudo su

# 下载可执行文件
wget -O /usr/local/bin/nat http://cdn.arloor.com/tool/dnat
chmod +x /usr/local/bin/nat

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

# 创建systemd服务
cat > /lib/systemd/system/nat.service <<EOF
[Unit]
Description=动态设置nat规则
After=network-online.target
Wants=network-online.target

[Service]
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
systemctl start 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
  • 请确保配置文件符合格式要求,否则程序可能会出现不可预期的错误,包括但不限于你和你的服务器炸掉(认真

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

优势

  1. 实现动态nat:自动探测配置文件和目标域名IP的变化,除变更配置外无需任何手工介入
  2. 支持IP和域名
  3. 以配置文件保存转发规则,可备份或迁移到其他机器
  4. 自动探测本机ip
  5. 开机自启动
  6. 支持端口段

一些需要注意的东西

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

如何停止以及卸载

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

致谢

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

Telegram讨论组

Telegram讨论组 https://t.me/popstary