Red Hat Training

A Red Hat training course is available for RHEL 8

10.8. 使用 nftables 配置端口转发

端口转发可让管理员将发送到特定目的端口的数据包转发到不同的本地或者远程端口。

例如,如果您的 web 服务器没有公共 IP 地址,您可以在防火墙上设置一条端口转发规则,将防火墙上端口 80443 上的传入数据包转发到 web 服务器。使用这个防火墙规则,互联网中的用户可以使用防火墙的 IP 或主机名访问网页服务器。

10.8.1. 将传入的数据包转发到不同的本地端口

您可以使用 nftables 来转发数据包。例如,您可以将端口 8022 上的传入 IPv4 数据包转发到本地系统上的端口 22

流程

  1. 创建一个名为 nat 、具有 ip 地址系列的表:

    # nft add table ip nat
  2. 向表中添加 preroutingpostrouting 链:

    # nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
    注意

    -- 选项传递给 nft 命令,以防止 shell 将负优先级值解析为 nft 命令的选项。

  3. prerouting 链中添加一条规则,将端口 8022 上的传入数据包重定向到本地端口 22

    # nft add rule ip nat prerouting tcp dport 8022 redirect to :22

10.8.2. 将特定本地端口上传入的数据包转发到不同主机

您可以使用目标网络地址转换(DNAT)规则将本地端口上传入的数据包转发到远程主机。这可让互联网上的用户访问运行在具有私有 IP 地址的主机上的服务。

例如,您可以将本地端口 443 上的传入 IPv4 数据包转发到 IP 地址为 192.0.2.1 的远程系统上的同一端口号。

前提条件

  • 您以 root 用户身份登录应该转发数据包的系统上。

流程

  1. 创建一个名为 nat 、具有 ip 地址系列的表:

    # nft add table ip nat
  2. 向表中添加 preroutingpostrouting 链:

    # nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
    # nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
    注意

    -- 选项传递给 nft 命令,以防止 shell 将负优先级值解析为 nft 命令的选项。

  3. prerouting 链添加一条规则,该规则将端口 443 上的传入数据包重定向到 192.0.2.1 上的同一端口:

    # nft add rule ip nat prerouting tcp dport 443 dnat to 192.0.2.1
  4. postrouting 链中添加一条规则来伪装出站流量:

    # nft add rule ip nat postrouting daddr 192.0.2.1 masquerade
  5. 启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf