iptables原理:
firewall:防火墙,是一种隔离工具,工作于主机或网络的边缘,对于进出本机或本网络的报文根据事先定义好的检查规则做匹配检测,对于能够被规则所匹配到的报文做出相应处理的组件,因此根据其作用的范围分为两类:
主机防火墙:对进出本主机的数据包进行规制匹配,并作出相应的处理动作。
网络防火墙:对流经本网络的数据包进行规制匹配,并作出相应的处理动作,工作在网络出口处,一般作为网关防火墙。
注意:防火墙规则匹配顺序机制:自上而下,对于中间匹配到的规则则按规则规定的处理动作进行处理,如果最后没有一条规则能匹配就按照默认规则处理。
linux防火墙框架:
钩子函数:hooks function 用来对流经系统的不同位置的数据包进行规则检查的函数。framework:内核中的网络过滤器框架叫做netfilter,而netfilter是工作在内核中真正实现防火墙功能的模块,而iptables只是用来管理netfilter的一个工具。
注意:任何iptables规则在主机重新启动时都会失效,因为它是工作在内核中的,而内核是工作在内存中的,所以重启主机iptables规则都会失效,所以为了让每一次主机启动都实现防火功能,必须重新执行一下iptables规则,因此才有iptables配置文件或者iptables脚本的说法。
netfilter按功能分类可分为4类:(netfilter属于OSI7层的网络层)即所谓的4表
filter :过滤,防火墙,主要对进出的数据包做过滤作用。
nat :networ address translation ,网络地址转换,将进出主机的数据的ip数据包根据规则修改其源地址、源端口、目的地址、目的端口的作用。
mangle :拆解报文,做出修改,封装报文
raw:关闭nat表上启用的链接追踪机制。
注意:在非常繁忙的服务器上一般情况是肯定不能启动连接追踪功能的
按照netfilter在内核中工作的位置不同分为5个链(即5个钩子函数)
prerouting链
input链
forward链
output链
postrouting链
如图:数据包在主机内的流向示意图:
报文的方向:
流入本机的数据包: prerouting--》 input
本机流出的数据包: output--》postrouting
本机负责转发的数据包: prerouting--》forward--》postrouting
因此为了实现每一种功能,数据包在经过主机是都会在不只一个链上做规则匹配:
实现filter功能,检测的链有 :INPUT ,OUTPUT ,FORWARD
实现nat功能,检测的链有 :PREROUTING(DNAT),OUTPUT,POSTROUTING
实现mangle功能:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
实现raw功能,检测的链有: PREROUTING,OUTPUT
注意:(1)iptables既能做主机防火墙也能做网络防火墙,做网络防火墙主要靠的就是forward链的规则,要做网络转发,需要开启网络转发功能。设置/proc/sys/net/ipv4/ip_forward =1。
(2)而对于流经主机的每个数据包都会经过主机中的几条链做规则检测,因此每条链上的每个规则都会有一个计数器,用来记录流量的单位有连个。pkts(统计每秒多少个包)和byts(统计每秒经过的字节数)
所谓的主机路由的概念是指在主机内部实现路由转发功能,而在主机内部路由发生的时刻有两种情况:
1、报文由网卡接收判断是否进入本机后:用来判断目标主机
2、报文发出之前:用来判断经由哪个接口送往下一跳
iptables:四表五链添加规则时的考量点:
1、要实现哪种功能,判断添加在哪张表上;
2、报文流经的过程,判断添加在哪个链上
链:链上规则的次序,即为检查的次序
1、同类规则(访问同一应用),匹配范围小的放上面
2、不同类规则(访问不同应用),匹配到报文频率较大的放上面
3、将那些可由一条规则标书的多个规则合并为一个
4、设置默认策略
白名单(先允许特定访问,其他全部拒绝)
黑名单(先拒绝特定访问,其他全部允许)
iptbales规则的主要包括:
1、匹配条件:根据报文特征指定
a、 基本匹配条件
b、扩展匹配条件
2、处理动作:target
a、 内建处理机制
b、自定义处理机制(可以在默认链中指定target为自定义链;自定义链中可以定义return来返回引用的链)
iptables的功能的优先级次序:raw -- mangle -- nat -- filter,指定是iptables在对数据包进行检测时就是按此顺序检测的
见插图
iptables规则的用法:
iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]][options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
表管理:
-t table: (filter,nat,mangle,raw 省略-t表示的filter表。)
链管理:
-F :flush 清空规则链,省略链,表示清空指定表上的所有规则
-N :new ,创建新的自定义规则链
-X :drop, 删除用户自定义的空的规则链
-Z :zero,清零,置零规则计数器
-P :policy,为指定链设置默认处理策略,对filter表中的链而言,默认的策略有ACCEPT,DROP,REJECT
-E :rname,重命名自定义链,引用计数不为0的自定义链,无法改名,也无法删除
-R:replace。替换指定链上的指定规则
规则管理:
-A: append 将新规则追加与制定链的尾部
-I: insert 将新规则插入至制定链的指定位置
-D: delete 删除指定脸上的指定规则
有两种指定方法:
1、指定匹配条件
2、指定规则编号
查看iptables:
-L:list,列出指定链上的所有规则
-n :numberic,以数字方式显示地址和端口号
-v :显示详细信息
-vv:显示更详细信息
-vvv:显示更加详细信息
--line-numbers:显示规则编号
-x :exactly,显示计数器计数的精确值(默认情况下当匹配的计数器的值很大是会自动将其模糊显示)
匹配条件:
基本匹配:
[!]-s,--src,--source IP|Netaddr 检查报文中的源ip地址或网络地址是否属于符合此处匹配的范围
[!]-d,-des,--destination IP|Netaddr 检查报文中目标IP地址是否符合此处指定的地址范围;
[!]-p,--protocol {tcp|udp|icmp} :检查报文中的协议类型,即ip报文中的protocols字段所表示的协议
-i,--in-interface IFACE 数据报文的流入接口,仅能用于prerouting、input、forward链
-o,--out-interface IFACE 数据报文的流出接口,仅能用于forward,output、postrouting
扩展匹配:指的是必须指定某种协议类型,并指定属于该协议的特性来进行匹配。
用法:-m macth_name --spec_options
例如:-m tcp --dport 22
隐式扩展:对-p protocol 指明的协议进行扩展,可省略-m选项,-p tcp|udp|icmp
-p tcp|
--dport port[-port] 目标端口,可以是单个端口或连续多个端口,形式如: port或者port:port表示连续的端口,如果端口不连续使用逗号隔开
--sport PORT[-PORT]
--tcp-flags LIST1 LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没有LIST1中指明的,不作检查;
tcp报文的标识位有 :SYN, ACK, FIN, RST, PSH, URG
--tcp-flags SYN,ACK,FIN,RST,PSH,URG
--syn: 指的tcp的第一次握手
-p udp
--dport
--sport
-p icmp
--icmp-type
可用数字表示其类型:
0:echo-reply
8: echo-request
显式扩展: 必须使用-m选项指定使用的扩展(显示扩展类型在下面介绍)
目标:
-j TARGET:jump至指定的TARGET
ACCEPT: 接受
DROP: 丢弃
REJECT: 拒绝
RETURN: 返回调用链
REDIRECT:端口重定向
LOG: 记录日志
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装
...
自定义链:由自定义链上的规则进行匹配检查
显示扩展的类型介绍:
1、mutleport扩展:多端口扩展
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;
[!] --src-range from[-to]:指明连续的源IP地址范围;
[!] --dst-range from[-to]:指明连续的目标IP地址范围;
例:
~~]# iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT
2、iprange扩展:ip地址范围扩展
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;
[!] --src-range from[-to]:指明连续的源IP地址范围;
[!] --dst-range from[-to]:指明连续的目标IP地址范围;
例:
~~]# iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT
3、string扩展:字符串扩展
检查报文中出现的字符串:
--algo {bm|kmp} 这是两种匹配算法,使用string扩展必须指定算法项
bm = Boyer-Moore
kmp = Knuth-Pratt-Morris
[!] --string pattern 用来指定匹配的模式字符串
例:
~]# iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT
4、time扩展:时间扩展
根据报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]或者22,23,24
[!] --weekdays day[,day...]或者1-7
例:
-m time --datestart 2007-12-24 --datestop 2007-12-27
-m time --weekdays Fr --monthdays 22,23,24,25,26,27,28
5、connlimit扩展:单ip链接限制扩展
根据每客户端ip(也可以是地址块)做并发链接数量匹配
--connlimit-upto n 连接的数量小于等于n
--connlimit-above n 连接的数量大于n
6、limit扩展:每链接数据包传输速率限制扩展
基于收发报文的速率做限制,也叫令牌桶过滤器
--limit rate[/second|/minute|/hour|/day]
--limit-burst number 峰值,指明允许传输的速率的最高值
7、state扩展:根据协议状态的扩展
根据链接追踪机制检查链接的状态
用法:[!] --state STATE1,STATE2,...
在不启用链接追踪的情况可调整链接追踪所能够容纳的最大链接数量
[root@localhost ~]# cat /proc/sys/net/nf_conntrack_max
已经追踪到的并记录下的链接
[root@localhost ~]# cat /proc/net/nf_conntrack
可追踪的链接状态有:
INVALID, 无法识别的链接
ESTABLISHED, NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;
NEW, 新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求
RELATED 相关的链接,如ftp协议的命令链接和数据链接之间的关系
UNTRACKED.
注意,要实现内核能够追踪状态链接,需要内核装载特定的模块。
不同协议或链接类型的追踪时长设置在/proc/sys/net/netfilter/目录下设置
如何保存及重载规则:
保存:
iptables-save > /path/to/file
或者iptables -s 默认保存位置为/etc/sysconfit/iptables文件
重载:
iptables-restore < /path/from/file
或者 iptables -r 默认从/etc/sysconfig/iptables文件中加载
对centos6还可以使用
service iptables save 此命令会自动保存所有规则至/etc/sysconfig/iptables文件中
service iptables restart 会自动重载/etc/sysconfig/iptables文件中的规则
iptables配置文件/etc/sysconfig/iptables-config
iptables的服务脚本/etc/rc.d/init.d/iptables
对centos 7
引入了新的iptables前段工具firewalld
firewalld-cmd
firewalld-config
注意在centos7上要使用和centos6使用相同的iptables-save风格的命令,必须先停用firewalled服务。关于firewalld:
http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html
小技巧:
1、为了防止在测试iptables策略是由于策略问题将自己拒绝而不能连接主机,可以在测试前先定义一个周期性计划,
2、隔几分钟将iptables规则清空一次,然后在开始测试,
tcp的会话超时时常一般是2小时
网络firewall的配置
iptables -A forward -d 192.168.20.2 -dport 21 -p tcp -m stat --stat new,establish,related -j accept
iptables -A forward -s 192.168.20.2 -sport 21 -p tcp -m stat --stat establish -j accept
iptables -A forward -d 192.168.20.2 -p tcp -m --stat related -j accept
打开核心转发功能:
centos6 :设置/proc/sys/net/ipv4/ip_forward=1
centos7 : 配置/etc/sysctl.conf中net.ipv4.ip_forward =1
练习:
主机防火墙:
放行telnet, ftp, web服务;
放行samba服务;
放行dns服务(查询和区域传送);
网络防火墙:
放行telnet, ftp, web服务;
放行samba服务;53号端口
放行dns服务(查询和区域传送);23号端口
问题:如何开放被动模式的ftp(被动模式ftp,命令链接端口21,数据链接端口随机)
此时只能使用特定的模块来进行匹配。
加载/lib/modules/3.10.0-229.el7.x86_64/kernel/net/netfilter/下的nf_conntrack_ftp.ko 模块
[root@localhost netfilter]# modprobe nf_conntrack_ftp
(1) 装载ftp追踪时的专用的模块:
# modprobe nf_conntrack_ftp
(2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
# iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
(3) 放行响应报文:
ESTABLISEHD
# iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
练习答案:
dns
主机防火墙放行DNS要使用8个规则(input和outup链规则)
iptables -t filter -A input -d Iip -p udp --dport 53 -j ACCEPT
iptables -t filter -A output -s Iip -p udp --sport 53 -j ACCEPT
//放行管辖域内向自己请求并相应的报文通过
iptables -t filter -A output -s Iip -p udp --dport 53 -j ACCEPT
iptables -t filter -A input -d Iip -p udp --sport 53 -j ACCEPT
//放行自己为管辖域内做迭代查询时的请求和相应报文通过
iptables -t filter -A output -s Iip -p tcp --sport 53 -j ACCEPT
iptables -t filter -A input -d Iip -p tcp --sport 53 -j ACCEPT
//放行自己作为主DNS向从DNS做区域传送时的进出报文通过
iptables -t filter -A output -s Iip -p tcp --dport 53 -j ACCEPT
iptables -t filter -A input -d Iip -p tcp --dport 53 -j ACCEPT
//放行自己作为从DNS服务向其他DNS服务器请求区域传送时的进出报文通过
注意:在设置网络防火墙时要打开核心转发功能,并设置forword链规则!
iptables:私网访问互联网的方法:
两种:
1、nat :network address translotion 网络层+传输层
2、proxy : 代理,应用层
nat的工作机制:nat是通过修改数据包的ip报文来进行转发的,内核会在内核空间中维持一个nat表,用来记录每一条nat记录
nat的分类:
SNAT :只修改请求报文的源地址
DNAT :只修改请求报文的目标地址
PNAT :修改请求报文的端口
nat表:
DNAT:实现目标地址转换,只需要在preouting链上修改就可以
SNAT:实现源地址转换,只需要再postrouting链上修改就可以
例:
源地址转换:iptables -t nat -A postrouting -s localnet !-d localnet -j SNAT --to-source ExtIP
iptables -t nat -A postrouting -s localnet !-d localnet -j MASQUERADE
目标地址转换:iptables -t nat -A prerouting -d localnet !-p tcp|udp --dport PORT -j DNAT --to-destination internetip:port
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/np_conntrack_max,链接碰到各种状态的超时后就会从表中删除。
所以解決方法一般有两个:
(1) 加大 ip_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
(2): 降低 ip_conntrack timeout时间
vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
练习:INPUT和OUTPUT默认策略为DROP;
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
[root@localhost tmp]# iptables -A INPUT -p tcp --dport 80 -m time --weekdays 1
[root@localhost tmp]# iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/s
[root@localhost tmp]# iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
[root@localhost tmp]# iptables -A INPUT -d 172.16.234.33 -p tcp --dport 21 -m state --state new,established -m time --weekdays 1,2,3,4,5 --timestart 08:30 --timestop 18:00 -m limit --limit 5/m -j ACCEPT
[root@localhost tmp]# iptables -A INPUT -d 172.16.234.33 -p tcp -m state --state related,established -m time --weekdays 1,2,3,4,5 --timestart 08:30 --timestop 18:00 -m limit --limit 5/m -j ACCEPT
[root@localhost tmp]# iptables -A OUTPUT -s 172.16.234.33 -p tcp -m state --state established -m time --weekdays 1,2,3,4,5 --timestart 08:00 --timestop 18:00 -m limit --limit 5/m -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
[root@localhost tmp]# iptables -A INPUT -d 172.16.234.33 -p tcp --dport 22 -m iprange --src-range 172.16.1.0-172.16.255.0 -m limit --limit 2/m -j ACCEP
[root@localhost tmp]# iptables -A OUTPUT -s 172.16.234.33 -p tcp --sport 22 -m iprange --dst-range 172.16.1.0-172.16.255.0 -m limit --limit 2/m -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
[root@localhost tmp]# iptables -A INPUT -d 172.16.234.33 -p tcp --tcpflags SYN,ACK,FIN,PSH,URG SYN,ACK -j REJECT
5、允许本机ping别的主机;但不开放别的主机ping本机;
[root@localhost tmp]# iptables -A OUTPUT -s 172.16.234.33 -p icmp --icmp-type 8 -j ACCEPT
[root@localhost tmp]# iptables -A INPUT -d 172.16.234.33 -p icmp --icmp-type 0 -j ACCEPT
[root@localhost tmp]# iptables -A INPUT -p icmp --icmp-type 8 -j REJECT
补充:利用iptables的recent模块来抵御DOS***: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP
ssh: 远程连接,
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。
下面对最后两句做一个说明:
1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
3.iptables的记录:/proc/net/xt_recent/SSH
也可以使用下面的这句记录日志:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
iptables实现七层访问过滤:
模块:layer7
识别应用层协议
iptables/netfilter
iptables -m state,
netfilter state
对内核中的netfilter,打补丁layer7,重新编译内核
对iptables打补丁,补上layer7模块,重新iptables
转载于:https://blog.51cto.com/qikexing/1707014