防火墙工作机制
linux防火墙由netfilter和iptables两个组件组成。其中netfilter为内核防火墙Framework(框架),真正起作用的是规则,规则根据匹配标准,提供相应的处理方法;而iptables是用户空间数据报文过滤、NAT、mangle等规则生成工具。简单说,iptables是定义规则的工具,定义好的规则在内核空间中由netfilter读取,并且是在特定的位置使之生效,实现防火墙功能。这些位置有如下五个。
1、INPUT:数据包从内核流到用户空间的
2、OUTPUT:数据包从用户空间流出的
3、FORWARD:从一个网络接口到另一个网络接口的
4、PREROUTING:在路由之前
5、POSTROUTING:在路由之后
这五个位置也叫做五个钩子函数(Hook function),也称为规则链。
防火墙规则
防火墙的默认规则一般分为两种,“通”和“堵”,当为“通”时,门是关着的,要谁进,定义谁;当为“堵”时,门是大敞开着的,要堵谁,定义谁。所以在定义规则时需要定义多功能多条规则来实现不同的工作功能。每个功能即为一张“表”,这些“表”有如下:
1、filter:过滤(默认表)
2、nat:地址转换
3、mangle:修改、封装源数据
4、raw:
表处理的优先级为raw>mangle>nat>filter
对于filter表一般只能做在 INPUT、OUTPUT、FORWARD三条规则链上
对于nat表一般只能做在PREROUTING、FORWARD、POSTROUTING三条规则链上
对于mangles一般在PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING五条规则链都可以做
对于raw一般在PREROUTING和OUTROUTING规则链上
可以使用自定义链,但只有在被调用时才可以使用,而且如果没有自定义链中的任意匹配规则,还应该有返回机制;
在每个规则链都有两个内置的计数器
1)被匹配的报文个数
2)被匹配的报文大小之和
历史版本:
2.0.X内核: Ipfw/firewall
2.2.X内核: Ipchain/firewall
2.4.X及2.6.X内核: iptables/netfilter
iptables不是服务,但有服务脚本。服务脚本的主要作用在于管理保存的规则
iptables服务配置文件:/etc/sysconfig/iptables-config
iptables规则保存文件:/etc/sysconfig/iptables
iptables保存规则:
servive iptables save ##默认保存在了/etc/sysconfig/iptables文件里
iptables-save > /etc/sysconfig/iptables.2016061201 #输出重定向,可以自己指定输出位置,默认重启时不会加载
iptables-restore < /etc/sysconfig/iptables.2016061201 #将自己指定位置的规则进行加载
iptables基本语法格式
iptables [-t TABLES] COMMAND CHAIN [num]匹配标准 -j处理方法
匹配标准:
通用匹配
-s ,--rsc 指定源地址
-d -dst 指定目标地址
-p (tcp|udp|icmp):指定协议
-i INTERFACE:指定数据报文流入的接口
可用于定义标准的链:PREROUTING ,INPUT, FORWARD
-o INTERFACE:指定数据报文流出的接口
可用于定义标准的链:OUTPUT,POSTROUTING,FORWARD
扩展匹配:依赖于模块
隐含拓展:不用特别指定由哪个模块进行拓展,因为此时使用-p{tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]:源端口
--dport PORT [-PORT] :目的端口
--tcp-flags mask comp :只检查mask指定的标志位,是逗号分割的标志位列表;comp:此列表中出现的标记为必须为1.
--tcp-flags SYN,FIN,ACK,RST SYN = --syn
--syn
-p icmp
--icmp-type
0:echo-reply
8:echo-request
-p udp
--sport
--dport
示例:来自192.169.137.0/24 对192.168.137.23 ssh服务都放行
[root@server23 ~]# iptables -t filter -A INPUT -d 192.168.137.23 -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT #进来
[root@server23 ~]# iptables -t filter -A OUTPUT -s 192.168.137.23 -d 192.168.137.0/24 -p tcp --sport 22 -j ACCEPT #出去
[root@server23 ~]# iptables -A OUTPUT -s 192.168.137.23 -p icmp --icmp 8 -j ACCEPT
[root@server23 ~]# iptables -A INPUT -d 192.168.137.23 -p icmp --icmp 0 -j ACCEPT
显式拓展:必须指明由哪个模块进行拓展,在iptables中使用-m选项可完成此功能.可以使用额外的匹配机制
-m EXTESTION --spe-opt
state:状态扩展
--state
结合ip_conntrack追踪会话的状态
NEW :新连接请求
ESTABLISHED:已建立的连接
INVALID:非法连接
RELATED:相关联的
--m state --state NEW,ESTABLISHED -j ACCECT
multiport: 离散的多端口匹配扩展
--destnation-ports
--soure-ports
--ports
-m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
示例:放行对主机192.168,137.23 ssh、httpd、ftp(命令请求)的请求
[root@server23 ~]# iptables -I INPUT 3 -d 192.168.137.23 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
iprange
--src-range
--des-range
[root@server23 ~]# iptables -A INPUT -m iprange --src-range 192.168.137.1-192.168.137.50 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
connlimit:连接数限制limit
--limit RATE
--limit-burst NUM
[root@server23 ~]# iptables -I INPUT -d 192.168.137.23 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 3 -j ACCEPT
[root@server23 ~]# iptables -R INPUT 6 -d 192.168.137.23 -p icmp --icmp-type 8 -m state -m limit --limit 8/min --state NEW,ESTABLISHED -j ACCEPT #每分钟只允许ping8次
注:在添加规则时要注意其他之前添加的规则是否会影响到本次添加的规则
string:字符串过滤
--algo {bm|kmp} 必加选项
--string “PATTERN” 支持正则表达式
示例:当访问到关键字为h7n9时,不予响应
[root@server23 ~]# echo "h7n9 hello world" >> var/ww/html/test.html
[root@server23 html]# iptables -I OUTPUT 1 -s 192.168.137.23 -m string --algo kmp --string "h7n9" -j REJECT
COMMAND:
管理规则
-A :attend附加一条规则,添加到链的尾部
-I CHAIN [num]:插入一条规则,插入为对应CHAIN(链)上的第num条,不加num,默认插入为第一条;
-D CHAIN [num]:删除指定链中的第num条规则。默认是第一条;
-R CHAIN [num]:替换指定的规则
管理链
-F [chain] flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链
-P CHAIN:设定指定链的默认策略;
-N:自定义一个新的空链
-X:删除一个自定义的空链
-Z:置0指定链中所有规则的计数器
-E:重命名一条自定义的链
查看类:
-L --list:显示指定表中的规则,默认会对地址进行反解析
-n:以数字形式显示主机地址和端口号
-v:显示链及规则的详细信息
-vv:
-x:显示计算器的精确值
--line-numbers:显示规则号码
处理方法:
ACCEPT:允许通过
DROP:丢弃
REJECT:拒绝
DNAT:源地址转换
SNAT:目标地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:日志
MARK:打标记
示例:安装httpd并启动服务;
在web界面可以访问到测试页;
将默认策略改为DROP(注意:在改默认策略之前,需要把必要的策略提前写好,避免不必要的麻烦,例如ssh服务)此刻web便不能访问了;
[root@server23 ~]# iptables -A INPUT -s 192.169.137.0/24 -d 192.168.137.23 -p tcp --dport 22 -j ACCEPT
[root@server23 ~]# iptables -A OUTPUT -s 192.168.137.23 -d 192.168.137.0/24 -j ACCEPT
#在添加规则时一定要将具体端口号写入,否则默认会将所有的端口号对允许的网络范围内开放,在后来添加的规则中起不到作用
[root@server23 ~]# iptables -P INPUT DROP
[root@server23 ~]# iptables -P OUTPUT DROP
在iptables里面允许任何网段访问192.168.137.23的80端口
[root@server23 ~]# iptables -I INPUT -d 192.168.137.23 -p tcp --dport 80 -j ACCEPT
此刻web界面又可以访问到测试页了,神奇!
示例:在ftp服务器上安装vsftpd并启动服务;
关闭iptables,并用win7访问ftp服务器,可以正常访问;
开启iptables,并将INPUT和OUTPUT链默认策略改为DROP,此时访问ftp服务器时,没有响应;
添加规则:
[root@server23 var]# iptables -A INPUT -d 192.168.137.23/32 -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@server23 var]# iptables -A OUTPUT -s 192.168.137.23/32 -p tcp -m tcp --sport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
再次访问ftp服务器,显示如下:
客户端在请求数据时被拒,连接建立失败,原因是在请求数据时使用ftp的被动模式,此时ftp服务器打开一个临时端口提供数据传输(1023到65536之间),而这些端口不确定,又不能打开所有1023到65536的端口,所以就得使用额外的匹配机制。
[root@server23 var]# iptables -A OUTPUT -s 192.168.137.23 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@server23 var]# iptables -A INPUT -d 192.168.137.23 -m state --state RELATED,ESTABLISHED -j ACCEPT
如果不能正常访问的原因可能是没有装载ip_conntrack_ftp和ip_nat_ftp模块,在配置文件/etc/sysconfig/iptables-config中 IPTABLES_MODULES=""写入即可,多个模块用空格隔开
此刻ftp 防火墙就搞定了
示例:利用iptables的recent模块来抵御DOS攻击
利用recent和state模块限制单IP在300s内只能通过SSH与本机建立3个新连接,被限制3分钟后即可恢复访问
[root@server23 ~]# iptables -I INPUT 2 -d 192.168.137.23 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
###用来记录tcp 22端口的新连接,记录名称为SSH
--set 记录数据包来源IP,如果IP已经存在将更新已存在的条目
[root@server23 ~]# iptables -I INPUT 3 -d 192.168.137.23 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
####当SSH记录中的IP 180s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表
--seconds 必须与--rcheck或--update同时使用
--hitcount 必须与--rcheck 或--update同时使用
[root@server23 ~]# iptables -I INPUT 4 -d 192.168.137.23 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 3 --name SSH -j DROP
如上所有示例默认策略均为DROP。