我正在运行数字海洋iptables
Centos 6 VPS。这是我在 Centos 6.4 64 位上设置的脚本:
#!/bin/sh
service iptables stop
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8181
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables-save > /etc/sysconfig/iptables
service iptables restart
我仅打开端口 22、80 和 443,将 80 和 443 分别内部重定向到 8080 和 8181。
由于 GlassFish 中的一个错误/怪癖,我不得不将机器的主机名添加到/etc/hosts
:
127.0.0.1 localhost
127.0.0.1 example.com
如果配置中没有 NAT 规则iptables
,当我尝试通过端口 8080 或 8181 连接时,我可以通过家里的浏览器访问 GlassFish 服务器。添加 NAT 规则后,我根本无法访问服务器,无论是通过 80 和 443 还是通过 8080 和 8181。
我是否需要更改任何规则iptables
以将那条额外的线考虑进去/etc/hosts
?
更新:
如果我删除最后一条规则,iptables -P INPUT DROP
我现在可以通过浏览器使用端口 80/443 和 8080/8181 访问服务器。这表明转发正在运行。
答案1
简短的回答是“不”,你不需要。
更详细的答案是 /etc/hosts 用来协助网络堆栈解析器。解析器是 IP 堆栈(TCP/IP v4 和 v6)的一部分,负责将友好名称(例如 mybigserver)转换为 IP 地址(例如 172.16.0.1)。
在您的帖子中,您向我们展示了一个脚本,该脚本正在运行 IPTable 命令。
该脚本使用 PREROUTING 链进行 NAT,但您在问题中指出无法通过浏览器访问“GlassFish”服务器.....
- 什么浏览器? 同一台 Linux 主机上的浏览器还是连接到与 ETH0 相同的交换机的另一台计算机上的浏览器?
如果问题 1 的答案是另一台主机连接到与您的 Linux ETH0 相同的交换机,那么问题就在于您需要更改 NAT 规则以使用 POSTROUTING 链。原因是您想要对出站连接进行 NAT。您设置的是 PAT(端口地址转换)。
如果这是您的设置 [您的浏览器]------[网络交换机]-----[ETH0 Linux ETH1]-----{公共互联网]
然后替换这些行
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8181
和:
iptables -A POSTROUTING -t nat -o eth1
如果这解决了您的问题,那么您可以微调 POSTROUTING 规则以使用一系列端口和/或特定的 ETH1 IP(如果它是多宿主的)。
答案2
简短回答
您的规则不接受发往 8080 或 8181 的数据包!
较长的答案
如果 iptables 配置中没有 NAT 规则,当我尝试通过端口 8080 或 8181 连接时,我能够通过家里的浏览器访问 GlassFish 服务器。添加 NAT 规则后,我根本无法访问服务器,无论是通过 80 和 443 还是通过 8080 和 8181。
这是因为你的规则起作用了,从而将 80 和 443 转发到 8080 和 8181!但你忘了接受连接这些!这就是为什么他们都被拒绝了!
如果我删除最后一条规则 iptables -P INPUT DROP,我现在可以使用端口 80/443 和 8080/8181 通过浏览器访问服务器。这表明转发正在运行。
现在应该有意义了:
- 对端口 8080 的请求 >> DROP(默认)
- 对端口 8181 的请求 >> DROP(默认)
- 请求到端口 80 >> 端口 8080 >> DROP(默认)
- 请求到端口 443 >> 端口 8181 >> DROP(默认)
如果没有最后一行,则默认为 ACCEPT 而不是 DROP,因此它当然可以工作。
解决方案
添加以下两条规则...
iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8181 -j ACCEPT
...它应该与默认的 INPUT DROP 行 (端口 80 >> 端口 8080 >> ACCEPT (规则)) 一起工作。