【问题标题】:iptables NAT - one public IP to multiple local IP (same port)iptables NAT - 一个公共 IP 到多个本地 IP(同一端口)
【发布时间】:2018-05-02 21:12:13
【问题描述】:

假设我有一台连接到 Internet 的网关服务器(一个公共 IP XX.XX.XX.XX - *.mydomain.com 指向它);和两个 Web 服务器 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

(而且效果很好)


我需要什么

我正在慢慢地将网络服务器从服务器 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. 我可以告诉网关类似“如果它用于 site1.mydomain.com,则留在服务器 A;但如果它用于 site2.mydomain.com,则继续使用服务器B”?

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

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

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


来源/线索:

【问题讨论】:

  • 嗨,IPtables 总是只评估规则直到第一次匹配。如果要根据域重定向流量,则需要反向代理。 NGIX 将是一个很好的轻量级解决方案!

标签: unix routing routes iptables


【解决方案1】:

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

对于 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;
    }
 }

另外,根据您的迁移过程,可能会有更好的方法来做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-05
    • 2011-04-13
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多