Ubuntu 路由器使用 nftables 阻止流量

Ubuntu 路由器使用 nftables 阻止流量

我正在尝试在 Ubuntu 中设置一个简单的路由器。有两个网络接口:eth0 - 连接到互联网的有线网络接口,wlan0 - 配置为 IP 地址为 10.0.9.1 的 AP。

IPv4 转发已启用。

我使用 dnsmasq 进行以下配置:

interface=wlan0
dhcp-range=10.0.9.2,10.0.9.30,255.255.255.0,12h
dhcp-host=40:a3:6b:c1:9a:54,10.0.9.100

设备连接到我的 AP 并正确获取分配的 IP 地址。

现在配置 NAT。我的 nftables 配置如下所示:

table ip nat {
        chain prerouting {
                type nat hook prerouting priority dstnat; policy accept;
                iif "eth0" tcp dport 8010 dnat to 10.0.9.100:80
                iif "eth0" tcp dport 9001 dnat to 10.0.9.100:9001
        }

        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                oif "eth0" masquerade
        }
}

此设置按预期工作:

  • 连接到 wlan0 的设备可以通过 eth0 访问互联网
  • 连接到 wlan0 的设备可以连接到路由器上 10.0.9.1 的服务器
  • 可以通过 eth0 在端口 8010 和 9001 上访问 IP 10.0.9.1.100 的设备

但是,我想设置一个简单的防火墙来保护设备免受未经授权的访问。这是我添加到 nftables 配置中的内容:

table inet filter {
        chain input {
                type filter hook input priority filter; policy drop;
                ct state vmap { established : accept, related : accept, invalid : drop }
                iifname lo accept
                icmp type echo-request limit rate 5/second accept
                ip protocol icmp drop

                iif "eth0" tcp dport { ssh, 8080 } accept
        }

        chain forward {
                type filter hook forward priority 0; policy drop;

                ct status dnat accept
                iif "wlan0" oif "wlan0" accept
                iif "wlan0" oif "eth0" accept
                iif "eth0" oif "wlan0" ct state established,related accept
        }

        chain output {
                type filter hook output priority filter; policy accept;
        }
}

此设置未按预期工作:

  • 连接到 wlan0 的设备不能通过 eth0 访问互联网
  • 连接到 wlan0 的设备不能连接到路由器上的服务器 10.0.9.1
  • 可以通过 eth0 在端口 8010 和 9001 上访问 IP 10.0.9.1.100 的设备

如果我禁用 nfconfig 中的所有保护,它会按预期工作:

table inet filter {
        chain input {
                type filter hook input priority filter; policy accept;
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
        }

        chain output {
                type filter hook output priority filter; policy accept;
        }
}

当我编辑该chain input部分时,事情就停止了。

我对 nftables 完全陌生,我花了一整天的时间试图弄清楚如何让它工作。有任何想法吗?

谢谢!

答案1

向前链确实允许从无线 LAN 转发到互联网。整个规则集不允许的是查询域名解析路由器上的内置 DNS 服务器无线局域网0。默认情况下,此 DNS 服务器是为 DHCP 部分中的客户端配置的域名解析

此类 DNS 流不会被转发,因此不会使用向前钩。这是接收到的传入流输入钩。如果没有 DNS,无线节点虽然可以连接到 Internet,但无法解析连接到何处,因此总体效果将相同:没有 Internet。

允许路由器的服务在查询时可用无线局域网0,从而包括 DNS 查询:

nft add rule inet filter input iif wlan0 accept

除非放置在规则之前,否则这将获得 ping 的速率限制ip protocol icmp。无论如何,这条ip protocol icmp drop规则是不需要的,并且可以删除,因为默认策略已经是降低,除非打算过滤从无线节点接收到的流量。

如果使用 (a) 更严格的规则仅允许少数服务,则至少 53/TCP+UDP 用于 DNS,端口 67/UDP 用于 DHCP,以防万一域名解析不完全依赖于 DHCP 的原始套接字应该被允许无线局域网0

相关内容