保护你的Web服务器 iptables防火墙脚本全解读

本文假设你已经对iptables有基本的了解,否则请先阅读iptables入门。

  在我们的Web服务器上,系统的默认策略是INPUT为DROP,OUTPUT;FORWARD链为ACCEPT,DROP则设置得比较宽松,因为我们知道出去的数据包比较安全。

  准备工作

  为了验证脚本的通用性,我特地查看了服务器的内核及iptables版本:

# uname -a
Linux ud50041 2.6.9-34.ELsmp #1 SMP Fri Feb 24 16:54:53 EST 2006 i686 i686 i386 GNU/Linux
# iptables -V
iptables v1.2.11
# lsb_release -a
LSB Version: :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
Distributor ID: RedHatEnterpriseAS
Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 3)
Release: 4
Codename: NahantUpdate3

  大家可以发现,这台服务器的系统、内核和iptables版本是比较老的。本文中介绍的脚本涉及到recent安全模块,这对系统内核有要求(recent模块在主机防护脚本中也经常用到)。因此,如果大家要采用iptables作为主机防火墙时,建议用CentOS 5.6 x86_64或更高级版本,不然系统会有如下提示错误信息:

iptables: Unknown error 18446744073709551615
iptables:Invalid argument

  在tail -f /var/log/messages时会有如下出错提示:

ip_tables: connlimit match: invalid size 32 != 16
ip_tables: connlimit match: invalid size 32 != 24

  另外,在生产环境下进行iptables脚本的调试之前,强烈建议编写crontab任务,每5分钟关闭一次iptables脚本,防止操作失误而将自己的SSH客户端锁在外面:

*/5 * * * * root /etc/init.d/iptables stop

  准备工作就是这些,下面是iptables脚本内容。

  脚本内容

#!/bin/bash
iptables -F
iptables -F -t nat
iptables -X

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#load connection-tracking modules
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

iptables -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT

iptables -A INPUT -s 122.70.x.x -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 80,22 -j ACCEPT

  保存脚本文件后用

# sh iptables.sh

  执行脚本。运行脚本之后最好检查一下:

# iptables -nv -L

  脚本说明

  由于此Web服务器是置于负载均衡器后面,所以我们要允许数据源地址为负载均衡器的数据包通过:

iptables -A INPUT -s 122.70.x.x -j ACCEPT

  如果配置了Nagios等监控系统的话在这里也要加上,如果监控和LB都没做的话,这行可以不用。

  另外,我的许多基于LNMP的小网站上面也部署了此脚本,由于Web服务和MySQL数据库同时安装在一台机器上,所以没有开放3306端口。

  在本脚本中,我们配置了一些安全措施,以防止外部的ping和SYN洪水攻击,并且考虑到外部的疯狂端口扫描软件可能会影响服务器的入口带宽,所以在这里也做了限制:

iptables -A INPUT -p tcp --syn -m limit --limit 100/s --limit-burst 100 -j  ACCEPT

  上面的命令每秒钟最多允许100个新连接。请注意这里的新连接指的是state为New的数据包,在后面我们也配置了允许状态为ESTABLISHED和RELATED的数据通过;另外,100这个阀值则要根据服务器的实际情况来调整,如果是并发量不大的服务器这个数值就要调小,如果是访问量非常大且并发数不小的服务器,这个值则还需要调大。

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s –limit-burst 10 -j ACCEPT

  这是为了防止ping洪水攻击,限制每秒的ping包不超过10个。

iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT

  上面的命令防止各种端口扫描,将SYN及ACK SYN限制为每秒钟不超过200个,免得把数务器带宽耗尽了。

  后续加固工作

  iptables防火墙运行后,运行nmap工具进行扫描:

# nmap -P0 -sS 211.143.6.x
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-03-29 16:21 CST
Interesting ports on 211.143.6.X:
Not shown: 1668 closed ports
PORT     STATE SERVICE
22/tcp   open   ssh
25/tcp   open   smtp
80/tcp   open   http
110/tcp   open   pop3
111/tcp   open   rpcbind
143/tcp   open   imap
443/tcp   open   https
465/tcp   open   smtps
587/tcp   open   submission
993/tcp   open   imaps
995/tcp   open   pop3s
1014/tcp  open   unknown

  在这里,我们发现一个1014端被某个进程打开了,用lsof -i:1014查看发现是rpc.statd打开的,这服务每次用的端口都不一样啊!本来想置之不理的,但是如果rpc.statd不能正确处理SIGPID信号,远程攻击者可利用这个漏洞关闭进程,进行拒绝服务攻击,所以还是得想办法解决掉。我们发现rpc.statd是由服务nfslock开启的,进一步查询得知它是一个可选的进程,它允许NFS客户端在服务器上对文件加锁。这个进程对应于nfslock服务,于是我们关掉了此服务:

service nfslock stop
chkconfig nfslock off

  最后想说的是,如果没有硬件防火墙保护的话,请尽量在每一台有公网IP的机器上部署iptables防火墙吧!

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-26 10:39:25

保护你的Web服务器 iptables防火墙脚本全解读的相关文章

Caddy Web服务器一键安装脚本

