Linux之netfilter与iptables学习
一、为什么我们的主机需要防火墙
二、Linux下防火墙如何实现
三、四表五链学习
四、主机防火墙
五、网络防火墙
六、iptables命令学习
七、主机防火墙规则备份与恢复
======================================
一、为什么我们的主机需要防火墙?
1、防止不合理的用户,通过不合理的手段登录系统搞破坏,
2、企图通过攻击手段组织其继续为用户提供服务,
3、尤其当我们的主机需要提供互联网服务的时候,安全性就不言而喻,
二、Linux下防火墙如何实现?
1、iptables,这个只是方便用户编写各类规则交由netfilter处理执行。
2、一部分是基于TCP/IP协议栈的netfilter安全框架,通过“数据报文进入主机,内核处理完成,
交由用户空间处理,在由内核处理完成并响应给客户”,
数据报文的处理路径设置了各种规则链,根据规则链的顺序或者特点,
又在规则链中增加功能表,通过在不同的功能表中设置具体的规则,来达到安全访问。
那么netfilter的规则定义是如何来达到安全访问的效果呢?
首先我们应该知道主机之间的通信是数据流,是参考OSI七层模型来包装用户的数据,OSI七层包括了
应用层,表示层,会话层,传输层,网络层,数据链路层,物理层,每一层都有其自己的功能,
netfilter就是通过识别每一层功能中的数据是否符合我们定义的规则,从而达到监控,修改,丢弃,转发的目录。
我们学习的防火墙主要部分是监控网络层,传输层,少部分应用层数据。如上图类似主机间通信的数据。
三、四表五链:
四表:
1、raw: 关闭NAT,ip_conntrack(连接跟踪)
2、mangle: 拆开数据,修改数据,封装数据
3、nat: 源,目的IP地址转换
4、filter: 过滤
执行的优先级顺序是:1 > 2 > 3 >4
五链(数据报文处理路径上的五个钩子):
1、PREROUTING: 路由前链
2、INPUT: 进入用户空间链
3、FORWARD: 转发链
4、OUTPUT: 用户空间出去链
5、POSTROUTING: 路由后链
四、主机防火墙:
对于主机防火墙而言(主机就是报文的响应方,处理完成之后,主机在发送响应给请求方),四表五链工作模型(默认情况下并不是所有的链上都必须要有所有的功能规则表,这是设计者精巧设计):
说明(数据包经过防火墙被处理):
1、数据包经过网络传输,到达主机网卡缓冲区,接着被内核加载到内核内存空间,
2、数据报文经过PREROUTING链,
1、规则表匹配顺序raw–>mangle–>nat,
2、每个规则表中有N多规则,
3、被PREROUTING链处理过后的数据将会转发给INPUUT链
1、规则表匹配顺序mangle–>filter,
2、通常需要阻止别人访问,或者开放服务给用户都是在此filter规则表中设定
4、用户空间:程序运行时生成的进程监听在某个套接字(端口)上,内核拆分数据报文到传输层时(TCP/UDP),检查数据报文的目的端口,进而转交给其监控的进程处理。
用户空间处理完数据包之后,会将需要返回给用户的数据重新打包,交给内核,由内核将数据封装(封装传输层,网络层,数据链层报文头部),
这里的封装就会参考OUTPUT链与POSTROUTING链,
5、数据报文到达OUTPUT链
1、规则表匹配顺序:raw–>mangle–>nat–>filter
6、数据报文被OUTPUT链处理完毕之后接着交给POSTROUTING
1、规则表匹配顺序:mangle–>nat
五、网络防火墙:
网络防火墙的意思是提供数据包转发,数据报文的最终目的地址并不是本机防火墙,需要开启forward功能
网络防火墙管控修改数据包源,目的IP地址与过滤数据报文。
六、IPTABLES命令学习(编写规则表):iptables并不是服务,没有进程,是工作在内核
命令学习:
链管理: | 规则管理: | 查看: | |||
-F | Flush 清空规则链 | -A | Append 将规则追击到指定链的最后 | -L | List 列出指定链的规则 |
-N | New 创建新的自定义规则链 | -I | Insert 插入一条规则,不给序号就是第一条 | -n | Number数字显示IP与端口号 |
-X | 删除用户自定义链 | -D | Delete 删除规则 | -v,-vv,-vvv | 显示详细信息 |
-Z | Zero 清零,规则计数器重置为零 | -R | Replace 替换规则 | –line-numbers | 显示规则编号 |
-P | Policy 为指定的规则链设置默认策略 | -x | 显示计数结果精确值 | ||
-E | rEname 重命名自定义链 | ||||
-j | 指定被规则匹配后所要执行的动作,ACCEPT(允许),DROP(丢弃),REJECT(拒绝),RETURN(返回),REDIRECT(重定向),LOG(记录日志),MARK(标记),DNAT(目的地址转换),SNAT(源地址转换),MASQUERADE(地址伪装) |
例子:
~]# iptables -t nat -L #查看nat表中规则链与规则
匹配条件:
基本匹配:
[!] -s -src –source [ip|network] 数据报文源地址匹配,[!]表示取反
[!] -d -dst –destination [ip|network] 数据报文目的地址匹配,[!]表示取反
-p –protocol [tcp|udp|icmp] 传输层协议
-i –in-interface 指定数据报文入接口 ##仔细想想只能用在PREROUTING,FORWARD,INPUT链上
-o –out-interface 指定数据报文This test Page abcdefgh出接口 ##仔细想想只能用在OUTPUT,FORWARD,POSTROUTING链上
隐含扩展匹配:
-p tcp {–sport,–dport,–tcp-flage,–sync}
例:–tcp-flage SYN,ACK,FIN,RST SYN 表示匹配TCP数据报文中TCP首部SYN,ACK,FIN,RST四个关键字位置,并且只有SYN为1,能可以,其它三个位置必须为0(TCP三次握手的第一次)
-p udp {–sport,–dport}
-p icmp –icmp-type icmp类型有很多,常用就是类型为0的表示ping应答(Echo reply) 类型8为ping请求(Echo request)
显示扩展:使用-m macth_name –spec_options,必须指明使用的扩展模块(重点)
一、multiport:指定多端口
使用方法:
[!] –source-ports,–sports port[,port|,port:port]…
~]# iptables -A INPUT -d 192.168.3.21 -p tcp -m multiport –dports 53:80,111 -j ACCEPT
#没有指定源IP地址,表示任意源IP地址访问本机192.168.3.31这个IP的TCP协议,目的端口是53~80的所有端口,加上111这个端口
[!] –destination-ports,–dports port[,port|,port:port]…
[!] –ports port[,port|,port:port]…
~]# iptables -A INPUT -d 192.168.3.21 -p tcp -m multiport –dports 22,80,443 -j ACCEPT #此规则类似,
二、iprange:指定IP地址范围
使用方法:
[!] –src-range from[-to]
~]# iptables -A INPUT -d 192.168.3.21 -p tcp –dport 443 -m iprange –src-range 192.168.3.1-192.168.3.50 -j ACCEPT
[!] –dst-range from[-to]
三、string:指定的字符
使用方法:
–algo {bm|kmp} bm与kmp是匹配字符串的算法
~]# iptables -A OUTPUT -s 192.168.3.21 -p tcp –sport 80 -m string –algo bm –string "abcdefg" -j DROP
#当192.168.3.21这台web服务器网页上出现abcdefg字符,网站就不能被访问了
四、time:访问时间控制
使用方法
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
~]#iptables -A OUTPUT -s 192.168.3.10 -p tcp –sport 80 -m time –timestart 07:00 –timestop 23:00 -j ACCEPT
#每天的早上7点到晚上23点才能访问
[!] –monthdays day[,day…]
[!] –weekdays day[,day…] Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7,
~]#iptables -A OUTPUT -s 192.168.3.10 -p tcp –sport 80 -m time ! –weekdays 6,7 -j ACCEPT
#星期6,星期7取反,也就是只能星期一到星期五访问
五、conntlimit:连接限制
使用方法:
[!] –connlimit-above n
~]# iptables -I INPUT -d 192.168.3.10 -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP
#表示对连接22端口限制最大连接数为3,在规则生效时,在线的ssh服务,不算,之后退出重新连接就算
–connlimit-mask
~]# iptables -p tcp –syn –dport 80 -m connlimit –connlimit-above 16 –connlimit-mask 24 -j REJECT
#这个有点意思,限制C类网络地址(掩码是24的),http并发连接不超过16个,
#假如说我们的客户端地址是192.168.3.0/24,我们这个网段内的所有地址一起发起http请求并发,不能超过16个,
六、limit:报文速率限制
使用方法:
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
~]# iptables -I INPUT -d 192.168.3.10 -p tcp –dport 443 -m limit –limit 100/minute -j DROP
#每分钟限制100个报文,多的会DROP掉
七、state:连接状态追踪,nf_conntrack
有了状态连接之后,我们可以在OUTPUT方向只放行已经建立连接的数据(在没有启用state功能是,对于规则的编写要考虑到进出两个方向),
状态类别有:
NEW:新建连接
ESTABLISHED:正在建立连接
RELATED:相关连接(FTP被动模式的控制连接与数据连接)
INVALID:无效的连接
[!] –state state:
~]# iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT
#已经建立的连接OUTPUT方向直接放行流量
~]# iptables -I INPUT -d 192.168.3.10 -p tcp -m multiport –dports 22,80,53 -m state –state NEW,ESTABLISHED -j ACCEPT
#对于访问192.168.3.10的22,80,53服务,新建或者已经建立连接的流量直接放行
八、还有很多显示扩展的高级功能,我们需要多多man iptables
七、主机防火墙规则备份与恢复:
规则保存:~]# iptables-save > iptables-rules
规则恢复:~]# iptables -restore < iptables-rules
FTP特殊放行:需要加载单独对FTP放行的模块
/lib/modules/2.6.32-573.el6.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko 模块位置
~]# modprobe nf_conntrack_ftp #加载模块
~]# iptables -A INPUT -d 192.168.3.10 -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A INPUT -d 192.168.3.10 -p tcp -m state –state RELATED -j ACCEPT
~]# iptables -I INPUT -s 192.168.3.10 -p tcp -m state –state ESTABLISHED -j ACCEPT
原创文章,作者:nice_neo_linux,如若转载,请注明出处:http://www.178linux.com/18952