通过 iptables --to-destination ip 重定向发出的 http 请求没有响应

通过 iptables --to-destination ip 重定向发出的 http 请求没有响应

我有两台 Ubuntu 服务器,每台都有自己的 IP 地址。

我们将它们称为 server1 和 server2,分别具有 ip 1.1.1.1 和 2.2.2.2

我在 server2 上运行了一个 nginx。我希望 server1 的唯一目的是将所有传入的 http(因此端口 80)请求重定向到 server2,而客户端不会注意到他们的请求正在被重定向。

我在server1上尝试了以下命令:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 2.2.2.2

但是当我在浏览器中输入 1.1.1.1 时,没有任何响应:页面继续尝试加载,没有显示任何消息或错误消息(2-3 分钟后超时)。

但是当我删除上述 iptables 规则时,当我在浏览器中输入 1.1.1.1 时,我会立即收到“页面未找到错误”;所以有些东西是正常工作的,但不是应该的那样:当我输入 1.1.1.1 时,我希望加载托管在 2.2.2.2 上的 html 页面

因为当我在浏览器中输入 2.2.2.2 时我确实看到网页已加载。

有人能帮我解决这个问题吗?我已经在 severfault 和 Google 上搜索了很长时间,所以才问这个问题。

非常感谢您阅读我的问题!

更新: 感谢大家提供的信息。遗憾的是我仍未收到回复

我有以下 iptables 配置:

root@ip-10-48-238-216:/home/ubuntu# sudo iptables -L
Chain INPUT (策略接受)
目标 prot opt 源 目标

链转发(策略接受)
目标保护选择源目标

链输出(策略接受)
目标协议选择源目标
root@ip-10-48-238-216:/home/ubuntu# sudo iptables -t nat -L
链PREROUTING(策略接受)
目标协议选择源目标
DNAT tcp --任何地方任何地方tcp dpt:www to:2.2.2.2

链输出(策略接受)
目标保护选择源目标

链 POSTROUTING(策略接受)
目标 prot opt 源目标

当我运行 tcpdump 并通过 chrome 发出请求时,1.1.1.1我得到以下结果

root@ip-10-48-238-216:/home/ubuntu# sudo tcpdump -i eth0 端口 80 -vv
tcpdump:在 eth0 上监听,链接类型 EN10MB(以太网),捕获大小 65535 字节
13:56:18.346625 IP(tos 0x0、ttl 52、id 12055、偏移量 0、标志 [DF]、proto TCP(6)、长度 60)
212-123-161-112.ip.telfort.nl.16386 > ip-10-48-238-216.eu-west-1.compute.internal.www:标志 [S]、cksum 0xb398(正确)、seq 2639758575、win 5840、选项 [mss 1460,sackOK,TS val 1223672 ecr 0,nop,wscale 6],长度 0
13:56:18.346662 IP(tos 0x0、ttl 51、id 12055、偏移量 0、标志 [DF]、proto TCP(6)、长度 60)
212-123-161-112.ip.telfort.nl.16386 > ww1dc1.shopreme.com.www:标志 [S],cksum 0x9ee0(正确),seq 2639758575,win 5840,选项 [mss 1460,sackOK,TS val 1223672 ecr 0,nop,wscale 6],长度 0
13:56:18.598747 IP(tos 0x0,ttl 52,id 10138,偏移量 0,标志[DF],proto TCP(6),长度 60)
212-123-161-112.ip.telfort.nl.16387 > ip-10-48-238-216.eu-west-1.compute.internal.www:标志[S],cksum 0xac40(正确),seq 2645658541,win 5840,选项[mss 1460,sackOK,TS val 1223735 ecr 0,nop,wscale 6],长度 0
13:56:18.598777 IP(tos 0x0,ttl 51,id 10138,偏移量 0,标志[DF],proto TCP(6),长度 60)
212-123-161-112.ip.telfort.nl.16387 > ww1dc1.shopreme.com.www:标志 [S]、cksum 0x9788(正确)、seq 2645658541、win 5840、选项 [mss 1460、sackOK、TS val 1223735 ecr 0、nop、wscale 6]、长度 0
^C
捕获
4 个数据包 过滤器接收到 4 个数据包
内核丢弃 0 个数据包

提到的地址与以下内容相关
212-123-161-112.ip.telfort.nl.16386:我的个人计算机
ww1dc1.shopreme.com.www:服务器 2 的 dns(2.2.2.2
ip-10-48-238-216.eu-west-1.compute.internal.www:服务器 1 的 amazon web services ec2 内部地址(1.1.1.1

然而,server2 上的 tcpdump 日志(2.2.2.2)保持为空,并且我在浏览器中没有收到任何响应。

我能够从服务器 1 ping 到服务器 2。
并且net.ipv4.ip_forward设置为 1,所以/proc/sys/net/ipv4/ip_forward
是否还缺少其他内容?

更新2:

Server1 是 aws ec2 微型实例,它连接到一个弹性 IP,我始终将其称为 1.1.1.1。微型服务器曾经是一个更大的 ec2 服务器,但由于其成本高昂,我们正在切换到专用托管。但在我们的 iPhone 客户端中,我们使用一个固定 IP 地址,即上面提到的弹性 IP。iPhone 客户端在服务器上使用 REST 服务。因此,我们现在在该弹性 IP 上使用微型服务器,该服务器应将所有请求重定向到来自另一家公司 (www.xlshosting.nl) 的 vps,该公司具有不同的子网。我不知道可以将 aws 弹性 IP 重定向到外部 IP 地址的功能,所以我尝试使用微型实例 + iptables。该 vps 就是我一直称之为 server2 的 vps,其 IP 为 2.2.2.2。因此,server1 和 server2 位于不同的子网上。这对您有帮助吗?

答案1

听起来你可能遇到了路由问题。在两台服务器上使用 tcpdump 进行检查,并使用 -i 选项将 tcpdump 指向正确的 ethX 设备,以检查数据包是否通过服务器 1 上的正确网络设备发送,并且这些数据包是否也到达了服务器 2。

tcpdump -i ethX host 1.1.1.1 and port 80

会不会是数据包到达了 server2,但是 server2 不知道该把回复发到哪里?server2 是否配置了正确的默认网关?

检查一下

route -n

答案2

跑步

echo 1 > /proc/sys/net/ipv4/ip_forward

为了使更改永久生效,请将以下内容放入 /etc/sysctl.conf 中

net.ipv4.ip_forward = 1

答案3

您的问题可能是:

1-路由问题:您需要检查以下内容:

1.1- 按照 Patrick 的建议,在 Server1 上启用路由。文件/proc/sys/net/ipv4/ip_forward设置为1

1.2- Server2 能够访问请求的客户端。您可以尝试2.2.2.2从客户端 ping server2。您可以使用route add命令添加静态路由。

2-防火墙问题:您需要检查防火墙是否允许您访问 IP 2.2.2.2。为简单起见,您可以设置防火墙策略以接受所有流量(输入、输出、转发)。

答案4

我有几个问题:

您设置的目的是什么?是否因为您不希望网络直接访问 server2,所以 server1 是作为代理 server2 的防火墙?

两台机器如何连接?直接通过交叉线连接,还是通过路由器或其他方式连接?

您是否尝试过在 server1 的两个接口以及 server2 的接口上运行 tcpdump?在请求期间同时运行这三个程序将让您清楚地了解哪里出了问题。

相关内容