7、linux防火墙的使用(iptables)
7.1、说明:
CentOS 7 系统默认的防火墙是 Filewalld。不过,现在应该还有很多用户习惯使用 iptables。本文以 CentOS 7 为例,
说明在 CentOS 7 中如何安装并使用 iptables。
防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
如果匹配上规则,即明确表示是阻止(DROP)还是通过(ACCEPT)数据包就不再向下匹配新的规则。
如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
防火墙的默认规则是所有规则执行完才执行的。
(1)如果是命令增加条目,那规则是临时生效的,重启iptables服务后就消失了。
(2)如果要永久生效,要把规则写进配置文件。写配置文件的办法有两种:
一种是直接编辑后 service iptables restart,一种是 service iptables save后service iptables restart。
(3)iptables服务每次启动的时候才会去读一次规则。如果直接编辑了配置文件,然后用 service iptables save,那么内存里的配置规则是初始的,会覆盖你直接对配置
文件的编辑。因此,最后的结论是,如果是临时规则,用上面的第(1)种办法,但是不要save;如果是永久规则,用上面(2)中的第一种或第二种方法,二选一不可混用。
(4)进站默认:firewalld默认是拒绝的(ping和ssh不拒绝),需要设置以后才能放行。而iptables默认是允许的,需要拒绝的才去限制。
出站默认:firewalld、iptables 不限制。
7.2、iptables 服务命令:
1、安装iptables 服务:
yum install iptables-services
2、iptables 的启动、停止、重启,状态:
systemctl start iptables.service
systemctl stop iptables.service
systemctl restart iptables.service
systemctl status iptables.service
3、iptables 开机自启动服务的开启、关闭,查看状态:
systemctl enable iptables.service
systemctl disable iptables.service
[root@centos-test ~]# systemctl list-unit-files| grep iptables.service
iptables.service enabled
4、卸载 iptables:
yum erase iptables
5、五链:
PREROUTING
FORWARD
INPUT
OUPUT
POSTROUTING
(1)Filter表:
表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
INPUT链
#处理来自外部的数据。
OUTPUT链
#处理向外发送的数据。
FORWARD链
#将数据转发到本机的其他网卡设备上。
(2)NAT表有三种内建链:
PREROUTING链
#处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链
#处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
OUTPUT链
#处理本机产生的数据包。
7.3、防火墙之filter表操作:
(0)备份原有的iptables文件,方便进行恢复:
[root@centos-test ~]# cp -a /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
(1)查看本机关于IPTABLES的设置情况
[root@centos-test ~]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
#该规则表示INPUT表默认策略是ACCEPT。
:FORWARD ACCEPT [0:0]
#该规则表示FORWARD表默认策略是ACCEPT。
:OUTPUT ACCEPT [0:0]
#该规则表示OUTPUT表默认策略是ACCEPT。
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#该规则表示允许进入的数据包只能是刚刚我发出去的数据包的回应,ESTABLISHED:已建立的链接状态。RELATED:该数据包与本机发出的数据包有关。
-A INPUT -p icmp -j ACCEPT
#该规则指的是icmp协议的包都接受通过(ping命名发出的就是icmp的包)。
-A INPUT -i lo -j ACCEPT
#-i参数是指定接口,这里的接口是lo ,lo就是Loopback(本地环回接口),意思就允许本地环回接口在INPUT表的所有数据通信。
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
#该规则指的是新连接ssh默认端口22的允许进入。
-A INPUT -j REJECT --reject-with icmp-host-prohibited
#该规则指的是在INPUT表中拒绝所有其他不符合上述任何一条规则的数据包,并且发送一条host prohibited的消息给被拒绝的主机。
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
#该规则指的是在FORWARD表中拒绝所有其他不符合上述任何一条规则的数据包。并且发送一条host prohibited的消息给被拒绝的主机。
COMMIT
#iptables可以使用扩展模块来进行数据包的匹配,语法就是 -m module_name, 所以 -m tcp 的意思是使用 tcp 扩展模块的功能 (tcp扩展模块提供了 --dport, --tcp-flags, --sync等功能)
#其实在命令中只用 -p tcp 的话, iptables也会默认的使用 -m tcp 来调用 tcp 模块提供的功能(写在/etc/sysconfig/iptables 文件中的规则必须使用 –m tcp,否则报错)。
#在使用 –m 其它模块时,命令行和配置文件都要写。
#-m state --state <状态> 有数种状态,状态有:
#NVALID:无效的封包,例如数据破损的封包状态,通常这些包被DROP;
#STABLISHED:已经联机成功的联机状态;
#NEW:想要新建立联机的封包状态,允许已建立的连接接收数据,iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
#RELATED:这个最常用!表示这个封包是与我们主机发送出去的封包有关, 可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定,因为设定了他之后,
#要未来由本机发送出去的封包,即使我们没有设定封包的 INPUT 规则,该有关的封包还是可以进入我们主机,相反也可,可以简化相当多的设定规则。
[root@centos-test ~]# iptables -L –n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#可以看出我在安装linux时,选择了有防火墙,允许所有的进站和出站规则,并且有一些默认的规则。
#查看管理命令 “-L”的附加子命令:
#-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
#-v:显示详细信息
#-vvv :越多越详细
#-x:在计数器上显示精确值,不做单位换算
iptables -L –n –line-number
#—line-number 参数表示在规则前显示行号。
pkts
#被本机报文所匹配的个数
bytes
#报文所有大小记起来之和
target
#处理机制
prot
#放行哪种协议
opt
#额外的选项,-- 表示没有
source
#源地址
destination
#目标地址
target处理机制规则如下:
DROP
#丢弃
REJECT
#拒绝
ACCEPT
#接受
RETURN
#返回主链继续匹配
REDIRECT
#端口重定向
MASQUERADE
#地址伪装
DNAT
#目标地址转换
SNAT
#源地址转换
MARK
#打标签
#如果你在安装linux时没有选择启动防火墙,如下,什么规则都没有
[root@tp ~]# 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
(2)清除原有规则.
如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.
[root@tp ~]# iptables –F 清除预设表filter中的所有规则链的规则
警告:这只适合在没有配置防火墙的环境中,如果已经配置过默认规则为deny的环境,此步骤将使系统的所有网络访问中断,
如果想在配置了iptables默认规则为DROP的环境中清空的话,必须首先执行
1)/sbin/iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
然后执行
2)/sbin/iptables -F
通过iptables -L 看到如下信息
Chain INPUT (policy DROP 0 packets, 0 bytes) (注意 是DROP)
因为默认INPUT链规则如果是DROP的,此时执行/sbin/iptables -F 你的ssh远程连接立马断开所有的连接。此时只能去现场接屏幕或ILO了。
[root@tp ~]# iptables –X 清除预设表filter中使用者自定链中的规则
[root@tp ~]# iptables –Z 清空计数器
我们在来看一下
[root@tp ~]# 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
什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置IP一样,重起就会失去作用),怎么保存.
[root@tp ~]# service iptables save
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
[root@tp ~]# service iptables restart
现在IPTABLES配置表里什么配置都没有了,那我们开始我们的配置吧
(3)设定预设规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#提前开放22端口,如果你是远程SSH登陆不使用该命令,当你输入下面第一条命令回车时ssh登录就应该掉了,因为你没有设置任何规则,断开后只能通过服务器本机进行操作了。
[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.
(4)添加规则.
iptables命令书写格式及参数
Iptables [-t/table] COMMAND chain CRETIRIA -j ACTION
-i:入站接口,只能用-i指定进来的网络接口。
-o:出站接口,只能用-o指定出去的网络接口。
为了能采用远程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)
(注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一条,好多人都是忘了写这一部规则导致,始终无法SSH.在远程一下,是不是好了.其他的端口也一样,
如果开启了web服务器,OUTPUT设置成DROP的话,同样也要添加一条链,其他同理.)
允许用户与服务器建立连接(不常用)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#该规则表示允许进入的数据包只能是刚刚我发出去的数据包的回应
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#该规则表示发出去的数据包只能是刚刚进入数据包的回应,如下方法也可连接ssh。
[root@centos-test ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
如果做了WEB服务器,开启80端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT (如果是OUTPUT DROP)
如果做了邮件服务器,开启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 20 -j ACCEPT
如果做了DNS服务器,开启53端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
允许icmp包通过,也就是允许ping
[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (如果是OUTPUT DROP)
允许loopback!(不然会导致DNS无法正常关闭等问题,同时也允许本地ping)
IPTABLES -A INPUT -i lo -p all -j ACCEPT
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT (如果是OUTPUT DROP)
减少不安全的端口连接
iptables -A OUTPUT -p tcp --sport 27444 -j DROP
iptables -A OUTPUT -p tcp --sport 27665 -j DROP
iptables -A OUTPUT -p tcp --sport 31337 -j DROP
有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,
阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会,还有其他端口也一样,
像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.
只允许192.168.0.3的机器进行SSH连接
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -d 192.168.0.3 -p tcp --sport 22 -j ACCEPT (如果是OUTPUT DROP)
如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP,24表示子网掩码数,但要记得把 /etc/sysconfig/iptables 里的这一行删了.
!192.168.0.3 表示除了 192.168.0.3 的ip地址。
封IP段即从123.45.6.1到123.45.6.254,说明:注意一定要把拒绝的放在前面不然就不起作用了!
iptables -I INPUT -s 123.45.6.0/24 -j DROP
屏蔽某IP访问1-1024范围的端口(如果是多个不连续的端口用逗号’,’进行分割)
iptables -I INPUT -s 123.45.6.7 -p tcp --dport 1:1024 -j DROP
保存操作
[root@tp ~]# service iptables save
[root@tp ~]# service iptables restart