http请求通过iptables – 到 – 目的地ipredirect导致没有反应

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

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

我有一个运行在server2上的nginx。 我希望server1具有的唯一目的是将所有传入的http(所以端口80)请求redirect到server2,而无需客户端注意到他们的请求正在被redirect。

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

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

但是当我在我的浏览器中input1.1.1.1时,我没有收到任何回应:页面一直试图加载,没有给出任何消息或错误信息(我在2-3分钟后得到超时)。

但是当我删除上面的iptables规则,我立即得到一个“页面未find错误”,当我在浏览器中input1.1.1.1; 所以有些东西是工作,但不是因为它应该:当我input1.1.1.1我想要加载在2.2.2.2托pipe的HTML页面

因为当我在浏览器中input2.2.2.2时,我确实看到了加载的网页。

任何人都可以帮我这个吗? 我现在正在search相当一段时间(在severfault和Google上),所以我就这么问。

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

更新:谢谢大家的信息。 不幸的是,我仍然没有回应

我有以下的iptablesconfiguration:

root @ ip-10-48-238-216:/ home / ubuntu#sudo iptables -L
连锁input(政策接受)
目标人select源目的地

连锁FORWARD(政策接受)
目标人select源目的地

链式输出(策略ACCEPT)
目标人select源目的地
root @ ip-10-48-238-216:/ home / ubuntu#sudo iptables -t nat -L
连锁PREROUTING(政策接受)
目标人select源目的地
DNAT tcp – 在任何地方tcp dpt:www到:2.2.2.2

链式输出(策略ACCEPT)
目标人select源目的地

连锁POSTROUTING(政策接受)
目标人select源目的地

当我运行tcpdump并通过chrome来请求1.1.1.1我得到以下

root @ ip-10-48-238-216:/ home / ubuntu#sudo tcpdump -i eth0 port 80 -vv
tcpdump:监听eth0,链路types为EN10MB(以太网),捕获大小为65535字节
IP(tos 0x0,tt152,id 12055,offset 0,flags [DF],proto TCP(6),length 60)
212-123-161-112.ip.telfort.nl.16386> ip-10-48-238-216.eu-west-1.compute.internal.www:Flags [S],cksum 0xb398(correct),seq 2639758575,赢5840,选项[mss 1460,sackOK,TS val 1223672 ecr 0,nop,wscale 6],长度0
13:56:18.346662 IP(tos 0x0,tt151,id 12055,offset 0,flags [DF],proto TCP(6),length 60)
标识[S],cksum 0x9ee0(正确),seq 2639758575,win 5840,选项[mss 1460,sackOK,TS val 1223672 ecr 0,nop,wscale 6],长度0
IP(tos 0x0,tt152,id 10138,offset 0,flags [DF],proto TCP(6),length 60)
212-123-161-112.ip.telfort.nl.16387> ip-10-48-238-216.eu-west-1.compute.internal.www:Flags [S],cksum 0xac40(正确),seq 2645658541,赢5840,选项[mss 1460,sackOK,TS val 1223735 ecr 0,nop,wscale 6],长度0
IP(tos 0x0,ttl 51,id 10138,offset 0,flags [DF],proto TCP(6),length 60)
212-123-161-112.ip.telfort.nl.16387> ww1dc1.shopreme.com.www:Flags [S],cksum 0x9788(正确),seq 2645658541,win 5840,options [mss 1460,sackOK,TS val 1223735 ecr 0,nop,wscale 6],长度0
^ C
捕获4个数据包
filter收到4个数据包
内核丢弃了0个数据包

提到的地址涉及以下内容
212-123-161-112.ip.telfort.nl.16386 :我的个人电脑
ww1dc1.shopreme.com.www :server2的dns( 2.2.2.2
ip-10-48-238-216.eu-west-1.compute.internal.www :amazon web servicesec2 server1的内部地址( 1.1.1.1

但是,server2( 2.2.2.2 )上的tcpdump日志保持为空,在浏览器中没有得到任何响应。

我能够从server1 ping到server2。
net.ipv4.ip_forward设置为1, /proc/sys/net/ipv4/ip_forward
难道还有其他的东西缺失吗?

UPDATE2:

Server1是一个aws ec2微型实例,它连接到我称为1.1.1.1的弹性ip。 每时每刻。 微服务器曾经是一个更大的ec2服务器,但由于其高成本,我们正在切换到专用主机。 但在我们的iPhone客户端,我们使用了一个固定的IP地址,即上面提到的弹性IP。 iPhone客户端在服务器上使用REST服务。 所以我们现在在这个弹性IP上使用一个微型服务器,它应该把所有的请求都redirect到一个来自其他公司(www.xlshosting.nl)的vps,它有一个不同的子网。 我不知道可以redirectaws弹性IP到外部IP地址的function,所以这就是为什么我用微型实例+ iptables来尝试它。 该vps是我所谓的server2所有的时间与ip 2.2.2.2。 所以server1和server2在不同的子网上。 这对你有帮助吗?

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

 tcpdump -i ethX host 1.1.1.1 and port 80 

可能是数据包到达服务器2,但服务器2不知道在哪里发送答复? server2是否configuration了正确的默认网关?

检查它

 route -n 

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

要使更改永久化,请将以下内容放在/etc/sysctl.conf中

 net.ipv4.ip_forward = 1 

你的问题可以是:

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

1.1-根据Patrickbuild议,在Server1上启用路由。 File /proc/sys/net/ipv4/ip_forward设置为1

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

2- 防火墙问题:您需要检查您的防火墙是否允许您访问IP 2.2.2.2 。 你可以简单的设置防火墙策略来接受所有的stream量(INPUT,OUTPUT,FORWARD)。

我有几个问题:

你的设置的目的是什么? server1的意思是代理服务器2的防火墙,因为你不想让server2直接被networking访问?

两台机器如何连接? 直接通过交叉或通过路由器或其他东西?

你有没有尝试在server1的两个接口上运行tcpdump以及在server2上的接口? 在请求期间同时运行所有这三个命令会给你一个很好的想法,