/ etc / hosts和iptables之间的关系?

我正在运行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相同的交换机?

如果#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的浏览器访问服务器。 这表示转发正在工作。

现在应该是有道理的:

  • 请求端口8080 >> DROP(默认)
  • 请求端口8181 >> DROP(默认)
  • 请求到端口80 >>端口8080 >> DROP(默认)
  • 请求端口443 >>端口8181 >> DROP(默认)

没有最后一行你有默认的接受,而不是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(规则))。