大家好,我在 IP 为 10.33.46.68 的 CentOS 服务器上的 80 端口上运行了一个 Tomcat。当我尝试打开“http://10.33.46.68“在我的笔记本上,我可以看到 Tomcat 欢迎页面。然后我将 Tomcat 端口更改为 8080,并使用 iptables 将端口 80 上的 HTTP 流量重定向到端口 8080:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8080
现在当我尝试打开“http://10.33.46.68“在我的笔记本上我超时了。但是当我尝试打开”http://10.33.46.68“ 或者 ”http://10.33.46.68:8080“直接在服务器上两个 URL 都可以正常工作。请问我遗漏了什么?
笔记本电脑和服务器之间有 Cisco 防火墙,仅允许在端口 80 上进行通信。这是我的 iptables 配置文件:
# Generated by iptables-save v1.4.7 on Wed Oct 17 14:51:20 2012
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1027:228609]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -j DROP
COMMIT
# Completed on Wed Oct 17 14:51:20 2012
# Generated by iptables-save v1.4.7 on Wed Oct 17 14:51:20 2012
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [4:274]
:OUTPUT ACCEPT [2:154]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
-A OUTPUT -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080
COMMIT
# Completed on Wed Oct 17 14:51:20 2012
提前致谢。Vojtech
答案1
INPUT
表中的链不filter
应该被DROP。(至少,在没有接受端口的情况下不应该被DROP!)
至少接受端口 tcp/8080 才能使其工作。
数据包首先穿过 mangle-,然后是预路由,最后是过滤表。您的 mangle 表是空的,您在预路由中重定向,但当数据包进入 INPUT/filter 时,它被丢弃了。
简单iptables -t filter -A INPUT -p tcp --dport 8080 -j ACCEPT
就足够了。
编辑:过滤器的 INPUT 链中也应该接受 localhost,但不要让事情变得复杂。不过你应该考虑实施稍微复杂一点的规则,比如:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # don't you want ssh?
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable
类似这样的事。