老左晚上有在浏览海外的资源网站时候有看到一键快速安装Caddy Web服务器的脚本以及简单的应用,所以准备也在博客中整理出来.Caddy这款工具是利用GO语言写的WEB Service服务器,支持HTTP/2静态网页服务器,当然老左也没有深入的研究其功能,因为我在简单的快速安装之后看到是支持HTML等静态文件的,对于PHP等我们常用在Nginx.Apache等动态交互环境有些不同. 在记录这篇文章的时候,老左大概浏览关于Caddy 的相关信息,在国内的信息还是比较少的,也许后面会有所关注或者后面

Nginx+PHP(FastCGI)搭建高并发WEB服务器(自动安装脚本)第二版_nginx

本文是依照张宴的 Nginx 0.7.x + PHP 5.2.10(FastCGI)搭建胜过Apache十倍的Web服务器(第5版) 编写 原文地址 http://blog.s135.com/nginx_php_v5/ 因为编译过程和等待时间繁琐,于是就自己写了个全自动安装的shell脚本,此脚本可以随意修改,转载请注明出处. 这篇文章为这个系列的第二版,在第一版的基础上加入 1.日志切割 2.智能选择yum或者rpm安装 下载地址 注意:如果不能使用yum源,请放入系统光盘,单张dvd的,如果

构建高安全电子商务网站:Linux服务器iptables规则列表全攻略

服务器的安全性,一直是网站的首要考虑的任务.针对安全性有多种多样的解决方案.Linux服务器防火墙,最常用到的当然要数iptables防火墙.iptables是Linux上常用的防火墙软件,规则也非常灵活,应该最广泛. 对应要构建高安全电子商务网站,任何一台服务器少不了的安全软件,当然是iptables防火墙.规则灵活多变,功能应该之广泛,这个也是Linux系统管理员首选.iptables表链中每条规则的顺序很重要,如果首条是accept all,那末所有的数据包都会被允许通过firewall,

让Web服务器远离脚本攻击

不少Web服务器都是架设在Windows 2003服务器系统环境中的,但是在默认状态下该服务器系统存在不少安全漏洞,许多黑客或者非法攻击者往往会充分利用这些漏洞,来攻击架设在该系统中的Web网站.为了提高Web服务器的运行安全性,我们有必要及时采取措施,防范Web服务器中的各式脚本攻击:下面,本文就为各位贡献几则让Web服务器远离脚本攻击的设置巧招,希望这些内容能帮助各位安全维护好服务器系统! 从访问权限下手,防范脚本攻击 网站访问者在访问Web服务器中的内容时,一般是通过"IUSR_SERVE

FreeBSD下构建安全的Web服务器(3)

web|web服务|web服务器|安全 对于使用php脚本来进行交互,最好建立一个用户只针对某个库有 update.select.delete.insert.drop table.create table等权限,这样就很好避免了数据库用户名和密码被黑客查看后最小损失. 比如下面我们创建一个数据库为db1,同时建立一个用户test1能够访问该数据库. mysql> create database db1; mysql> grant select,insert,update,delete,crea

接上配置的cisco asa 5510防火墙后,办公电脑不能web服务器,希望高手帮帮忙

问题描述 公司是以配置的ciscoasa5510防火墙做为内网与外网的分界,web服务器置于防火墙外面,web内置两张网卡,一张接防火墙,另一张接外部的交换机,交换机接办公电脑,然后接外网,可是当防火墙与web服务器连接时,电脑就不能访问web服务器,这是什么原因,要怎么 解决方案 本帖最后由 zhangyw0221 于 2012-05-14 09:13:53 编辑

简单十大步骤 保护IIS Web服务器安全

通过下面 10 步来保护 IIS: 1.为IIS 应用程序和数据专门安装一个NTFS 设备.如果有可能,不要允许IUSER(或其它任何匿名用户名)去访问任何其它设备.如果应用程序因为匿名用户无法访问其它设备上的程序而出了问题,马上使用Sysinternals 的FileMon 检测出哪个文件无法访问,并吧这个程序转移到IIS 设备上.如果无法做到这些,就允许IUSER 访问且只能访问这个文件. 2.在设备上设置NTFS 权限: Developers = Full(所有权限) IUSER = Re

实用防火墙(Iptables)脚本分析

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://chenguang.blog.51cto.com/350944/1338882 实用防火墙(Iptables)脚本分析 --Redhat,CentOS,Ubuntu等常见Linux发行版中都会预装Iptables防火墙,大多数初学者设置起来由于对这款软件比较陌生,设置起来比较困难,下面这段脚本实现了修改变量的值就能轻松移植到自己的网络,同时对各段内容做了介绍.首先在/usr/bi

一键配置CentOS iptables防火墙的Shell脚本分享_linux shell

手里几台VPS配置iptables太繁琐,看到了朱哥的LNMP脚本里有一个自动配置iptables防火墙的脚本,借来改了一下,给需要的人用: 只提供常用端口的设置,如果你有特殊需求只需自行添加或减少相应的端口即可: 使用方法: 复制代码 代码如下: chmod +x iptables.sh ./iptables.sh 设置iptables开机自动启动: 复制代码 代码如下: chkconfig --level 345 iptables on 完整Shell: 复制代码 代码如下: #!/bin/