我正在运行DigitalOcean Centos 6 VPS。 以下是我用于在Centos 6.4 64位上设置iptables的脚本:
#!/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分别内部redirect到8080和8181。
由于GlassFish中的bug /怪异,我不得不将机器的主机名添加到/etc/hosts :
127.0.0.1 localhost 127.0.0.1 example.com
如果没有iptablesconfiguration中的NAT规则,当尝试通过端口8080或8181连接时,我能够通过家中的浏览器访问GlassFish服务器。添加了NAT规则后,根本无法访问服务器,也不能通过80和443也不通过8080和8181。
我是否需要对任何iptables规则进行更改以在/etc/hosts中添加额外的行?
更新:
如果我删除了最后一条规则, iptables -P INPUT DROP ,我现在可以通过浏览器使用端口80/443和8080/8181访问服务器。 这表示转发正在工作。
简短的回答是否,不,你不。
更长的答案是/ etc / hosts在那里协助networking堆栈parsing器。 parsing器是IP堆栈(TCP / IP v4和v6)的一部分,负责将友好名称(如mybigserver)转换为IP地址(如172.16.0.1)。
在您的文章中,您向我们展示了一个脚本,脚本正在运行IPTable命令。
该脚本正在使用PREROUTING链来做NAT,但是您在您的问题中声明您无法通过浏览器访问“GlassFish”服务器…..
如果#1的答案是连接到与您的Linux ETH0相同的交换机的另一个主机,则问题是您需要更改您的NAT规则以使用POSTROUTING链。 原因是你想NAT出站连接。 你设置的是PAT(端口地址转换)。
如果这是你的设置[你的浏览器] —— [networking切换] —– [ETH0 Linux ETH1] —– {公网]
然后replace这些行
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(如果是多宿主的)。
在规则中,您不接受数据包到8080或8181!
如果没有iptablesconfiguration中的NAT规则,当尝试通过端口8080或8181连接时,我能够通过家中的浏览器访问GlassFish服务器。添加了NAT规则后,根本无法访问服务器,也不能通过80和443也不通过8080和8181。
这是因为你的规则起作用了,从而把80和443提到8080和8181! 但你忘了也接受这些连接! 这就是为什么他们都被拒绝了!
如果我删除了最后一条规则,iptables -P INPUT DROP,我现在可以通过使用端口80/443和8080/8181的浏览器访问服务器。 这表示转发正在工作。
现在应该是有道理的:
没有最后一行你有默认的接受,而不是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(规则))。