在我的 CentOS 服务器上mydomain.com
,我有一个 svn Web 应用程序在端口 8880 上运行。我想隐藏该端口:此时,如果有人想要访问,他们需要通过 访问http://thisdomain.com:8880/svn
。我想让该应用程序可在 访问http://thisdomain.com/
。
答案1
选项 1:NAT 端口转发
如果您在这里需要做的就是将外部端口 80 上的请求重定向到端口 8880 上运行的内部程序,您可以使用iptables
转发端口为了这:
# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j REDIRECT --to 127.0.0.1:8880
这里有几点需要理解:
我猜你正在运行某种虚拟专用服务器,所以
eth0
可能不是正确的接口名称。如果是这样,您将必须更换它。顺便说一句,如果您使用共享主机或您的 VPS 不允许
iptables
,请跳到下一个选项。如上所述,该规则假设您已将此内部程序配置为仅侦听本地主机接口
127.0.0.1
。这让你得到了你所要求的“隐藏”行为。您先前存在的防火墙规则可能会干扰当前编写的此规则。在修改当前规则之前,没有什么可以替代
iptables
它们,但如果它不起作用,您可以盲目地尝试添加另一个规则,如下所示:# iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACCEPT
FORWARD
如果你的默认链规则是DENY
,那么就需要这样的东西。您需要确保这些规则在启动时出现。
如果您足够小心,您可以
/etc/sysconfig/iptables
在 CentOS 上进行编辑来完成此操作。该文件使用类似于命令行语言的语法,但不完全相同iptables
。您可能应该在本地虚拟机上对此进行测试,以减少意外将自己锁定在公共服务器之外的可能性。将命令放入 中会更安全
/etc/rc.local
,但请注意,如果您重新启动iptables
服务(例如service iptables reload
),您的自定义规则将被删除(如果它们不在 中)/etc/sysconfig/iptables
。
如果您已阅读完所有内容并想知道为什么我将其设为选项 1,而下面的选项 2 更简单,那是因为它效率更高。一旦您设置了端口转发,就资源而言基本上是“免费”的。
选项 2:HTTP 代理
另一种方法是使用某种HTTP代理。我用过小代理对于这种事情。它比 NAT 端口转发更灵活,并且不需要您破坏操作系统的防火墙。
它针对 CentOS 打包在EPEL,这样一旦您启用了 EPEL 存储库,您只需说yum install tinyproxy
。
在库存文件中进行以下更改/etc/tinyproxy/tinyproxy.conf
:
Port 80
Upstream localhost:8880
另外,注释掉该Allow
行,以便 Tinyproxy 接受来自外部 IP 的连接:
# Allow 127.0.0.1
service httpd stop
当您尝试启动此 ( ) 时,您需要确保 Apache 没有运行 ( ) service tinyproxy start
,因为它将接管端口 80。
Tinyproxy 的文档只是一个简洁的参考,所以我不确定这种使用是否Upstream
是一个更好的替代使用 Tinyproxy 的 hack反向代理特征。不过,它对我有用,而且对配置文件的更改较少,所以这就是我的做法。
如果您想知道为什么我不从一开始就使用 Apache 来实现此目的,原因很简单,它更复杂并且需要更多资源。Apache确实有代理功能。不过,除非您需要 Apache 的全部功能,否则我认为没有理由采用 Tinyproxy。
与 NAT 端口转发不同,运行 Tinyproxy 确实需要一些系统资源。它需要一些 RAM,如果您的流量水平足够高,它可能会变成I/O 限制。但是,如果您的服务器不是特别繁忙,您可能甚至不会注意到它正在运行。
答案2
这将在您的 httpd.conf 文件中作为虚拟主机完成。它看起来像:
<VirtualHost thisdomain.com:8880>
DocumentRoot /www/docs/svn/myapp
ServerName thisdomain.com
</VirtualHost
确保 apache 正在侦听正确的端口。找到所说的位置listen 80
并包括 listen 8880