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 / 问题 / 1083523
Accepted
Alexis
Alexis
Asked: 2021-11-15 07:06:39 +0800 CST2021-11-15 07:06:39 +0800 CST 2021-11-15 07:06:39 +0800 CST

为什么每个人都使用 MASQUERADE/SNAT 而不是 NAPT/PAT?

  • 772

故事

我有一个 VPN 线保护虚拟接口wg0(可以是其他任何东西)和一个物理接口eth0。我想将数据包从 VPN 路由到我的 LAN,或从一个接口路由到另一个接口。

几乎所有的博客、文章、教程都建议使用MASQUERADE或Source NAT仅使用:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

而且,IP masquerade只是一个SNAT(Source NAT),它不会改变源端口。

问题

  • 我认为我应该使用NAPT/PAT是不是错了?
  • 为了完整起见,如何使用 iptables 和/或 nftables 添加 NAPT/PAT 规则?

想法

wg0由主机生成并从(或任何其他虚拟/物理接口)转发的数据包之间可能存在(源端口)冲突。恕我直言,必须使用 NAPT 来避免这些冲突。

RFC 2663,网络地址端口转换 (NAPT)

nat
  • 2 2 个回答
  • 3398 Views

2 个回答

  • Voted
  1. Best Answer
    Dylan
    2021-11-15T07:49:30+08:002021-11-15T07:49:30+08:00

    如果目标可以将其流量路由到源,则不需要 NAT 或 PAT。

    例如,如果 10.8.0.0/24 中的 VPN 客户端想要与 192.168.1.0/24 中的 LAN 设备通信,则不需要 NAT/PAT,只要相关设备可以路由到其他网络(通过它们的网关)。

    当源在 rfc1918(私有 IP)网络中而目标是公共 IP 时,由于 rfc1918 网络无法通过 Internet 路由,因此需要通过 NAT 将私有 IP 替换为公共 IP。这是源地址转换。这项工作可以由 SNAT 完成,而不是 PAT。

    此外,假设 SNAT/MASQUERADE 不更改源端口是错误的。

    --to-source 选项用于指定数据包应使用的源。此选项最简单的方法是采用一个 IP 地址,我们希望将其用作 IP 标头中的源 IP 地址。如果我们想在多个 IP 地址之间进行平衡,我们可以使用一个 IP 地址范围,用连字符分隔。例如,--to--source IP 编号可能类似于上述示例:194.236.50.155-194.236.50.160。我们打开的每个流的源 IP 将从这些流中随机分配,并且单个流将始终对该流中的所有数据包使用相同的 IP 地址。我们还可以指定 SNAT 使用的端口范围。然后,所有源端口将被限制在指定的端口中。规则的端口位将类似于上面的示例:1024-32000。如果可能,iptables 将始终尝试避免进行任何端口更改,但如果两台主机尝试使用相同的端口,iptables 会将其中一个映射到另一个端口。如果未指定端口范围,则如果需要,则将所有 512 以下的源端口映射到 512 以下的其他端口。源端口 512 和 1023 之间的端口将映射到 1024 以下的端口。所有其他端口将映射到1024或以上。如前所述,iptables 将始终尝试维护建立连接的实际工作站使用的源端口。请注意,这与目标端口无关,因此如果客户端尝试与防火墙外的 HTTP 服务器建立联系,它将不会映射到 FTP 控制端口。

    https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#SNATTARGET

    请注意,如果您的设备想要访问给定目标端口上的远程服务器,则操作系统可能已经分配了超过 1024 的随机源端口。在端口 443 上访问远程 HTTPS 服务器并不涉及源端口是443.

    • 6
  2. Nikita Kipriyanov
    2021-11-15T11:30:24+08:002021-11-15T11:30:24+08:00

    SNAT/MASQUERADE您在和之间有某种错误的区别NAPT/PAT。它不在那里。

    在 Linux 中,有两种类型的动态 NAT 规则,你称之为“NAPT”:

    • 源 NAT,它打算保持目标地址不变,只更改源地址。有时它也会改变源端口。例如,如果连接跟踪表已经包含带有这个特定(proto, src-addr, src-port, dst-addr, dst-port)元组的记录(src-addr 和 src-port 是经过翻译的),则为能够区分哪个是哪个,新的翻译必须使用另一个src-port(因为这是唯一的自由度),所以“NAPT”将不可避免地发生。SNAT 类型规则的示例是SNAT和MASQUERADE。它们之间的区别在于,使用 SNAT,您需要在规则中指定翻译成哪个地址(可能还有要使用的端口范围),而使用 MASQUERADE,它会根据数据包注定要出口的接口自行做出选择。POSTROUTING在进行了大多数其他处理之后,包括数据包的路由,它们都将被安装到链中。这种类型的规则用于允许许多计算机隐藏在单个出口 IP 地址后面,例如访问 Internet 的 LAN 等等。如果您打算通过 VPN 访问 Internet,这也将包括任何 VPN 用户。
    • 目标 NAT,它保持源地址不变,只更新目标地址,如果您配置了目标端口,那么这也是“NAPT”规则。这种类型的规则是DNAT, REDIRECT,CLUSTERIP可能还有一些其他的,我不记得全部了;这些被安装到PREROUTING链中,因为路由决策通常应该在规则的影响下改变。最初发往机器本身(将其地址作为目的地)并被遍历INPUT并到达某个本地进程的数据包正在被转换,并且在遍历之后FORWARD链它被进一步转发到其他系统。或相反亦然。去哪里,INPUT 或 FORWARD,是我们必须根据规则更改的路由决策。此类规则用于从 Internet 访问某些内部系统。

    有时,顺便说一句,这两个规则都可能用于单个数据包(和连接)。这是一种特殊情况,但如果您需要来自某个外部系统的数据包(因此 DNAT 必须在 PREROUTING 中使用)显示为来自某个内部地址(为此在 POSTROUTING 中使用 SNAT),这是一种特殊情况。

    在 Linux 中也有静态 NAT 类型的规则NETMAP,例如非常特殊且很少使用的规则。我怀疑您是否在谈论它,并且您是否看过任何提到此类规则的方法。

    Linux完全没有区分私有(RFC1918)和公共地址。如果您愿意,您可以对您的公共子网进行 NAT(但这会浪费地址)。您可以保留私有 IP 而不进行转换(但这通常会导致它们无法连接 Internet)。

    VPN 只不过是机器中的附加网络接口,应该这样对待。因此,如果您有公共地址,则允许您使用 VPN 的公共地址。例如,我可能有一些 /29 子网由 VPN 路由器路由并设置 OpenVPN,因此整个公共子网将成为我的 VPN 网络!虽然 OpenVPN 示例看起来很虚假,但 WireGuard更有可能是这样配置的。例如,新的命名空间解决方案允许wireguard 成为系统中的唯一接口。如果要求系统直接拥有一个公共 IP(我不会讨论这个要求可能来自的任何原因),那么您最终将不可避免地在 VPN 中使用公共 IP!最有可能的是,他们没有任何 NAT。

    • 6

相关问题

  • 为 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