我有一台 Ubuntu 15.04 系统,其中的 Java 网络服务器监听端口 3000。Iptables 预路由设置如下:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
我还使用以下命令从系统中删除了 apache2 包:
apt-get remove apache2
但是,现在我没有在系统中发现任何监听 80 端口的进程:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 259/sshd
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 4841/java
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 455/master
tcp 0 0 0.0.0.0:5355 0.0.0.0:* LISTEN 256/systemd-resolve
因此无法通过浏览器访问这些页面。有人能帮忙吗?
谢谢!
更新:
现在我已经完成了 Apacheproxy
和proxy_http
模块的配置,如下所示:
<VirtualHost *:80>
ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://127.0.0.1:3000/
</VirtualHost>
奇怪的是,在配置类似的运行 Ubuntu 14.04 的机器上,运行 Apache 以让某个进程监听端口 80 是不必要的。在这些机器上,netstat
也不会显示任何进程监听端口 80,但 HTTP 请求却以某种方式转发到监听端口 3000 的 Java 服务器。嗯。
答案1
没有什么是不再监听端口 80。该 iptables 命令只是将对外部网络上的端口 80 的请求转发到本地的端口 3000。
但是该服务仍然只监听端口 3000,并且没有其他服务(显然)监听端口 80,这正是您的系统所报告的。
我猜你是在本地测试的(即,使用与服务相同的机器上的浏览器)。如果是这种情况,并且 localhost:3000 到达服务,则 iptables 规则未被到达,因为请求不是来自外部网络(或其他与 iptables 相关的原因——我在这里假设你的规则是合理且有效的,但你应该检查一下。)
可能的解决方案:
- 确保所有流量都经过此 iptables 规则,或者创建多个规则,以便将来自端口 80 的所有来源的流量重定向到 3000。
- 更改服务以便它绑定到端口 80,并删除 iptables 转发内容。
答案2
如果您使用 authbind 启动 tomcats,那么我们就不需要 iptables 或任何重定向规则软件或 apache,希望此链接能够有所帮助。