我在阿里云上有一台linux服务器,主要用于网站发布。主要架构是nginx作为反向代理服务器,后面跟着一个tomcat。 其中,tomcat使用8080端口,nginx将外来的80端口或443端口访问
我在阿里云上有一台linux服务器,主要用于网站发布。主要架构是nginx作为反向代理服务器,后面跟着一个tomcat。
其中,tomcat使用8080端口,nginx将外来的80端口或443端口访问,转发至tomcat的8080端口上。
为了加强安全性,今天打算启用linux自带的防火墙,用来屏蔽外界访问服务器的其他端口。
首先,查看一下iptables的设置情况,使用如下命令:
iptables -L -n
如果没有启用,则显示如下:
[root@iZ25qrs2oacZ ~]# iptables -L -n Chain INPUT (policy ACCEPT)target prot opt source destination Chain FORWARD (policy ACCEPT)target prot opt source destination Chain OUTPUT (policy ACCEPT)target prot opt source destination [root@iZ25qrs2oacZ ~]#
如果有启用,则首先将其策略全部清空。在清空之前,要确保INPUT、FORWARD和OUTPUT的默认策略是accept,否则,将会造成22端口不可用,ssh链接被断开,只能打电话给机房,让他们重启服务器了。因此,必须先执行如下命令:
[root@iZ25qrs2oacZ data]# iptables -P INPUT ACCEPT[root@iZ25qrs2oacZ data]# iptables -P OUTPUT ACCEPT[root@iZ25qrs2oacZ data]# iptables -P FORWARD ACCEPT
然后才能执行清空命令:
[root@iZ25qrs2oacZ data]# iptables -F
接下来,将防火墙访问策略,按照顺序逐一写入,例如,向全网开放22、80和443端口:
[root@iZ25qrs2oacZ data]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT[root@iZ25qrs2oacZ data]# iptables -A INPUT -p TCP --dport 80 -j ACCEPT[root@iZ25qrs2oacZ data]# iptables -A INPUT -p TCP --dport 443 -j ACCEPT
由于本机使用了nginx做反向代理,因此,必须将8080端口开放给本机。因此下面的三行代码是将本机的外网ip、内网ip和127.0.0.1均允许发数据包给本机的任意端口。注意:-s是源地址:
[root@iZ25qrs2oacZ data]# iptables -A INPUT -p tcp -s 101.101.101.101 -j ACCEPT[root@iZ25qrs2oacZ data]# iptables -A INPUT -p tcp -s 127.0.0.1 -j ACCEPT[root@iZ25qrs2oacZ data]# iptables -A INPUT -p tcp -s 10.10.10.10 -j ACCEPT
然后增加如下命令,否则,服务端发起对外访问请求时,会报错(java.net.unknownhostexception):
[root@iZ25qrs2oacZ data]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
最后,将防火墙INPUT默认策略改为DROP,即为不符合上述策略的访问,一律不准进入。
[root@iZ25qrs2oacZ data]# iptables -P INPUT DROP
完成。
==========================分割线==============================
最后总结一下:
1.首先检查当前iptables的配置情况:iptables -L -n2.将三条链路的默认规则均置为直接放行(ACCEPT):iptables -P INPUT ACCEPTiptables -P OUTPUT ACCEPTiptables -P FORWARD ACCEPT3.将三条链路的所有规则全部清空(危险,可能会导致22端口不可访问,ssh连接失效。因此上一步操作非常关键):iptables -F 4.设置INPUT链路规则(当防火墙所在的服务器有nginx反向代理时,需要将外部请求转发至后端的8080端口,因此,最后三行代码的目的是:允许自己将任何数据包发给自己的任意端口):iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A INPUT -p TCP --dport 80 -j ACCEPTiptables -A INPUT -p TCP --dport 443 -j ACCEPTiptables -A INPUT -p tcp -s 101.101.101.101 -j ACCEPT /*外网ip*/iptables -A INPUT -p tcp -s 127.0.0.1 -j ACCEPT /*127.0.0.1*/iptables -A INPUT -p tcp -s 10.10.10.10 -j ACCEPT /*内网ip*/5.增加服务端发起对外访问请求(如httpclient)时的设置:iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT6.将INPUT链路的默认规则置为直接拒绝(DROP):iptables -P INPUT DROP
参考资料:
http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html
http://blog.csdn.net/tobacco5648/article/details/51508012