iptables NAT - 一个公共IP到多个本地IP(相同端口)

时间:2018-05-02 12:51:42

标签: unix routing routes iptables

我们说我有一台网关服务器连接到互联网(一个公共IP XX.XX.XX.XX - *.mydomain.com指向它;);和两个网络服务器A& B已连接(192.168.0.1192.168.0.2)并正在运行apache2

在网关上,所有http流量当前都被重定向到服务器A:

iptables -A PREROUTING -t nat -i em3 -p tcp --dport  80 -j DNAT --to 192.168.0.1:80
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 443 -j DNAT --to 192.168.0.1:443

(这是完美的工作)

我需要什么

我正在慢慢地将Web服务器从服务器A迁移到服务器B.目前,我有多个子域(*.mydomain.com)指向服务器A,我正在计划逐步推动每个网站到服务器B。

在给定时间,当客户继续site1.mydomain.com时,www/文件夹可能仍在服务器A上,或者已经在服务器B上。

  • 我想在网关上编辑NAT规则,以便查询网络服务器以回答给定的http请求。

我尝试了什么

我可能是你而且很天真,但我虽然可以对服务器B执行相同的NAT,所以当我继续siteY.mydomain.com时,流量将在两个网络服务器上进行,而带有虚拟主机的流量正在显示网页。我试过这些规则:

# server A - rules already used
iptables -A PREROUTING -t nat -i em3 -p tcp --dport  80 -j DNAT --to 192.168.0.1:80
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 443 -j DNAT --to 192.168.0.1:443
# server B - new rules
iptables -A PREROUTING -t nat -i em3 -p tcp --dport  80 -j DNAT --to 192.168.0.2:80
iptables -A PREROUTING -t nat -i em3 -p tcp --dport 443 -j DNAT --to 192.168.0.2:443

但我认为两者都被忽略了,因为每个请求仍然登陆服务器A.

问题

1。有可能"重复"两个网络服务器上的交通? (也许这是愚蠢的,对不起)

2. 我可以告诉网关类似于#34; ,如果它位于服务器A上,则保留在服务器A上;但如果是site2.mydomain.com,请转到服务器B "?

3. 实现这一目标的最佳解决方案是什么?

我无法让网关运行apache。理想情况下: 我不想使用不同的端口; 我不想编辑服务器A或B iptables。

如果需要,请随时纠正我或询问更多细节!

源头/线索:

1 个答案:

答案 0 :(得分:0)

我不是通过iptables来实现这个,因为你最终可能需要检查https SNI以查看正在请求的主机名,所以也许一个解决方案(如果你的应用程序支持它)将设置一个代理(也许是nginx) )也可以提供终止。

对于nginx,使用此规则的简单服务器就足够了:

server{
    listen [::]:80;
    listen [::]:443 ssl;
    server_name site2.example.com;
    location / {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Singlesite true;
       proxy_set_header Host $host;
       proxy_pass $scheme://192.168.0.2;
    }
 }


server{
    listen [::]:80;
    listen [::]:443 ssl;
    server_name site1.example.com;
    location / {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Forwarded-Host $host;
       proxy_set_header X-Singlesite true;
       proxy_set_header Host $host;
       proxy_pass $scheme://192.168.0.1;
    }
 }

也可能取决于您的迁移过程,可能有更好的方法来执行此操作。