标签:防火墙
一、Linux系统防火墙
Linux系统防火墙由iptables/netfilter组成,iptables工作在用户空间,制定一些规则,发送到内核空间,结合netfilter中的函数及处理方法对数据包进行处理。
netfilter: 防火墙框架(framework),位于内核中的tcp/ip协议栈的报文处理框架;定义5个卡点位置,hook function:钩子函数INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
iptables:用户空间的命令行程序,按用途和功能对其分类成四个表,这四个表又由五个链组成
表(table)由多个链组合,四个表:filter,nat,mangle,raw
filter:一般过滤的功能
nat:network address translation网络地址转换,用于修改报文的源地址或目标地址,或者端口
mangle:拆解报文,做出修改,并重新封装起来
raw:关闭nat表上启用的连接追踪机制
五个基本内置链chain
PREROUTING:流入数据包进入路由表之前
INPUT:通过路由表判断后目的地是本机,然后进入本机的用户空间
FORWARD:通过路由表判断后,目的地不是本机,然后通过路由转发到其他地方
OUTPUT:由本机的用户空间进程产生数据,向外部转发
POSTROUTING:传出的数据包到达网卡出口前
注:同一链上的不同的表的规则的应用优先级次序(由高而低)
raw --> mangle --> nat--> filter
二、iptables制定规则
1.规则
规则由匹配条件和处理动作组成;根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作做出处理
匹配条件:会检查网络层首部属性值、传输层首部属性值、附加的条件等
2.添加规则时,要考量的问题(1)报文的流经路径,判断添加规则至哪个链上;
(2)确定要实现的功能,判断添加规则至哪个表上;
(3)要指定的匹配条件,以用于匹配目标报文
三、iptables命令规则的基本编写格式:
iptables[-t table] COMMAND CHAIN CRETERIA -j target
table:表名 target:处理动作matchname:匹配模块的名称
-t table:指定对哪个表操作
table总共有四个filter, raw,mangle, nat;省略不写,默认修改的是filter
COMMAND:
对于链操作的COMMAND
-P:policy,规则策略,定义默认规则
-N:new,新建一条自定义的规则链;自定义链被内建链上的规则调用才能生效;
-X:drop(delete),删除自定义的引用计数为0的空链;
-F:flush,清空指定的链;也可以删除规则
-E:rename重命名自定义的引用计数和为0的链;
对于规则操作的COMMAND
-A:append,追加,在指定链的尾部追加一条规则;
-I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;
-D:delelte,删除,删除指定的规则;
(1)rule specification
(2)rule number 可以直接指定数字(iptables–vnL –line-numbers)
-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换
重置规则计数器
-Z:zero,置0;
iptables的每条规则都有两个计数器:
(1)由本规则匹配到的所有的数据包的个数(packets);
(2)由本规则匹配到的所有的数据包的总字节数(bytes);
查看命令:
-L:list,列出表中的链上的规则;
-n:numeric,以数值格式显示;
-v:verbose,显示详细格式信息; -vv,-vvv
-x:exactly,计数器的精确结果;
--line-numbers:显示链中的规则编号;
常常使用iptables-vnL来查看
CHAIN:
分为内建链(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)和自定义链
CRETERIA(匹配条件):分基本匹配条件和扩展匹配条件
基本匹配条件:
[!]-s, --source address[/mask][,...]
检查报文中的源IP地址是否符合此处指定的地址或范围;
例如:地址:172.16.28.70 范围:172.16.0.0/16
[!]-d, --destination address[/mask][,...]
检查报文中的目标IP地址是否符合此处指定的地址或范围;
例如:地址:172.16.28.70 范围:172.16.0.0/16
[!]-p, --protocol protocol:
匹配的协议类型{tcp|udp|icmp}
[!]-i, --in-interface name:数据报文的流入接口;INPUT, FORWARD和PREROUTING
例如:-i eno16777736
[!]-o, --out-interface name:数据报文的流出接口; FORWARD, OUTPUT和POSTROUTING
例如:-o eno16777736
注:如果不指定地址或接口,默认匹配所有的地址和接口
扩展匹配条件:需要加载扩展模块;分为:显式扩展、隐式扩展
(1)隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;
[!]-p, --protocol PROTOCOL PROTOCOL:
协议:tcp, udp,icmp, icmpv6, esp, ah, sctp, mh or "all"
-p tcp:隐含了-m tcp;
tcp:TransmissionControl Protocol 传输控制协议
[!]--source-port,--sport port[:port]:匹配报文中传输层的源端口;
[!]--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;
[!]--tcp-flags mask comp:匹配报文中的标志位
flags标志位有:SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔;
comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0;
比如:
--tcp-flags SYN,ACK,FIN,RST SYN
表示TCP三次握手第一次,SYN标志位为1,其余标志位为0
[!]--syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隐含了-m udp:没有标志位
udp:User Datagram Protocol 用户数据报协议
[!]--source-port,--sport port[:port]:匹配报文中传输层的源端口;可以是端口范围;
[!]--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;可以是端口范围;
-p icmp:隐含了-m icmp:
icmp:Internet Control Messages Protocol互联网控制报文协议,经常用来检查链路通不通,ping命令就是发送的icmp报文
[!]--icmp-type {type[/code]|typename}
8:echo-request 回显请求
0:echo-reply 回显应答
(2)显式扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;
1.multiport扩展 –mmultiport
以离散或连续的方式定义多端口匹配条件;","离散":"连续
[!] --source-ports,--sportsport[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dportsport[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:指定多个端口;
port:port比如:21:23即表示21,22,23号连续短路
2.iprange扩展 –m iprange
以连续的ip地址范围指明连续的多地址匹配条件;
[!] --src-range from[-to]:源IP地址;
[!] --dst-range from[-to]:目标IP地址;
3.string扩展 –m string
对报文中的应用层数据做字符串匹配检测;
[!] --string pattern:要检测字符串模式;
[!] --hex-string pattern:要检测的字符串模式,16进制编码;
编码格式为16进制的字符串
--algo {bm|kmp}
bm=Boyer-Moore,kmp=Knuth-Pratt-Morris
两种算法,性能差不多,必须指定的选项
4.time扩展 –m time
根据报文到达的时间与指定的时间范围进行匹配度检测;
--datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
5.connlimit扩展(connectlimit连接扩展) –m connlimit
根据每客户端IP做并发连接数匹配;注:是每个客户端
--connlimit-upto n:连接数数量小于等于n,此时应该允许;
也可以理解成,默认是拒绝的,加一条放行的条件
--connlimit-above n:连接数数量大于n,此时应该拒绝;
也可以理解成,默认是允许的,加一条拒绝的条件
6.limit扩展 –m limit
基于收发报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number:峰值速率
7.state扩展(iptables是状态监测防火墙,就是靠state扩展实现的) -m state
[!] --state STATE
STATE有五种状态机制:INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED
INVALID:无法识别的状态;
ESTABLISHED:已建立的连接;这里与ss -tnl中显示的tcp的ESTABLISHED区分开
NEW:新连接;
RELATED:相关联的连接;如:ftp协议的命令连接与数据连接即为相关联的连接
UNTRACKED:未追踪的连接
-j target:处理动作
ACCEPT:接受;
DROP:丢弃;
REJECT:拒绝;
注:一般禁止某主机访问时,用DROP
四、练习
本机IP:172.16.28.70
做练习时,注意以下几点:
操作之前,CentOS 7 先禁用firewalld服务
# systemctl status firewalld.service
# systemctl stop firewalld.service
# systemctl disable firewalld.service
使用iptables -F清空链规则是,保证默认策略为ACCEPT
允许172.16网络中的主机访问本机的ssh服务
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.28.70 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d 172.16.0.0/16 -s 172.16.28.70 -p tcp --sport 22 -j ACCEPT
本机设置规则开放22,23,80端口
iptables -A INPUT -d 172.16.28.70 -p tcp -m multiport --dports 22:23,80 -j ACCEPT
iptables -A OUTPUT -s 172.16.28.70 -p tcp -m multiport --sports 22:23,80 -j ACCEPT
禁止172.16.28.72连接本机的ssh服务
iptables -I INPUT -d 172.16.28.70 -s 172.16.28.72 -p tcp --dports 22 -j DROP
将本机mysql服务的3306端口开放给172.16.28.71-172.16.28.79
iptables -I INPUT -d 172.16.28.70 -p tcp --dports 3306 -m iprange --src-range 172.16.28.71-172.16.28.79 -j ACCEPT
iptables -I OUTPUT -s 172.16.28.70 -p tcp --dports 3306 -m iprange --src-range 172.16.28.71-172.16.28.79 -j ACCEPT
本机httpd服务响应的目标IP不是172.16.28.71-172.16.28.79这个范围内的,以kmp算法检测出响应的应用层数据中包含字符串admin,就拒绝
iptables -A OUTPUT -s 172.16.28.70 -p tcp --sport 80 -m iprange ! -dst-range 172.16.28.71-172.16.28.79 -m string --string "admin" --algo kmp -j REJECT
本机的telnet服务,只允许周二四六工作时间访问
iptables -I INPUT -d 172.16.28.70 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Tue,Thu,Sat, -j ACCEPT
限制telnet服务的连接数,最多两个
iptables -A INPUT -d 172.16.28.70 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
本机允许一开始连续ping5次,然后允许每3秒ping一次
iptables -I INPUT -d 172.16.28.70 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 3/second -j ACCEPT
追踪连接,实现本机允许被ping
iptables -A INPUT -d 172.16.28.70 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.28.70 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT -d 172.16.28.70 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
对本机80端口的访问请求,转向本机的8088端口
iptables -t nat -A PREROUTING -d 172.16.28.70 -p tcp --dport 80 -j REDIRECT --to-port 8088
标签:防火墙
原文地址:http://11613365.blog.51cto.com/11603365/1831786