防火墙是一种应用于网络上的过滤机制,从保护对象上可分为:主机防火墙、网络防火墙,从物理上可分为:硬件防火墙、软件防火墙。
保护对象上的分类:
- 主机防火墙:针对于单个主机进行防护
- 网络防火墙:往往部署于网络边界,对流入以及流出的流量进行过滤
物理上的分类:
- 硬件防火墙:拥有经过特别设计的硬件及芯片,性能高、成本高
- 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低、成本低
【1】基本介绍与操作
① 概述
当主机收到一个数据包后,数据包先在内核空间
中处理。若发现目的地址是自身,则传到用户空间
中交给对应的应用程序处理。若发现目的不是自身,则会将包丢弃或进行转发。
iptables实现防火墙功能的原理
在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING
,称为钩子函数。iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包
”。
iptables中定义有5条链,说白了就是上面说的5个钩子函数。因为每个钩子函数中可以定义多条规则,每当数据包到达一个钩子函数时,iptables就会从钩子函数中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合钩子函数中任一条规则,iptables就会根据该函数预先定义的默认策略来处理数据包。
iptables定义的表
在每个链上都有一堆规则,但是部分规则是相似的,那我们把一些实现相同功能的规则放在一起,就能轻松的完成复用了—这就是表。
- filter:负责过滤功能,内核模块 iptables_filter
- nat:负责进行网络地址转换,内核模块 iptable_nat
- mangle:拆解报文,进行修改,重新封装,内核模块 iptable_mangle
- raw:关闭 nat 表上启用的连接追踪机制,内核模块 iptable_raw
- security:安全相关。CentOS 7 里新增的表,暂且不介绍
表具有一定的优先级:raw–>mangle–>nat–>filter。一条链上可定义不同功能的规则,检查数据包时将根据上面的优先级顺序检查。
② 命令与规则详解**
语法格式如下:
iptables(选项)(参数)
- 选项
-t<表>:指定要操纵的表;
-A --apend:向规则链中添加条目;
-D --delete:从规则链中删除条目;
-I --insert:向规则链中插入条目;
-R --replace:替换规则链中的条目;
-L --list:显示规则链中已有的条目;
-F --flush:清除规则链中已有的条目;
-Z --zero:清空规则链中的数据包计算器和字节计数器;
-N --new-chain:创建新的用户自定义规则链;
-P --policy:定义规则链中的默认目标;
-h --help:显示帮助信息;
-p --protocol:指定要匹配的数据包协议类型;
-s --source:指定要匹配的数据包源ip地址;
-j<目标> --jump target:指定要跳转的目标;
-i<网络接口> --interface:指定数据包进入本机的网络接口;
-o<网络接口> --output:指定数据包要离开本机所使用的网络接口。
iptables命令选项输入顺序:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网>
--sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
表名包括:
raw:高级功能,如:网址过滤。
mangle:数据包修改(QOS),用于实现服务质量。
nat:地址转换,用于网关路由器。
filter:包过滤,用于防火墙规则。
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
规则链名包括:
INPUT链:处理输入数据包。
OUTPUT链:处理输出数据包。
PORWARD链:处理转发数据包。
PREROUTING链:用于目标地址转换(DNAT)。
POSTOUTING链:用于源地址转换(SNAT)。
动作包括:
ACCEPT:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。
REJECT:丢弃数据包并给发送此数据包的主机发送一条icmp包来进行说明。
③ 操作防火墙服务的常用命令
查询防火墙状态:
[root@localhost ~] service iptables status
停止防火墙:
[root@localhost ~] service iptables stop
启动防火墙:
[root@localhost ~] service iptables start
重启防火墙:
[root@localhost ~] service iptables restart
永久关闭防火墙:
[root@localhost ~] chkconfig iptables off
永久关闭后启用:
[root@localhost ~] chkconfig iptables on
【2】配置防火墙
修改配置文件命令如下:
vim /etc/sysconfig/iptables
假设添加8656端口:
保存配置文件并执行如下命令使其生效:
[root@localhost ~]# service iptables restart
这里记录一个小坑,当你在iptables文件里面修改后,谨记不要使用如下命令:
servcie iptables save
如果直接编辑了配置文件,然后用service iptables save
,那么内存里的配置规则是初始的,会覆盖你直接对配置文件的编辑 !
那么该命令如何使用呢?
在你使用命令修改防火墙情况下,使用该命令会使其永久有效!
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 82 -j ACCEPT
#上面的命令即时生效,但是重启iptables服务后就消失了
service iptables save
#iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
【3】iptables实例说明
实例如下:
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:168]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3389 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 8080,8081,8082,8083,8161 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
实例说明如下:
:INPUT ACCEPT [0:0]
# 该规则表示INPUT链默认策略是ACCEPT
:FORWARD ACCEPT [0:0]
# 该规则表示FORWARD链默认策略是ACCEPT
:OUTPUT ACCEPT [0:0]
# 该规则表示OUTPUT链默认策略是ACCEPT
-A INPUT -i lo -j ACCEPT
#-i 参数是指定接口,这里的接口是lo ,lo就是Loopback(本地环回接口)。
#意思就允许本地环回接口在INPUT链的所有数据通信。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#意思是允许进入的数据包只能是刚刚我发出去的数据包的回应。
#ESTABLISHED:已建立的链接状态。RELATED:该数据包与本机发出的数据包有关。
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
#这两条的意思是在INPUT链和FORWARD链中拒绝所有其他不符合上述任何一条规则的数据包。
#并且发送一条host prohibited的消息给被拒绝的主机。
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
#iptables可以使用扩展模块来进行数据包的匹配,语法就是 -m module_name。
#所以-m state 的意思是使用 state 扩展模块的功能。
#-m state --state NEW表示数据包的状态必须是NEW.
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
#在所有网卡上打开ping功能,便于维护和检测。