linux设置iptables防火墙的详细步骤
我们 来讨论一下如何为你的CentOS 服务器来设置简单的防火墙。 这里我们以DigitalOcean的CentOS 6 VPS为基础来讨论的,同样也适用于 阿里云上其他类型的LINUX系统。 (阿里云有个云盾系统,因此在你自己的VPS上不设置防火墙也是可以的)
需要说明的是: 本文只涉及最基础最常用的防火墙设置,能屏蔽一些常用的攻击,但并不能彻底保证你的服务器的安全。
系统的随时更新 以及 关闭不必要的服务 仍然是保证系统安全非常重要的步骤。
如果你需要更全面的了解iptables,阅读本文后,请google或是阅读更加深入的资料!
首先简单介绍一下什么是IPTables:
iptables是Linux内核中内置的防火墙,可以允许管理员通过设置table, chain以及相关的规则来进行数据包过滤和NAT。 一般来讲,iptables防火墙已经内置于CentOS 6及其他Linux版本中,而且iptables服务默认都是启动的。 iptables应用于IPv4, 如果要用IPv6,需要使用ip6tables
iptables的命令格式:
复制代码
代码如下:
iptables[-ttable]command[chain][rules][-jtarget]
[-ttable]:用来指明使用的表,有三种选项:filter,nat和mangle,如果未指定,则使用filter作为缺省表。事实上,对于单个服务器的防火墙配置,一般来讲,我们只需要对filter表进行配件就OK了。filter表包括INPUT,OUTPUT,和FORWARD三个chain
command表明iptables命名要做什么,比如
-A(–append):该命令会把一条规则附件到chain的末尾。
-D(–delete)用来删除某个规则。
-F(–flush)如果指定了chain,删除该chain中的所有规则,如果未指定chain,则删除所有chain中的所有规则。
target:是由规则指定的操作。包括下面几种:
ACCEPT:接收信息包(允许它前往目的地),并且将停止遍历chain
DROP:拒绝,
此外还有REJECT,RETURN,LOG,REDIRECT,MARK,MIRROR,MAQUERADE等。
具体的iptables的语法和概念就不再多说了,请参照iptablesmanpage官方文档
简单来说,iptables防火墙是由一系列的规则(rule)组成,一个数据请求进来,会依次和这些规则进行比较,如果正好符合规则的定义,那这个数据请求要么会被接收ACCEPT,要么被拒绝DRIP。如果不符合任何规则的定义,最后缺省的规则会被应用。
开始操作之前:
注意:一定要把你在DigitalOcean/Linode/阿里云上的服务器做一下快照备份,否则一旦你iptables的配置出了问题,极有可能把你自己挡在门外,你自己都无法连接到服务器了!!出现这种情况可是会欲哭无泪呀,除了重新做系统好像没有更好的办法了。(DigitalOcean提供了一个webconsole的界面,有时候会给你反悔和擦除iptables设置的机会,但阿里云没有)
决定哪些端口需要开放
首先,SSH的端口22自然是需要开放的,否则我们就无法登录服务器了。
一般来讲,CentOS的VPS经常作为用LAMP搭建的Web服务器,FTP服务器,Mail服务器等。
对于Web服务来说,需要开放80端口,如果是HTTPS/SSL协议的话,还需用开放443端口
对于Mail服务来说,由于涉及SMTP,POP3,IMAP协议,需要开放的端口如下:
SMTP:25SecureSMTP:465POP3:110SecurePOP3:995IMAP:143IMAPoverSSL:993
对于FTP服务来说,需要开放20,21两个端口
第一步:屏蔽最常见的攻击
缺省情况下,CentOS的iptables的设置是允许任何数据通过的。
我们首先要清空iptables中的所有的规则:
复制代码
代码如下:
iptables-F
然后我们加上阻止简单扫描和攻击的规则
复制代码
代码如下:
iptables-AINPUT-ptcp--tcp-flagsALLNONE-jDROP#NONE包(所有标识bit都没有设置)主要是扫描类的数据包
iptables-AINPUT-ptcp!--syn-mstate--stateNEW-jDROP#防止sync-flood攻击
iptables-AINPUT-ptcp--tcp-flagsALLALL-jDROP#ALL包(所有的标注bit都被设置了)也是网络扫描的数据包
关于sync-flood,请参照wikipedia的解释。
第二步:为相应的服务开放对应的端口
首先我们应该接受本机localhost的任何请求,否则,数据库连接等将无法工作
1
iptables-AINPUT-ilo-jACCEPT
对于不同的服务需要开放不同的端口
复制代码
代码如下:
iptables-AINPUT-ptcp--dport22-jACCEPT#SSH
iptables-AINPUT-ptcp--dport80-jACCEPT#HTTP
iptables-AINPUT-ptcp--dport443-jACCEPT#HTTPS
iptables-AINPUT-ptcp--dport25-jACCEPT#SMTP
iptables-AINPUT-ptcp--dport465-jACCEPT#SecureSMTP
iptables-AINPUT-ptcp--dport110-jACCEPT#POP3
iptables-AINPUT-ptcp--dport995-jACCEPT#SecurePOP3
iptables-AINPUT-ptcp--dport143-jACCEPT#IMAP
iptables-AINPUT-ptcp--dport993-jACCEPT#SecureIMAP
第三步:加上通用的规则
首先要允许所有从服务器端发起的连接,由此返回的响应数据应该是允许的!比如VPS发起的yumupdate,必须要允许外部的update数据进来
复制代码
代码如下:
iptables-IINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT
最后,设置缺省的策略:屏蔽任何进入的数据请求,允许所有从Server发出的请求
复制代码
代码如下:
iptables-POUTPUTACCEPT/ppiptables-PINPUTDROP
至此,规则设置完毕
第四步:保存设置
首先通过下面的命令查看一下我们的设置是否正确!
复制代码
代码如下:
iptable-L-n
确认没有问题后,执行下面的命令
复制代码
代码如下:
serviceiptablessave
执行上述命令后,相应的规则会写入/etc/sysconfig/iptables这个文件,你可以检查一下看看。
最后执行
复制代码
代码如下:
serviceiptablesrestart
重新启动iptables防火墙,以使上述设置生效。
最佳的方法:
为了更方便的修改和维护自己的iptables的设置,我一般是把所有的iptables的设置先写到一个单独文件中,测试没有问题后。然后再保存到iptable的配置文件中。
下面是我自己的iptables文件~/script/firewallsh
复制代码
代码如下:
#!/bin/bash
#Asimpleiptablesfirewallconfiguration/ppPATH=/sbin:/bin:/usr/sbin:/usr/bin;exportPATH/pp#flush/eraseoriginalrules
iptables-F#清除所有已制定的rule
iptables-X#清除用户自定义的chain/table
iptables-Z#将所有的chain的计数和流量统计归零/pp#Acceptlocalhostconnetting,nomatterwhatitis
iptables-AINPUT-ilo-jACCEPT/pp#Acceptanyresponsepackagewhichisinitiatedfrominside
iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT/pp#blockmostcommonnetworkattacks(reconpacketsandsyn-floodattack)
iptables-AINPUT-ptcp--tcp-flagsALLNONE-jDROP
iptables-AINPUT-ptcp!--syn-mstate--stateNEW-jDROP
iptables-AINPUT-ptcp--tcp-flagsALLALL-jDROP/pp#openportsfordifferentservices
iptables-AINPUT-ptcp--dport22-jACCEPT#SSH
iptables-AINPUT-ptcp--dport80-jACCEPT#HTTP
#iptables-AINPUT-ptcp--dport443-jACCEPT#HTTPS
#iptables-AINPUT-ptcp--dport25-jACCEPT#SMTP
#iptables-AINPUT-ptcp--dport465-jACCEPT#SecureSMTP
#iptables-AINPUT-ptcp--dport110-jACCEPT#POP3
#iptables-AINPUT-ptcp--dport995-jACCEPT#SecurePOP/pp#ICMPconfiguration
#TopreventICMPDDOS,wedonotallowICMPtype8(echo-request)orlimitthisrequestwith1/second
#someICMPrequestsareallowed
icmp_type="0341112141618"
forticmpin$icmp_type
do
iptables-AINPUT-picmp--icmp-type$ticmp-jACCEPT
done
#iptables-AINPUT-picmp--icmp-type8-mlimit--limit1/second-jACCEPT/pp#defaultpolicies
iptables-POUTPUTACCEPT
iptables-PINPUTDROP/pp#saveto/etc/sysconfig/iptables
/etc/initd/iptablessave
你可以根据你的需要进行相应的修改。
14、控制防火墙开放3306端口并且关闭selinux
(1)开放3306端口
vim /etc/sysconfig/iptables
添加以下代码(可以继续添加,修改端口号即可)
#/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
然后保存,重启防火墙使配置生效
/etc/initd/iptables restart
shutdown -r now #重启系统
查看打开的端口
/etc/initd/iptables status
(2)关闭SELINUX
vim /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
:wq! #保存退出
shutdown -r now #重启系统
/usr/sbin/sestatus-v #查看SELinux状态
通过本教程操作,请确认您能使用linux本机。如果您使用的是ssh远程,而又不能直接操作本机,那么建议您慎重,慎重,再慎重!
我们来配置一个filter表的防火墙
(1)查看本机关于IPTABLES的设置情况
复制代码
代码如下:
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination/ppChain FORWARD (policy ACCEPT)
target prot opt source destination/ppChain OUTPUT (policy ACCEPT)
target prot opt source destination/ppChain RH-Firewall-1-INPUT (0 references)
target prot opt source destination
ACCEPT all -- 0000/0 0000/0
ACCEPT icmp -- 0000/0 0000/0 icmp type 255
ACCEPT esp -- 0000/0 0000/0
ACCEPTah--0000/00000/0
ACCEPTudp--0000/022400251udpdpt:5353
ACCEPTudp--0000/00000/0udpdpt:631
ACCEPTall--0000/00000/0stateRELATED,ESTABLISHED
ACCEPTtcp--0000/00000/0stateNEWtcpdpt:22
ACCEPTtcp--0000/00000/0stateNEWtcpdpt:80
ACCEPTtcp--0000/00000/0stateNEWtcpdpt:25
REJECTall--0000/00000/0reject-withicmp-host-prohibited
可以看出我在安装linux时,选择了有防火墙,并且开放了22,80,25端口
如果你在安装linux时没有选择启动防火墙,是这样的
复制代码
代码如下:
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination /ppChain FORWARD (policy ACCEPT)
target prot opt source destination /ppChain OUTPUT (policy ACCEPT)
target prot opt source destination
什么规则都没有
(2)清除原有规则
不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则
复制代码
代码如下:
[root@tp ~]# iptables -F 清除预设表filter中的所有规则链的规则
[root@tp ~]# iptables -X 清除预设表filter中使用者自定链中的规则
我们在来看一下
复制代码
代码如下:
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination /ppChain FORWARD (policy ACCEPT)
target prot opt source destination /ppChain OUTPUT (policy ACCEPT)
target prot opt source destination
什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保存
复制代码
代码如下:
[root@tp ~]# /etc/rcd/initd/iptables save
这样就可以写到/etc/sysconfig/iptables文件里了写入后记得把防火墙重起一下,才能起作用
复制代码
代码如下:
[root@tp ~]# service iptables restart
现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧
(3)设定预设规则
复制代码
代码如下:
[root@tp ~]# iptables -P INPUT DROP
[root@tp ~]# iptables -P OUTPUT ACCEPT
[root@tp ~]# iptables -P FORWARD DROP
上面的意思是,当超出了IPTABLES里filter表里的两个链规则(INPUT,FORWARD)时,不在这两个规则里的数据包怎么处理呢,那就是DROP(放弃)应该说这样配置是很安全的我们要控制流入数据包
而对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT,也就是说,不在着个规则里的包怎么办呢,那就是通过
可以看出INPUT,FORWARD两个链采用的是允许什么包通过,而OUTPUT链采用的是不允许什么包通过
这样设置还是挺合理的,当然你也可以三个链都DROP,但这样做我认为是没有必要的,而且要写的规则就会增加但如果你只想要有限的几个规则是,如只做WEB服务器还是推荐三个链都是DROP
注:如果你是远程SSH登陆的话,当你输入第一个命令回车的时候就应该掉了因为你没有设置任何规则
怎么办,去本机操作呗!
(4)添加规则
首先添加INPUT链,INPUT链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链
为了能采用远程SSH登陆,我们要开启22端口
复制代码
代码如下:
[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
(注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH在远程一下,是不是好了
其他的端口也一样,如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链:
复制代码
代码如下:
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
,其他同理
如果做了WEB服务器,开启80端口
复制代码
代码如下:
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
如果做了邮件服务器,开启25,110端口
复制代码
代码如下:
[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
如果做了FTP服务器,开启21端口
复制代码
代码如下:
[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
如果做了DNS服务器,开启53端口
复制代码
代码如下:
[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
如果你还做了其他的服务器,需要开启哪个端口,照写就行了
上面主要写的都是INPUT链,凡是不在上面的规则里的,都DROP
允许icmp包通过,也就是允许ping,
复制代码
代码如下:
[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT设置成DROP的话)
[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT设置成DROP的话)
允许loopback!(不然会导致DNS无法正常关闭等问题)
复制代码
代码如下:
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链
减少不安全的端口连接
复制代码
代码如下:
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会
还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料
当然出入更安全的考虑你也可以包OUTPUT链设置成DROP,那你添加的规则就多一些,就像上边添加
允许SSH登陆一样照着写就行了
下面写一下更加细致的规则,就是限制到某台机器
如:我们只允许19216803的机器进行SSH连接
复制代码
代码如下:
[root@tp ~]# iptables -A INPUT -s 19216803 -p tcp --dport 22 -j ACCEPT
如果要允许,或限制一段IP地址可用 19216800/24 表示19216801-255端的所有IP
24表示子网掩码数但要记得把 /etc/sysconfig/iptables 里的这一行删了
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆
或采用命令方式:
复制代码
代码如下:
[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存写入到/etc/sysconfig/iptables文件里
复制代码
代码如下:
[root@tp ~]# /etc/rcd/initd/iptables save
这样写 !19216803 表示除了19216803的ip地址
其他的规则连接也一样这么设置
在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
复制代码
代码如下:
[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
复制代码
代码如下:
[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个
复制代码
代码如下:
[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包
复制代码
代码如下:
[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只所以允许ICMP包通过,就是因为我在这里有限制
二,配置一个NAT表放火墙
1,查看本机关于NAT的设置情况
复制代码
代码如下:
[root@tp rcd]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 19216800/24 anywhere to:21110146235
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我的NAT已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则)关于怎么配置NAT,参考我的另一篇文章
当然你如果还没有配置NAT的话,你也不用清除规则,因为NAT在默认情况下是什么都没有的
如果你想清除,命令是
复制代码
代码如下:
[root@tp ~]# iptables -F -t nat
[root@tp ~]# iptables -X -t nat
[root@tp ~]# iptables -Z -t nat
2,添加规则
添加基本的NAT地址转换,(关于如何配置NAT可以看我的另一篇文章),
添加规则,我们只添加DROP链因为默认链全是ACCEPT
防止外网用内网IP欺骗
复制代码
代码如下:
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10000/8 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 1721600/12 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 19216800/16 -j DROP
如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP,(个人认为没有太大必要)
例:
禁止与21110146253的所有连接
复制代码
代码如下:
[root@tp ~]# iptables -t nat -A PREROUTING -d 21110146253 -j DROP
禁用FTP(21)端口
复制代码
代码如下:
[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
这样写范围太大了,我们可以更精确的定义
复制代码
代码如下:
[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -d 21110146253 -j DROP
这样只禁用21110146253地址的FTP连接,其他连接还可以如web(80端口)连接
按照我写的,你只要找到QQ,MSN等其他软件的IP地址,和端口,以及基于什么协议,只要照着写就行了
最后:
drop非法连接
复制代码
代码如下:
[root@tp ~]# iptables -A INPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables -A OUTPUT -m state --state INVALID -j DROP
[root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP
允许所有已经建立的和相关的连接
复制代码
代码如下:
[root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# /etc/rcd/initd/iptables save
这样就可以写到/etc/sysconfig/iptables文件里了写入后记得把防火墙重起一下,才能起作用.
复制代码
代码如下:
[root@tp ~]# service iptables restart
别忘了保存,不行就写一部保存一次.你可以一边保存,一边做实验,看看是否达到你的要求,
上面的所有规则我都试过,没有问题
一、Linux下开启/关闭防火墙命令
1、永久性生效,重启后不会复原。
开启: chkconfig iptables on
关闭: chkconfig iptables off
2、 即时生效,重启后复原
开启: service iptables start
关闭: service iptables stop
需要说明的是对于Linux下的其它服务都可以用以上命令执行开启和关闭操作。
在当开启了防火墙时,做如下设置,开启相关端口,
修改/etc/sysconfig/iptables 文件,添加以下内容:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
二、UBuntu关闭防火墙
iptables -A INPUT -i ! PPP0 -j ACCEPT
三、CentOS Linux 防火墙配置及关闭
执行”setup”命令启动文字模式配置实用程序,在”选择一种工具”中选择”防火墙配置”,然后选择”运行工具”按钮,出现防火墙配置界面,将”安全级别”设为”禁用”,然后选择”确定”即可
或者用命令:
#/sbin/iptables -I INPUT -p tcp –dport 80 -j ACCEPT
#/sbin/iptables -I INPUT -p tcp –dport 22 -j ACCEPT
#/etc/rcd/initd/iptables save
这样重启计算机后,防火墙默认已经开放了80和22端口
这里应该也可以不重启计算机:
#/etc/initd/iptables restart
关闭防火墙服务即可:
查看防火墙信息:
#/etc/initd/iptables status
关闭防火墙服务:
#/etc/initd/iptables stop
配置linux下的防火墙的方法,可以通过以下步骤操作来实现:
一、在Linux系统中安装Iptables防火墙
1、Linux发行版都预装了Iptables。您可以使用以下命令更新或检索软件包:
二、关闭哪些防火墙端口
防火墙安装的第一步是确定哪些端口在服务器中保持打开状态。这将根据您使用的服务器类型而有所不同。例如,如果运行的是Web服务器,则可能需要打开以下端口:
网络:80和443
SSH:通常在端口22上运行
电子邮件:110(POP3),143(IMAP),993(IMAP SSL),995(POP3 SSL)。
1、还原默认防火墙规则
为确保设置无误,需从一套新的规则开始,运行以下命令来清除防火墙中的规则:
2、屏蔽服务器攻击路由
可以运行下列标准命令来隔绝常见的攻击。
屏蔽syn-flood数据包:
屏蔽XMAS数据包:
阻止无效数据包:
3、打开所需端口
根据以上命令可屏蔽常见的攻击方式,需要打开所需端口。下列例子,供参考:
允许SSH访问:
打开LOCALHOST访问权限:
允许网络流量:
允许SMTP流量:
三、测试防火墙配置
运行下列命令保存配置并重新启动防火墙:
0条评论