Iptables:如何仅为特定域重定向端口 80

Iptables:如何仅为特定域重定向端口 80

抱歉,标题是这样的,但我在服务器配置方面还是个新手。我遇到了一个问题(当然),我会尽力向你解释:

  • 我有一个基于 apache2 的 vps,其中我配置了两个使用虚拟主机的域。
  • 第一个域名用作 Web 服务器 (RUBY) 的别名,使用端口 8080
  • 第二个是一个网站,因此它应该使用端口 80 运行,使用 apache2+mysql

我的问题是,网络服务器需要将连接从端口 80 重定向到 8080,所以我的 ruby​​ 开发人员(不是我,我很烂 ruby​​)进行了重定向

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

结果,我的网站无法使用端口 80。我的问题是:有没有办法告诉 iptables 仅将端口 80 重定向到 ruby​​ 服务器(以及第一个域?)的连接?我无法更改服务器的端口,所以您建议我如何将 80 用于网站?抱歉问了这么多愚蠢的问题,但我真的很讨厌。我忘了说我不再与 ruby​​ 开发人员联系了,所以这对我来说更戏剧化了 :)

提前致谢

答案1

如果您从同一个 IP 为两个域提供服务,则无法使用端口转发来实现这一点,因为 iptables 无法知道客户端尝试连接到哪个域。您的服务器不参与 DNS 查找,并且客户端不会发送 HTTP 标头,Host:直到TCP 连接已建立。

不过,你可以使用 Apache 的mod_proxy建立一个反向代理将 HTTP 请求中继到 Ruby 服务器。 这个食谱演示如何:

<VirtualHost *:*>
    ProxyPreserveHost On
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    ServerName your.ruby.site
</VirtualHost>

使用此配置,访问 Ruby 站点的人实际上不会连接到 Ruby 服务器,而是连接到 Apache。但 Apache 将通过从 Ruby 服务器请求页面来提供页面,因此结果基本相同。

相关内容