在一个简单的网络上,当我使用 DNS(例如 foo.com)访问 LAN 内的服务器时,我的 nginx 日志将是网关地址(10.0.0.1)而不是内部客户端地址(10.0.0.19)。
我想阅读更多关于此内容的文章,但我不知道它叫什么。有没有一个术语来描述“路由器注意到您正试图访问网络外部的资源,并将您的 IP 地址替换为网关地址”?如果这只是一个标准的事情,有没有文章可以让我阅读更多内容?我不太明白为什么会发生这种情况,但感觉就像是一个我不知道名字的路由器“功能”。
由于 FROM 地址是网关,回复将发送到路由器(然后返回到本地客户端),而不是仅使用交换机。这不是很好,因为由于路由器运行防火墙功能,LAN 交换机的吞吐量比路由器高得多。
这是一个相当简单的网络设置:
WAN - (70.x)Router(10.0.0.1) - Switch - (10.0.0.3) Server
- (10.0.0.19) Client
在局域网内的一台计算机(客户端 10.0.0.19)上,我向 foo.com 发出请求。foo.com 的 DNS 指向路由器上的 WAN 接口,该接口具有到服务器的端口转发设置。服务器内的 nginx 显示请求来自 10.0.0.1,而不是 10.0.0.19。
如果请求来自 WAN,那么 nginx 日志将显示预期数据。
如果相关的话,路由器是一个 ubiquiti USG,后面有一个 ubiquiti 交换机。
答案1
“路由器注意到您正试图访问网络外部,网络内部的资源,并用网关地址替换您的 IP 地址”?
这是 NAT(网络地址转换)的变体,称为 NAPT(网络地址端口转换)。有些人称之为 PAT(端口地址转换),因为大型供应商这样称呼它,但是RFC 2663,IP 网络地址转换器 (NAT) 术语和注意事项解释一下。当你想让它在内部回环时,根据供应商的不同,会调用各种东西(发夹路由、NAT 反射等),而且这非常浪费路由器资源。
有各种资源,包括 RFC。例如,RFC 3022,传统 IP 网络地址转换器(传统 NAT)有2.2. NAPT 概述:
2.2. NAPT概述
假设一个组织有一个私有 IP 网络和一个到服务提供商的 WAN 链路。私有网络的存根路由器在 WAN 链路上被分配一个全局有效的地址,而组织中的其余节点的 IP 地址仅具有本地意义。在这种情况下,可以允许私有网络上的节点在 NAPT 的帮助下使用单个注册 IP 地址同时访问外部网络。NAPT 允许将类型(本地 IP 地址、本地 TU 端口号)的元组映射到类型(注册 IP 地址、分配的 TU 端口号)的元组。
此模型适合大多数小型家庭办公室 (SOHO) 群体使用单个服务提供商分配的 IP 地址访问外部网络的需求。此模型可以扩展为允许入站访问,方法是静态映射注册 IP 地址的每个服务 TU 端口的本地节点。
在下图 3 的示例中,存根 A 在内部使用 A 类地址块 10.0.0.0/8。存根路由器的 WAN 接口由服务提供商分配 IP 地址 138.76.28.4。
\ | / +-----------------------+ |Service Provider Router| +-----------------------+ WAN | | Stub A .............|.... | ^{s=138.76.28.4,sport=1024, | v{s=138.76.29.7, sport = 23, ^ d=138.76.29.7,dport=23} | v d=138.76.28.4, dport = 1024} +------------------+ |Stub Router w/NAPT| +------------------+ | | LAN -------------------------------------------- | ^{s=10.0.0.10,sport=3017, | v{s=138.76.29.7, sport=23, | ^ d=138.76.29.7,dport=23} | v d=10.0.0.10, dport=3017} | | +--+ +--+ +--+ |--| |--| |--| /____\ /____\ /____\ 10.0.0.1 10.0.0.2 ..... 10.0.0.10 Figure 3: Network Address Port Translation (NAPT) Operation
当存根 A 主机 10.0.0.10 向主机 138.76.29.7 发送 telnet 数据包时,它使用全局唯一地址 138.76.29.7 作为目标,并将数据包发送到其主路由器。存根路由器具有子网 138.76.0.0/16 的静态路由,因此数据包被转发到 WAN 链路。但是,NAPT 会在转发数据包之前将 IP 和 TCP 标头中的源地址 10.0.0.10 和源 TCP 端口 3017 的三元组转换为全局唯一的 138.76.28.4 和唯一分配的 TCP 端口(例如 1024)。返回路径上的数据包会针对目标 IP 地址和目标 TCP 端口经历类似的地址和 TCP 端口转换。再次注意,这不需要对主机或路由器进行任何更改。转换是完全透明的。
在此设置中,只允许 TCP/UDP 会话,并且必须源自本地网络。但是,有些服务(例如 DNS)需要入站访问。组织可能希望允许其他服务进行入站会话访问。可以在存根路由器上静态配置众所周知的 TU 端口服务 [RFC 1700],以将其定向到专用网络中的特定节点。
除了 TCP/UDP 会话之外,NAPT 路由器还可以监控 ICMP 消息(REDIRECT 消息类型除外)。ICMP 查询类型数据包的转换方式与 TCP/UDP 数据包的转换方式类似,ICMP 消息头中的标识符字段将唯一地映射到已注册 IP 地址的查询标识符。ICMP 查询消息中的标识符字段由查询发送者设置,并在查询响应者的响应消息中不加改变地返回。因此,NAPT 路由器将 (本地 IP 地址、本地 ICMP 查询标识符) 的三元组映射到 (已注册 IP 地址、分配的 ICMP 查询标识符) 的三元组,以唯一地标识来自任何本地主机的所有类型的 ICMP 查询。后面的部分将讨论对 ICMP 错误消息的修改,因为这涉及对 ICMP 有效负载以及 IP 和 ICMP 报头的修改。
在 NAPT 设置中,注册的 IP 地址与末梢路由器 WAN 接口的 IP 地址相同,路由器必须确保区分源自自身的 TCP、UDP 或 ICMP 查询会话与源自本地网络节点的会话。所有入站会话(包括 TCP、UDP 和 ICMP 查询会话)都假定指向作为终端节点的 NAT 路由器,除非目标服务端口静态映射到本地网络中的其他节点。
由 NAPT 路由器提供服务的本地节点根本不允许进行除 TCP、UDP 和 ICMP 查询类型之外的会话。
正确的方法是使用类似拆分 DNS 之类的东西,这样您的内部流量就永远不会进入路由器,这样您就不会浪费 LAN 接口带宽(双向),并且您不会将路由器 CPU 和 RAM 用于永远不会离开您的网络的流量。