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

Sim*_*one 4 iptables redirect apache-2.2

抱歉标题,但我是服务器配置的新手。我有问题(当然),我会尽力向您解释:

  • 我有一个基于 apache2 的 vps,debian,其中我有两个配置了虚拟主机的域。
  • 第一个域用作网络服务器 (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
Run Code Online (Sandbox Code Playgroud)

当然,作为后果,我的网站无法使用端口 80。我的问题:有没有办法告诉 iptables 重定向端口 80 仅用于有关 ruby​​ 服务器的连接(因此,第一个域?)我无法更改服务器的端口,所以你如何建议我为了用80换网站?很抱歉这些愚蠢的问题,但我完全陷入了这个问题。我忘了提到我不再与 ruby​​ 开发人员联系了,所以这让事情对我来说更具戏剧性:)

提前致谢

Wyz*_*ard 5

如果您从同一个 IP 为两个域提供服务,则无法通过端口转发来做到这一点,因为 iptables 无法知道客户端尝试连接到哪个域。您的服务器不参与DNS查询,而客户端不发送一个HTTPHost:报头,直到之后的TCP连接已经建立。

但是,您可以做的是使用 Apache 的mod_proxy设置一个反向代理,将 HTTP 请求中继到 Ruby 服务器。 这个食谱展示了如何:

<VirtualHost *:*>
    ProxyPreserveHost On
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    ServerName your.ruby.site
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

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