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 / 问题 / 1144741
Accepted
TCB13
TCB13
Asked: 2023-09-29 20:06:25 +0800 CST2023-09-29 20:06:25 +0800 CST 2023-09-29 20:06:25 +0800 CST

nftables:具有动态 IP 的发夹/环回 NAT

  • 772

我有一个 Debian 12 服务器(公共 IP85.xxx.xxx.xxx地址为enp6s0),在网桥上运行一堆 LXC 容器cbr0。

由于公共 IP 是动态的,我必须设置forward规则prerouting才能dnat使传入请求到达容器。例如。端口 80/443 已连接到容器10.10.0.1。这是我的nftables规则:

flush ruleset

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

    ct state {established, related} accept
    iifname lo accept
    iifname cbr0 accept
    ip protocol icmp accept
    ip6 nexthdr icmpv6 accept
  }
  chain forward {
    type filter hook forward priority 0; policy accept;
  }
  chain output {
    type filter hook output priority 0;
  }
}

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

    oifname enp6s0 iifname cbr0 accept
    iifname enp6s0 oifname cbr0 ct state related, established accept
    # Webproxy
    iifname enp6s0 oifname cbr0 tcp dport 80 accept
    iifname enp6s0 oifname cbr0 udp dport 80 accept
    iifname enp6s0 oifname cbr0 tcp dport 443 accept
    iifname enp6s0 oifname cbr0 udp dport 443 accept
  }
}

table ip nat {

  chain postrouting {
    type nat hook postrouting priority 100; policy accept;
  }

  chain prerouting {
    type nat hook prerouting priority -100; policy accept;
    # Webproxy
    iifname enp6s0 tcp dport 80 dnat to 10.10.0.1:80
    iifname enp6s0 udp dport 80 dnat to 10.10.0.1:80
    iifname enp6s0 tcp dport 443 dnat to 10.10.0.1:443
    iifname enp6s0 udp dport 443 dnat to 10.10.0.1:443
  }

}

现在的问题是:发夹NAT。我有多个容器托管网站,有时其中一些容器需要使用域名与其他容器进行通信。当他们对这些域运行 DNS 查询时,他们将获取主机 IP 并且通信失败:

发夹NAT

如何在不诉诸 DNS 攻击的情况下解决这种情况?有没有办法nftables在拥有动态IP的情况下设置在内部转发请求?上面的内容是如何实现iifname的呢?

谢谢。

nat
  • 2 2 个回答
  • 120 Views

2 个回答

  • Voted
  1. Tomek
    2023-09-30T05:18:16+08:002023-09-30T05:18:16+08:00

    您可能需要的是 nft 手册页中的“FIB EXPRESSION”。这是我用于 DNAT 的规则(您需要根据您的设置进行调整):

        chain PREROUTING {
                type nat hook prerouting priority dstnat; policy accept;
                iiftype ppp fib daddr type local dnat ip to meta l4proto . th dport map @PRE-DNAT-IPV4
        }
    

    fib daddr type localdaddr是与任何匹配 NAT 框地址的部分相匹配的部分。

    请注意,您可能还需要提供适当的 SNAT 映射才能使其正常工作(因为返回数据包可能会直接发送到具有内部源地址的桥接口,该地址与虚拟机上的任何连接都不匹配)。

    • 1
  2. Best Answer
    TCB13
    2023-10-01T07:24:23+08:002023-10-01T07:24:23+08:00

    好吧,我设法解决了这个问题并简化了我的配置。

    1. 该forward链不需要明确接受特定端口的流量,我可以告诉它dnat稍后转发具有特定规则的任何内容:
    table ip filter {
      chain forward {
        type filter hook forward priority 0; policy drop;
        # cbr0->anywhere (including to itself)
        iifname cbr0 accept
        # publicif->cbr0 only related connections
        iifname enp6s0 oifname cbr0 ct state related, established accept
        # publicif->cbr0 allow fwd for things that have dnat rules
        iifname enp6s0 oifname cbr0 ct status dnat accept
      }
    }
    
    1. 使用此处描述的 FIB 表达式。并确保流量dnat可以来自enp6s0和cbr0:
    table ip nat {
    
      chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        ip saddr 10.0.0.0/24 masquerade
      }
    
      chain prerouting {
        type nat hook prerouting priority -100; policy accept;
    
        # Webproxy
        iifname { enp6s0, cbr0 } tcp dport { 80, 443 } fib daddr type local dnat to 10.0.0.1
        iifname { enp6s0, cbr0 } udp dport { 80, 443 } fib daddr type local dnat to 10.0.0.1
     
      }
    
    }
    

    现在一切似乎都正常了,但是有一个小细节:当我的 webproxy 容器从互联网 ( enp6s0) 获取请求时,它会将真实的远程计算机 IP 记录为这些请求的源,但是当它们来自另一个容器时,源 IP 显示为 10.0 .0.254 这是 .0.254 中主机的 IP cbr0。

    • 1

相关问题

  • 为 Cisco ASA 5510 上的端口 443/80 创建 NAT 规则和安全策略

  • Linux 路由器上的 NAT GRE(IP 协议 47)

  • OCS 2007 R2 A/V NAT - 外部客户端尝试内部 IP

  • 为什么我无法从我的win2008 NAT 后面连接到某些ftp 服务器?

  • 隧道 Xbox 网络流量 [关闭]

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