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

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

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

这是我目前的配置。

WAN NIC 是enp3s0,LAN NIC 是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
    }
}

我该如何解决这个问题?

谢谢。

答案1

一旦新流的第一个数据包(因此状态为 NEW)穿过nat 预路由链,基因发生这种情况,数据包将通过新的目的地进行路由并穿越向前过滤链。

然后这条规则就会把它丢弃:

        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)这将使服务直接可达。

其实有一种更简单、更安全的方法,也更通用,以防其他端口也基因-ed 以及所有此类基因规则全部允许:添加允许的规则任何经过基因转型. 更详细的内容是等效的iptables-扩展连接跟踪匹配

基因转移酶

虚拟状态,如果原始目的地与答复源不同则匹配。

只需将其插入向前过滤最后一次之前降低规则:

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

此状态只能由于先前基因规则在流程上完成,因此它验证了意图:接受。


笔记:

  • 没有必要对不同的钩子类型使用不同的表(筛选纳特)只要是关于同一个家族的(知识产权这里)。

    这是从iptables这可能会限制可能性。例如,是一个表。在筛选链和纳特链要求它们位于同一张表中(其中已定义)。遗憾的是,甚至来自 wiki 的许多示例仍然使用模仿的命名约定iptables

  • 虽然在这里这并不重要,但历史优先权nat 预路由不是 100 而是 -100(又名目的地地址)。

    只有当其他表也包括时才会有关系nat 预路由链或如果iptables 纳特规则一起使用(在这种情况下建议使用 -101 或 -99 而不是精确的 -100),以确定哪些规则优先。

相关内容