AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1067610
Accepted
ufk
ufk
Asked: 2021-06-24 11:24:11 +0800 CST2021-06-24 11:24:11 +0800 CST 2021-06-24 11:24:11 +0800 CST

将我的 linux 配置为路由器,如何使用 nftables 启用端口转发?

  • 772

我正在尝试将我的 Gentoo Linux 配置为路由器。

这是我到目前为止的配置。

WAN网卡是enp3s0和LAN网卡是enp1s0f0

接受来自 LAN 的连接到 ICMP、tcp 端口 53、22、80、443、445、5900 和 udp 端口​​ 53、67、68

接受来自 WAN 的 SSH 端口 22 的连接

这些工作很好,我没有做的是创建端口转发。

我正在尝试设置,如果端口 222 上的连接来自 WAN,则将其转发到192.168.1.2端口上具有 ip 地址的机器,22并且此规则不会产生错误,但也不允许我连接。

这是我的配置:

table ip filter {
    chain input {
        type filter hook input priority filter; policy accept;
        ct state { established, related } accept
        iif "lo" accept
        iif "enp1s0f0" tcp dport { 22, 53, 80, 443, 445, 5900 } counter packets 0 bytes 0 log accept
        iif "enp3s0" tcp dport { 22 } counter packets 0 bytes 0 log accept
        iif "enp1s0f0" udp dport { 53, 67, 68 } accept
        iif "enp1s0f0" ip protocol icmp accept
        counter packets 1 bytes 259 drop
    }

    chain output {
        type filter hook output priority filter; policy accept;
        ct state { established, related, new } accept
        iif "lo" accept
    }

    chain forward {
        type filter hook forward priority filter; policy accept;
        iif "enp3s0" oif "enp1s0f0" ct state { established, related } accept
        iif "enp1s0f0" oif "enp3s0" accept
        iif "enp3s0" oif "enp1s0f0" counter packets 0 bytes 0 drop
    }

    chain postrouting {
        type filter hook postrouting priority filter; policy accept;
    }
}
table ip nat {
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        oifname "enp3s0" masquerade
    }

    chain prerouting {
        type nat hook prerouting priority 100; policy accept;
        iif "enp3s0" tcp dport { 222 } dnat to 192.168.1.2:22  ### <- PORT FORWARDING RULE HERE
    }
}

我该如何纠正这个问题?

谢谢你。

firewall linux nat nftables
  • 1 1 个回答
  • 703 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2021-06-24T14:12:46+08:002021-06-24T14:12:46+08:00

    一旦新流的第一个数据包(因此状态为 NEW)遍历nat 预路由链,dnat就会发生,并且随着新的目的地数据包被路由并遍历过滤器转发链。

    然后这条规则删除它:

            iif "enp3s0" oif "enp1s0f0" counter packets 0 bytes 0 drop
    

    需要一个允许第一个数据包(未处于已建立状态)的规则。

    这可以以第一种天真的方式插入到删除规则之前:

    iif "enp3s0" oif "enp1s0f0" ip daddr 192.168.1.2 tcp dport 22 accept
    

    并且由于特定的拓扑:192.168.1.0/24 LAN 不可路由,因此默认情况下无法从 Internet 访问,这可能就足够了(从技术上讲,下一跳路由器可以作弊并直接到达 192.168.1.2:22 NAT)。但是如果系统没有做任何伪装(并且有一个可路由的 LAN 而不是 192.168.1.0/24),这将使服务可以直接访问。

    实际上有一个更简单和更安全的方法,如果其他一些端口也被dnat -ed 并且所有这些dnat规则都是允许的,那么它也更通用:添加一个允许任何经过dnat转换的数据包的规则。在等效的iptables-extensions ' conntrack match中更详细:

    脱氧核糖核酸

    一个虚拟状态,如果原始目标与回复源不同,则匹配。

    只需将其插入到最后一个丢弃规则之前的过滤器中:

    ct status dnat accept
    

    或者更准确地说:

    iif enp3s0 oif enp1s0f0 ct status dnat accept
    

    非常精确:

    iif enp3s0 oif enp1s0f0 ct state new ct status dnat ip daddr 192.168.1.2 tcp dport 22 accept
    

    此状态只能因为先前对流执行的dnat规则而出现,因此它验证意图:接受。


    笔记:

    • 没有必要为不同的钩子类型(filter和nat)使用不同的表,只要它是关于同一个系列(这里是ip)。

      这是从iptables继承的一个习惯,可能会限制可能性。例如,集合的范围是一个表。在过滤器链和nat链之间使用相同的集合要求它们位于同一个表中(定义集合的地方)。可悲的是,即使来自 wiki 的许多示例仍然使用模仿iptables的命名约定。

    • 虽然在这里无关紧要,但nat 预路由的历史优先级不是 100 而是 -100(又名dstnat)。

      只有存在其他表也包括nat 预路由链,或者是否一起使用iptables nat规则(在这种情况下,建议使用 -101 或 -99 而不是 -100),以确定哪些规则需要优先级。

    • 3

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve