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
    • 最新
    • 标签
主页 / user-698361

Patrik Arven's questions

Martin Hope
Patrik Arven
Asked: 2025-01-11 00:41:47 +0800 CST

nft 忽略 lo 上的数据包吗?

  • 6

我有一个相当标准的 debian 10 系统,设置为路由器 (echo 1 > /proc/sys/net/ipv4/ip_forward),带有一个 WAN (=enp11s0) 接口和一个 DMZ (=enp10s0) 接口。WAN 接口绑定了几个公共 IP 地址,例如

 ip addr add 81.2.3.4/25 brd + dev enp11s0
 ip addr add 81.2.3.5/25 brd + dev enp11s0
 ip addr add 81.2.3.6/25 brd + dev enp11s0
 ip addr add 81.2.3.7/25 brd + dev enp11s0

DMZ 接口分配有一个本地 IP,即 10.2.10.10。下面的服务器名称 zz、zz-dmz 等均在 /etc/hosts 中声明。

我已经设置 NFT 在预路由钩子中执行 DNAT:

flush ruleset

define DMZ = enp10s0
define WAN = enp11s0
define WAN_NET = 81.2.3.0/25

define wan2dmz_map = {
                    www   : www-dmz,
                    zz    : zz-dmz,
                    dns0  : dns0-dmz,
                    dns1  : dns1-dmz,
                    drift78 : drift78-dmz
}

define dmz2wan_map = {
                    www-dmz   : www,
                    zz-dmz    : zz,
                    dns0-dmz  : dns0,
                    dns1-dmz  : dns1,
                    drift78-dmz : drift78
                }


table ip fail2ban {
    chain input {
        type filter hook forward priority 0;
    }
}

table ip global {
    map ip_mapWD {
        type ipv4_addr : ipv4_addr
        elements = $wan2dmz_map
    }
    map ip_mapDW {
        type ipv4_addr : ipv4_addr
        elements = $dmz2wan_map
    }

    # Accepted WAN ports
    chain SRV_ACCEPT {
        ip daddr www-dmz tcp dport {http,https} counter accept
        ip daddr zz-dmz tcp dport {http,https,smtp,pop3,imap2,submission,imaps,465} accept

        ip daddr drift78-dmz accept

        ip daddr dns0-dmz tcp dport 53 accept
        ip daddr dns1-dmz tcp dport 53 accept
    }


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

        iif {lo,$DMZ} accept
        ct state established,related accept
        ct state invalid drop
        ct status dnat accept

        ip saddr 127.0.0.0/8 drop

        ip protocol icmp icmp type echo-request limit rate over 1/second burst 5 packets drop
        ip frag-off & 0x1fff != 0 counter drop
        tcp flags & (fin|syn|rst|ack) != syn ct state new counter drop
        tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn|rst|psh|ack|urg counter drop
        tcp flags & (fin|syn|rst|psh|ack|urg) == 0x0 counter drop
        ip protocol icmp icmp type { echo-request, echo-reply, destination-unreachable, router-solicitation, router-advertisement, tr-problem } accept
    }

    chain output {
        type filter hook output priority 0;
    }

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

        iif {lo, $DMZ} accept
        ct state established,related accept
        ct state invalid drop
        ct status dnat accept

        ip protocol icmp icmp type echo-request limit rate over 1/second burst 5 packets drop
        ip frag-off & 0x1fff != 0 counter drop
        tcp flags & (fin|syn|rst|ack) != syn ct state new counter drop
        tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn|rst|psh|ack|urg counter drop
        tcp flags & (fin|syn|rst|psh|ack|urg) == 0x0 counter drop
        ip protocol icmp icmp type { echo-request, echo-reply, destination-unreachable, router-solicitation, router-advertisement, tr-problem } accept

        # Accept selected dest. ip/ports from WAN
        iif $WAN jump SRV_ACCEPT

        # VPN
        ip saddr 10.8.0.0/8 iifname tun0 accept

        # Log denied on WAN
        iif $WAN log prefix "[NFT] WAN: "
    }

    chain prerouting {
        type nat hook prerouting priority -100; policy accept;

        # Hairpin
        iif {lo,$DMZ} fib daddr type local dnat to ip daddr map @ip_mapWD

        # From WAN, change dest. to DMZ
        iif $WAN ip daddr $WAN_NET counter dnat to ip daddr map @ip_mapWD
    }

    chain postrouting {
        type nat hook postrouting priority 100;

        oif {tun0,$DMZ} counter masquerade;
    }

}

(zz 是服务器 zz 的公网 IP,zz-dmz 是 10.2.10.x 网络上的私有 IP)。

这有效:我可以通过探测 zz 从 WAN 端到达 zz-dmz。我还没有真正尝试过发夹。

现在的问题是:debian 10 机器上的本地服务(例如 exim4)查找公共 IP(“zz”)作为其域的 mx,并尝试连接到其公共 IP,但数据包不会重新路由到 zz-dmz。相反,它们卡在 lo 接口上,从 WAN 接口上的主 IP 地址反弹到公共 IP“zz”,而该 IP(显然)没有本地响应的服务。登录 debian 路由器并输入以下内容即可看到这一点

root@opax:~/firewall# telnet zz 25
Trying 81.2.3.4...
telnet: Unable to connect to remote host: Connection refused

Tcpdump 显示数据包在 lo 上。我以为规则

    iif {lo,$DMZ} fib daddr type local dnat to ip daddr map @ip_mapWD

也会替换 lo 上的目标 IP 并将它们重新路由到 $DMZ?

我错过了什么?

firewall
  • 1 个回答
  • 20 Views

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve