Linux -- 防火墙
防火墙
防火墙类型
- 入侵检测(IDS)不阴断网络访问进行网络的检测,协助IPS进行工作
- 入侵防御(IPS)以透明模式分析数据内容,进行有效的防御数据攻击
- 防火墙 (隔离功能)
防火墙的分类
- 主机防火墙
- 服务于当前主机的
- 网络防火墙
- 服务于一定范围的网络
- 硬件防火墙
- 大部门公司都采用了硬件防火墙,服务于一定范围的网络
- 优点:处理速度快,专用的防火墙设备
- 缺点:价格贵
- 软件防火墙
- 运行于通用硬件平台之上的防火墙软件
- 网络层防火墙
- 适用于OSI 下三层或四层的网络层防火墙
- 包过滤防火墙,制定ACL 进行数据的源地址及目的地址过滤
- 优点:过滤目的明确,处理速度快,便于维护。
- 缺点:数据内容无法进行过滤。
-
应用层防火墙
- 应用于OSI七层的防火墙
Linux-防火墙
Linux的防火墙已经集成到Linux的内核中,使用的是Netfilter 组件。内核中选取了五个位置进行出入站的规则定义点,这五个点俗称勾子(hook)或链 ,三种报文的流向以及对报文流向处理的四张表
-
五个勾子
- INPUT
- OUTPUT
- FORWARD
- PREROUTING
- POSTROUTING
-
三种报文流向
- 入站:PREROUTING –> INPUT –> 进程处理
- 出站:进程处理 –> OUTPUT –> POSTROUTING
- 转发:PREROUTING –> FORWARD –> POSTROUTING
- 四表 :作用在上图三种报文流向的规则库
- filter
- 作用在:INPUT , FORWARD , OUTPUT
- nat
- 作用在:PREROUTING , POSTROUTING , OUTPUT , INPUT
- mangle
- 作用在:PREROUTING , POSTROUTING , INPUT , OUTPUT , FORWARD
- raw
- 作用在:PREROUTING , OUTPUT
- filter
- 规则rule的定义,对匹配到的报文进行处理,处理的方式有定义
- 内建的处理动作:ACCEPT , DROP , REJECT , SNAT , DNAT , MASQUERADE , MARK , LOG …
- 自定义处理动作: 自定义chain(链)
- 规则要添加在链上才生效,添加在自定义上不会自动生效
-
链chain
- 内置链:每个内置链对应一个勾子
- 自定义链:用于对内置链进行扩展补充,只有HOOK勾子调用自定义链才生效。
-
对应的Linux 系统防火墙及命令
CentOS 7 firewalld.service , iptables
CentOS 6 iptables
- 对应的命令
- -t table —-表示表名,默认是filter表
- -N : new 自定义一条新的规则链
- -X :delete ,删除自定义的空规则链 (如自定义链被跳用,先清除跳用再清)
- -P :设置默认策略,ACCEPT , DROP ,REJECT,
- -E :重命名自定义链
- -L :list ,列出指定链上的所有规则
- -n :numberic 以数字格式显示地址和端口号
- -v :verbose , 详细信息
- -vv : 更详细信息
- -x :显示计数器结果的精确值,而非单位转换后的易读值
- –line -numbers :显示规则的序号
- -S :命令格式显示链上规则
- -A :append , 追加
- -I :插入,要指明插入至的规则编号,默认为第一条
- -D:delete 删除 1,指明规则序号 2,指明规则本身
- -R :替换指定链上的规则
- -F :清空指定的规则链 默认清空INPUT
- -Z :置零
-
匹配条件
- (1). 基本匹配条件,无需加载模块
- [!] -s , –source address[/mask][,…]; 源IP地址或规定一定范围
- [!] -d , –destination address[/mask][,…]:目标IP地址或规定一定范围
- [!] -p , –protocol protocol : 指定协议,0表示所有(all)
- [!] -i ,–in-interface name :报文入站口
- [!] -o,–out-interface name:报文出站口
- (2). 扩展匹配条件,需要加载模块
- [!] -p tcp
- [!]–source-port , –port port[:port]:匹配报文源端口,可指定端口范围
- [!]–destination-port , –dport port[:port]:匹配报文目标端口,可指定范围
- [!]–tcp-flags mask comp 匹配三次挥手的报文形式
- 例: iptables -A INPUT -p tcp –tcp-flags SYN,ACK,FIN,RST SYN -j REJECT
- [!] –syn : 用于匹配第一次握手
- [!] -p udp
- [!]–source-port , –port port[:port]:匹配报文源端口,可指定端口范围
- [!]–destination-port , –dport port[:port]:匹配报文目标端口,可指定范围
-
[!] -p icmp
- [!] –icmp-type {type[/code]|typename}
- type/code
- 0/0 echo-reply –> icmp 应答
- 8/0 echo-request –>icmp请求
- type/code
- [!] –icmp-type {type[/code]|typename}
-
显示扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块
- [ -m matchname [ per-match-options ]]
- (1). 基本匹配条件,无需加载模块
-
处理动作:
- -j targetname [per-target-options]
- 简单,ACCEPT,DROP
- 扩展:REJECT , REDIRECT , RETURN , LOG , MARK , DNAT , SNAT , MASQUERADE
- -j targetname [per-target-options]
示例–做用在filter表上
1.multiport扩展的使用–以离散方式定义多个端口,最多15个
用法:
- [!] –source-ports,–sports port[,port|,port:port]…
- [!] –destination-ports,–dports port[,port|,port:port]..
- [!] –ports port[,port|,port:port]…多个源或目标端口
[root@localhost ~]#iptables -A INPUT -s 192.168.3.0/24 -d 172.18.0.0/16 -p tcp -m multiport --dports 20:25,80 -j ACCEPT
2.iprange扩展的使用 – 指明连续的IP地址范围
用法:
- [!] –src-range from[-to] 源IP地址范围
-
[!] –dst-range from[-to] 目标IP地址范围
“`
[aaa@qq.com ~]#iptables -A INPUT -d 192.168.3.0/24 -p tcp –dport 80 -m iprange –src-range 192.168.3.2-192.168.3.11 -j DROP
3.mac扩展 – 指明源MAC地址
用法:
- [!] –mac-source MAC
iptables -A INPUT -s 192.168.3.10 -m mac --mac-source 00:0c:29:fd:e7:45 -j REJECT
4.string扩展– 对报文中的应用层数据做字符串匹配检测
用法:
- –algo {bm|kmp} :字符串匹配检测算法
- bm: Boyer-Moore
- kmp:knuth-pratt-morris
- –for offset 开始偏移
- –to offset 结束偏移
[!] –string pattern:要检测的字符串模式
[!] –hex-string pattern:要检测字符串模式, 16进制格式
[root@localhost html]#iptables -A OUTPUT -s 192.168.3.3 -p tcp --sport 80 -m string --algo bm --string "test" -j REJECT 作用在出口勾子上,因为是3.3的回应包,没明确指定目标地址就是所有地址
5.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…] 每个月的几号
- [!] –weekdays day[,day…] 星期几
- –kerneltz:内核时区,不建议使用, CentOS7系统默认为UTC(注意: centos6 不支持kerneltz , –localtz指定本地时区(默认))
“`
[aaa@qq.com ~]#iptables -A INPUT -s 192.168.3.2 -d 192.168.3.3 -p tcp –dport 80 -m time –timestart 00:30 –timestop 23:30 –weekdays Thu -j DROP
6.connlimit扩展–根据每个IP做并发连接数量匹配
用法:
- –connlimit-upto n:连接的数量小于等于n时匹配
-
–connlimit-above n:连接的数量大于n时匹配
[aaa@qq.com ~]#iptables -A INPUT -s 192.168.3.2 -p tcp --dport 22 -m connlimit --connlimit-above 1 -j REJECT
7.limit扩展–基于收发报文的速率做匹配
用法: –limit rate[/second|/minute|/hour|/day]
- –limit-burst number
[root@localhost ~]#iptables -A INPUT -s 192.168.3.2 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
[root@localhost ~]#iptables -I INPUT 2 -p icmp -j REJECT
8.state扩展–根据“连接追踪机制”去检查连接的状态
conntrack的几种状态:
- NEW :新发出的请求,连接追踪信息库中不存在此连接的
相关信息条目,因此,将其识别为第一次发出的请求 - ESTABLISHED:NEW状态之后,连接追踪信息库中为
其建立的条目失效之前期间内所进行的通信状态 - RELATED: 新发起的但与已有连接相关联的连接,如:
ftp协议中的数据连接与命令连接之间的关系 - INVALID : 无效的连接,如flag标记不正确
- UNTRACKED : 未进行追踪的连接,如raw表中关闭追踪
用法:
- [!] –state state
[aaa@qq.com ~]#iptables -A INPUT -s 192.168.3.2 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j REJECT
示例–做用在NAT表上
使用在NAT表上的链有:PREROUTING , INPUT , OUTPUT , POSTROUTING
SNAT: 内网地址进行转换,和外网进行通迅的转换过程,我们称之为SNAT;SNAT是修改源地址
DNAT:本局外网地址映射至本局内网地址,我们称之为DNAT;DNAT是修改目标地址
PNAT: 内网地址转换为外网地址加端口号
SNAT示例:SNAT:固定IP
–to-source [ipaddr[-ipaddr]][:port[-port]]
–random
测试:
条件:三台linux虚拟机
描述:A机器,内网地址:192.168.3.2 充当内网客户机
B机器,内网地址:192.168.3.3 外网地址:172.18.6.50 用防火墙使用
C机器,外网地址:172.18.6.51 充当外网的website
操作:
A:设置默认路由,下一跳地址是192.168.3.3
B:设置防火墙SNAT的转换,转换地址为172.18.6.50
C:配置下HTTPD的服务 无需设置路由
A的配置
[aaa@qq.com ~]#route add default gw 192.168.3.3
[aaa@qq.com ~]#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.3.3 0.0.0.0 UG 0 0 0 eth0
B的配置
[aaa@qq.com ~]#iptables -t nat -A POSTROUTING -s 192.168.3.0/24 ! -d 192.168.3.0/24 -j SNAT --to-source 172.18.6.50
操作结果:
A访问C的website
[aaa@qq.com ~]#curl -I 172.18.6.51
HTTP/1.1 200 OK
Date: Sat, 21 Oct 2017 03:27:25 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Last-Modified: Sat, 21 Oct 2017 03:26:13 GMT
ETag: "1d-55c0626cb7f3b"
Accept-Ranges: bytes
Content-Length: 29
Content-Type: text/html; charset=UTF-8
ping包
[aaa@qq.com ~]#ping 172.18.6.51
PING 172.18.6.51 (172.18.6.51) 56(84) bytes of data.
64 bytes from 172.18.6.51: icmp_seq=1 ttl=63 time=0.672 ms
64 bytes from 172.18.6.51: icmp_seq=2 ttl=63 time=0.818 ms
64 bytes from 172.18.6.51: icmp_seq=3 ttl=63 time=0.426 ms
64 bytes from 172.18.6.51: icmp_seq=4 ttl=63 time=0.532 ms
SNAT示例:SNAT:MASQUERADE:动态IP,如拨号网络
–to-ports port[-port]
–random
测试:条件如上,只是B机器的外网地址IP随机修改
B的配置
[root@localhost ~]#iptables -t nat -A POSTROUTING -s 192.168.3.0/24 ! -d 192.168.3.0/24 -j MASQUERADE
DNAT示例:外网映射内网IP及端口
–to-destination [ipaddr[-ipaddr]][:port[-port]]
测试:条件如上,这次我们使用172.168.6.50:80的地址及端口映射至内网192.168.3.2:80的地址端口
B的配置:
[aaa@qq.com ~]#iptables -t nat -A PREROUTING -d 172.18.6.50 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.2:80
C使用curl 172.18.6.50得出的结果
[aaa@qq.com ~]# curl 172.18.6.50
this is A website
补充内容:CentOS 7 的防火墙新出了个管理服务firewalld 有图形界面操作工具:firewall-config 也有命令行工具:firewall-cmd 。firewalld与iptables 两者如需使用只能选择其一
上一篇: 13孔洞填充method1
下一篇: opencv学习笔记十三:边界填充
推荐阅读
-
Linux系统中的ipcs命令使用详解
-
RedHat6安装Oracle数据库遇到错误 C [ld-linux-x86-64.so.2+0x14d70]
-
Linux上Oracle误删除一个没有用的dbf表空间文件
-
Oracle Enterprise Linux 5安装Oracle 10g碰到的若干问题及解决方法
-
Unix/Linux系统下的nobody用户与nologin详细介绍
-
Linux/CentOS系统同步网络时间的2种方法详解
-
linux命令
-
Linux虚拟机上网与校园网锐捷冲突解决方案
-
深入解析Linux系统中的SELinux访问控制功能
-
Linux不能上网ping:unknown host出错该怎么办?