![如何代理 | 转发 | nat 伪装所有来自某个 IP 的流量到其他地方的另一个 IP](https://linux22.com/image/790893/%E5%A6%82%E4%BD%95%E4%BB%A3%E7%90%86%20%7C%20%E8%BD%AC%E5%8F%91%20%7C%20nat%20%E4%BC%AA%E8%A3%85%E6%89%80%E6%9C%89%E6%9D%A5%E8%87%AA%E6%9F%90%E4%B8%AA%20IP%20%E7%9A%84%E6%B5%81%E9%87%8F%E5%88%B0%E5%85%B6%E4%BB%96%E5%9C%B0%E6%96%B9%E7%9A%84%E5%8F%A6%E4%B8%80%E4%B8%AA%20IP.png)
我正在设置一个新的公共网络 IP/24。迟早我的旧子网公共网络 IP/24 会被删除。同时,我想创建一个代理,将所有流量移至旧子网到新子网。我正在考虑通过互联网进行 1:1 NAT。
因此,当有人访问旧 IP 时,我希望它被代理到新 IP。
XXX.XXX.XXX.9 -> YYY.YYY.YYY.9
XXX.XXX.XXX.10 -> YYY.YYY.YYY.10
XXX.XXX.XXX.11 -> YYY.YYY.YYY.11
XXX.XXX.XXX.12 -> YYY.YYY.YYY.12
等等。
我尝试设置一个代理服务器,但是在互联网上找不到很好的参考来为防火墙 cmd/iptable 编写正确的设置。我所做的是:首先,我向代理服务器添加了一个名为 XXX.XXX.XXX.99 的新虚拟 IP,然后我配置了代理解析:
# enable IP forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
# enable Masquerade
firewall-cmd --permanent --zone=public --add-masquerade
# create routing rule:
firewall-cmd --direct --add-rule ipv4 nat PREROUTING 0 -d XXX.XXX.XXX.99 -j SNAT --to-source YYY.YYY.YYY.99
但我明白:
Error: COMMAND_FAILED: '/usr/sbin/iptables-restore -w -n' failed: iptables-restore v1.8.8 (nf_tables):
line 3: RULE_INSERT failed (Invalid argument): rule in chain PREROUTING
似乎每个参考资料都说了不同的东西,并且不清楚我是否应该为此目的使用 SNAT、MASQUERADING 或 DNAT。
欢迎一切帮助。
答案1
我认为这不可能按照你的想法实现。
即使你能在原有网络上设置 NAT,问题还是出在回程流量上。所有来自 YYY.YYY.YYY.0/24 网络的 IP 数据包都需要转发回 XXX.XXX.XXX.0/24 网络。然后 XXX.XXX.XXX.0/24 的机器就可以将数据包的源 IP 地址替换为 XXX.XXX.XXX.0/24。
具体例子:
- 客户端发送数据包:源 IP 192.0.2.1,目标 IP XXX.XXX.XXX.0/24。
- NAT 网关将目标地址更改为 YYY.YYY.YYY.0/24。数据包源 IP 为 192.0.2.1,目标 IP 为 YYY.YYY.YYY.0/24。
- YYY.YYY.YYY.0/24 向 192.0.2.1 发送响应数据包。源 IP YYY.YYY.YYY.0/24,目标 IP 为 192.0.2.1。
- 现在,如果 YYY.YYY.YYY.0/24 具有正常路由,它会直接将数据包发送给客户端。客户端接收源 IP 为 YYY.YYY.YYY.0/24、目标 IP 为 192.0.2.1 的数据包。客户端不希望从此源地址收到数据包,因此会丢弃该数据包。
为了实现正确的操作,您需要在 YYY.YYY.YYY.0/24 的机器上设置到 XXX.XXX.XXX.0/24 的默认路由。但是,设置默认路由意味着 YYY.YYY.YYY.0/24 不能直接从互联网访问 - 您需要始终通过 XXX.XXX.XXX.0/24 访问它。
您需要回顾一下您正在尝试解决的实际问题并思考其他的事情。