Duk*_*kem 3 iptables forwarding
假设我有两台服务器:
-->服务器A有IP XXX.XXX.XXX.XXX
-->服务器B有IP YYY.YYY.YYY.YYY
我想要的是将流量从服务器 A(端口 80)重定向到服务器 B(端口 80)。
一种简单的方法是将以下规则与 iptables 放在服务器 A 中:
iptables -t nat -A PREROUTING -p tcp --dport port -j DNAT --to-destination server B:80
Run Code Online (Sandbox Code Playgroud)
但是,这个简单的规则不起作用。我们必须添加以下规则:
iptables -t nat -A POSTROUTING -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
为什么这样?为什么我们需要添加 POSTROUTING 规则?PREROUTING之后,数据包一定会自动去服务器B吧?
你的问题分为两部分。
要回答第一个问题,我们必须首先了解 iptables NAT 的工作原理。NAT 表用于连接的第一个数据包,以确定应将哪些转换应用于该连接。一旦处理了第一个数据包,就会创建一个内部映射表条目,该条目用于处理连接的后续数据包,但盒子只能处理它看到的数据包。
因此,我们假设 XXX.XXX.XXX.XXX 和 YYY.YYY.YYY.YYY 都是 Internet 上的服务器,没有配置特殊路由。假设客户端也在没有防火墙的开放互联网上,并且 IP 为 ZZZ.ZZZ.ZZZ.ZZZ 。让我们看看如果没有 MASQURADE 规则会发生什么。
如果我们添加 MASQUERADE 规则,情况会如何变化?
对于问题 2,我确实没有答案,iptables 坚持认为 SNAT/MASQUERADE 只能在 POSTROUTING 中完成,但我没有看到任何好的技术理由来解释为什么会出现这种情况。
我们可能有理由希望避免使用 MASQUERADE。它有几个问题,首先,我们丢失了我们希望用于滥用控制的原始流量来源的信息。其次,服务器 A 的端口供应有限。
这个问题可以解决,但前提是两台服务器都在我们的控制之下。该解决方案涉及三个步骤。
小智 5
* 我不是 iptables 或 Linux 网络调度方面的专家,但我会尽力提供帮助!
查看 iptables 手册页,user@host:~$ man 8 iptables我们可以在nat(网络地址转换)表描述中看到:
“当遇到创建新连接的数据包时,会参考此表。它由三个内置函数组成:PREROUTING(用于在数据包进入时立即更改)、OUTPUT(用于在路由之前更改本地生成的数据包)和POSTROUTING(用于在数据包即将发出时对其进行更改)。”
这是 POSTROUTING 链 :-)
下面的 MASQUERADE 解释是我从Linux 文档项目中得到的,我也把你的信息弄得有意义:
- 我告诉机器B我的 PPP 或以太网连接的 Linux 机器A是它的网关。
- 当一个数据包从B进入 Linux box A时,它会为该数据包分配一个新的 TCP/IP 源端口号,并在数据包头中插入自己的 IP 地址,保存原始数据。MASQ 服务器随后将通过 PPP/ETH 接口将修改后的数据包发送到 Internet 上。
- 当数据包从 Internet 返回到 Linux box A 时,Linux 会检查端口号是否是上面分配的端口之一。如果是,则 MASQ 服务器将获取原始端口和 IP 地址,将它们放回返回的数据包头中,并将数据包发送到B。
- 发送数据包的主机永远不会知道差异。
| 归档时间: |
|
| 查看次数: |
14544 次 |
| 最近记录: |