![将 HTTP 请求转发到另一个 Web 服务器](https://linux22.com/image/643905/%E5%B0%86%20HTTP%20%E8%AF%B7%E6%B1%82%E8%BD%AC%E5%8F%91%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%20Web%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有一个Ubuntu 12.04 服务器连接至两个子网。
Eth0 是20.20.20.1
,它在端口 80 上托管一个 Apache Web 服务器。10.10.10.0
Eth1 是子网中的动态 IP 地址。
该服务器不是网关,即没有工作站网关指向该服务器。
有另一个 Web 服务器位于第二个子网在10.10.10.1
。
我希望用户从第一个子网能够看到位于第二个子网中的第二台服务器。例如,如果用户输入http: //20.20.20.1
(端口 80)他看到第一个 Web 服务器位于他自己的子网中,如果用户输入https: //20.20.20.1
(端口 443)他得到了转发到第二个子网,看到第二台 Web 服务器在10.10.10.1
。
这是我尝试过的:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -d 10.10.10.1 -p tcp --dport 443 -m state \
--state NEW -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT \
--to-destination 10.10.10.1:443
然而不幸的是,来自第一个子网的请求不会被转发到10.10.10.1
。
答案1
我认为您的机器上有两个 NIC 10.10.10.1
,问题出在源 IP 上。
例如客户端20.20.20.15
尝试访问https: //20.20.20.1
。您基因转移酶流量到10.10.10.1:443
。
因此现在10.10.10.1
收到一个带有源 IP 的数据包20.20.20.15
。子网没有具体规则,20.20.20.0/24
因此回复是通过未连接到机器的默认网关发送的20.20.20.1
。数据包将发送到其他地方并最终被丢弃。
您需要ip route 20.20.20.0/24 dev ...
在服务器上添加10.10.10.1
或者添加源地址转换规则20.20.20.1
:
iptables -t nat -A POSTROUTING -p tcp --dport 443 -d 10.10.10.1 -o eth1 -j MASQUERADE
但在这种情况下,在 Web 服务器日志中,您会看到第一个服务器(在本例中为 20.20.20.1)的 MASQUERADEd IP 地址,REMOTE_ADDR
这可能对您不利。因此,最好向子网添加静态路由,正如我之前提到的。
答案2
您不需要任何 NAT 或其他任何东西。这是一项基本的路由任务。20.x 子网上的用户应使用您的 ubuntu 服务器作为 10.x 子网的网关。可以通过多种方式实现设置的自动传播。