linux防火墙字符串,linux下的防火墙

Firewall是一种隔离工具,工作于主机或网络的边缘,对经由的报文根据预先定义的规则(识别条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件,主要有以下四种:

硬件防火墙:在硬件级别能部分防火墙,另一部分功能基于软件实现;

软件防火墙:应用软件处理逻辑运行通用硬件实现的防火墙;

主机防火墙:服务范围为当前主机;

网络防火墙:服务范围为局域网;

本文将介绍的是防火墙工具iptables。

1.iptables结构

iptables由五个表和五个链以及一些规则组成:

五个表table:filter、nat、mangle、raw、security:

filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包,filter表是默认规则表

nat表:network address translation 地址转换规则表

mangle:修改数据标记位规则表

raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度

security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现

优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter

五个内置链chain:

INPUT

OUTPUT

FORWARD

PREROUTING

POSTROUTING

对于网络中的报文,分为两种,一种是到本主机的报文,一种是经由本主机的转发报文,对于到本主机的报文,在内核中的传输过程是这样的,首先数据包会PREROUTING进入主机,在内核中进入tcp/ip协议栈,在这里会检查这个数据包的目的ip,查看是否是发送给本主机的,如果是发送给本主机的,会进入INPUT链,

2.iptables基本语法匹配规则

iptables的语法主要有三部分,第一部分是定义操作,第二不会是检查条件,第三步是是处理动作。

首先说一下对链的操作:

-P 定义某张表的某条链的默认策略

-N 新建一条自定义的规则链,但自定义规则链只有在被主链调用时才能生效

-X 删除引用数为0的自定义规则链

-F 清空某张表的某条链,不指定是清空某张表的所有的表规则

-E 重命名某条引用为0的自定义规则链

-L 列出某张表某条链的所以规则,不指定时列出所有的表规则

-v 详细显示表规则

-n 不进行地址解析

操作有以下几个选项:

-A 追加,在某一表的某一条链上追加一条规则

-I 插入,在某一张表的某一条链的特定位置插入一条规则

-D 删除,删除某一个表的某一条链的规则

-R 替换,用某一条规则替换掉某张表的某条规则

检查条件有一下几项:

-s 检查报文中的源ip地址是否符合此处指定的ip地址范围

-d 检查报文中的目的ip地址是否符合此处指定的ip地址范围

-i 检查报文的流入借口

-o 检查报文的流出借口

-p 检查报文的协议是否符合此处指定的协议

1.主链

可以看下面这些例子:

查看filter表的表规则:

linux防火墙字符串,linux下的防火墙_第1张图片

我们先保证ssh能够连接,这样不管我们怎么修改,都不会让我们的xshell连接不上,命令如下:

iptables -t filter -A INPUT 1 -d 192.168.123.44/24 -p tcp -i ens34 --dport 22 -j ACCEPT

iptables -t filter -A OUTPUT -s 192.168.123.44/24 -p tcp -o ens34 --sport 22 -j ACCEPT

执行结果如下:

linux防火墙字符串,linux下的防火墙_第2张图片

然后把默认规则设置为DROP,表的默认规则只能是DROP和ACCEPT,不能是REJECT,命令如下:

iptables -t filter -P INPUT DROP

iptables -t filter -P OUTPUT DROP

iptables -t filter -P FORWARD DROP

执行结果如下:

linux防火墙字符串,linux下的防火墙_第3张图片

然后访问本机的http服务,命令如下:

curl http://192.168.123.44/hello.html

执行结果如下:

55dce28efa7899a66a6fbd5aacc98e15.png

因为防火墙只允许通往192.168.123.44的ssh服务通过,默认策略又是拒绝的,这里访问http服务的包会被丢掉。

我们修改防火墙策略,将http服务设置为允许,命令如下:

iptables -t filter -A INPUT -p tcp -d 192.168.123.44 --dport 80 -j ACCEPT

iptables -t filter -A OUTPUT -p tcp -s 192.168.123.44 --sport 80 -j ACCEPT

分别在centos6(192.168.123.22)和本机(192.168.123.44)访问,结果如下:

centos6:

e43259aea8f18792b146b4927c3991ff.png

centos7:

6c27c5ee76abdd67a2f82f4133074b2e.png

然后开放允许本机访问,命令如下:

iptables -A INPUT -p tcp -s 192.168.123.44 -d 192.168.123.44 -j ACCEPT

iptables -A OUTPUT -p tcp -d 192.168.123.44 -s 192.168.123.44 -j ACCEPT

执行结果如下:

61511024ac29a1554167de62e70476c5.png

防火墙策略入下:

linux防火墙字符串,linux下的防火墙_第4张图片

对于访问本机的http服务,数据流是这样的,请求报文开一个随机端口,从OUTPUT链流出,出POSTROUTING链出,从PREROUTING进到INPUT80端口,然后从80出进入随机端口。所有本机访问时要把本机对本机的随机端口的访问打开。

虽然对于白名单和黑名单来说,白名单相对来说安全的多,但是当我们的服务是一个开放的文件共享服务如samba或者http服务,那么白名单就不适合了,黑名单更加实用,而且我们不要把链的默认规则设置为禁止访问,如果这样做,当我们清空防火墙时,会发现我们的ssh也连接不上了。

2.自建链

自建链单独自己是不能生效的,必须要主链调用才能生效,我们可以用下面命令来创建一条自定义链,并且调用他:

iptables -t filter -N can

iptables -A can -j REJECT

iptables -A INPUT -j can

结果如下:

linux防火墙字符串,linux下的防火墙_第5张图片

然后本机访问自己的http服务:

48b2c87e7dc3786cbc0dfe8ed5ac9f1f.png

一条被调用的自定义链不能被删除,一条有规则的链也不能被删除,只有删除所有的调用,并且清空规则的自定义才能被删除:

linux防火墙字符串,linux下的防火墙_第6张图片

3.iptables扩展匹配

基本的扩展规则在对一条普通的报文还可行,但是对于ftp数据包无能为力,同时如果本机有多重服务,每个服务都有大量的访问量时,一条一条的规则匹配会浪费大量的时间,使用扩展匹配条件能够帮助我们减少规则数,提高用户的访问速率。

1.隐式扩展

不用-m选项指出matchname即可使用此match的专用选项进行匹配

1.tcp扩展

--source-port,--sport 端口,--destination-port,--dport 端口,在这里指定-p tcp时隐含包括了-m tcp ;--sport匹配传输层源端口,--dport匹配传输层目的端口,例如:

iptables -t filter -A INPUT -p tcp --dport 20:80 -d 192.168.123.44 -j REJECT

这样20到80的所有端口都不能被访问了,结果如下:

linux防火墙字符串,linux下的防火墙_第7张图片

使用ssh和http在centos6(192.168.123.22)上测试,结果如下:

cff7c7485661232576336ad1b9ccb684.png

--tcp-flags 标志位列表 必须为1的标志位列表,余下出现在前面的标志位列表必须为0

tcp的几个标志位:SYN,ACK,FIN,RST,URG,PSH;

SYN表示请求序列

ACK回应的序列

FIN表示开始断开

RST复位标志

URG紧急标志位

PSH标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。

例如阻断tcp连接的首次连接:

iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT

结果如下:

linux防火墙字符串,linux下的防火墙_第8张图片

用本机测试http服务:

21b1773183469aaf508327eaafb8f782.png

--syn:

相当于--tcp-flags SYN,ACK,FIN,RST SYN

2.udp扩展

--source-port,--sport port 端口,匹配报文中传输层的源端口

--destination-port,--dport port 端口匹配报文中传输层的目标端口,这里是使用UDP协议时隐含包括了-m udp

3.icmp扩展

icmp扩展,指定-p icmp时,隐含了-m icmp,语法是--icmp-type 报文类型,请求报文类型是8,响应报文类型是0,例如:

在centos7上的INPUT链关闭请求报文,命令如下:

iptables -t filter -A INPUT -p icmp --icmp-type 8 -j REJECT

结果如下:

linux防火墙字符串,linux下的防火墙_第9张图片

在centos6(192.168.123.22)上pingcentos7(192.168.123.44)结果如下:

4fca7539e07177849770ddac691b280a.png

显示到达不了目标主机,可以证明防火墙生效了。

2.显式扩展

必须使用-m选项指出matchname,有的match可能存在专用的选项

1.multiport扩展

multiport扩展的目的是以离散或连续的方式定义多端口匹配条件,语法如下:

--source-ports,--sports port[,port|,port:port]...:指定多个源端口;

--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;

--ports port[,port|,port:port]...:指定多个端口;

例如指定目的端口为centos7的20到80还有3306端口,命令如下:

iptables -A INPUT -p tcp -m multiport --dports 20:80,3306 -j ACCEPT

iptables -A INPUT -j REJECT

结果如下:

linux防火墙字符串,linux下的防火墙_第10张图片

在centos6(192.168.123.22)上分别访问centos7(192.168.123.44)上的ssh服务和http服务:

ssh:

48511fb769dc509e42f276a358762b5f.png

http:

45bbe787778a58ae0655fa8ce47c6ca0.png

2.iprange扩展

iprange以连续的ip地址范围指明连续的多地址匹配条件,语法如下:

--src-range 地址范围 -------------------用来匹配源IP地址;

--dst-range 地址范围 -------------------用来匹配目标IP地址;

例如允许192.168.123.1-192.168.123.33的地址访问centos7的http服务,命令如下:

iptables -t filter -I INPUT 2 -p tcp -m iprange --src-range 192.168.123.1-192.168.123.33 --dport 80 -j ACCEP

结果如下:

linux防火墙字符串,linux下的防火墙_第11张图片

分别在centos6(192.168.123.22)上分别访问centos7(192.168.123.44)上访问centos7的http服务:

centos6:

84b2d084f91af0b92b486348ba233bab.png

centos7:

922d3084b40471f163c3364532cfb65b.png

3.set扩展

set扩展依赖于ipset命令行工具,set扩展的目的就是解决离散型ip地址的匹配问题,首先是利用ipset生成一个ip地址表,命令如下:

ipset create httplist hash:net maxelem 1000

ipset add httplist 192.168.123.22

执行结果如下:

linux防火墙字符串,linux下的防火墙_第12张图片

然后将这张表添加进防火墙规则,命令如下:

iptables -I INPUT 2 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT

-m指定扩展的模块,--match-set指定ip地址表,src/dst指定是源海市目的地址列表

结果如下:

linux防火墙字符串,linux下的防火墙_第13张图片

分别在centos6(192.168.123.22)上分别访问centos7(192.168.123.44)上访问centos7的http服务:

centos6:

c6c817ef5524d981eea39153b43025d5.png

centos7:

7ab01bdc1e2bd0285cebb8719ae63c14.png

4.string扩展

string扩展是对报文中的应用层数据做字符串匹配检测,语法为:

--string pattern:要检测字符串模式;

--algo {bm|kmp}

例如我们对centos7上的hello.html网站进行过滤,命令如下:

iptables -I INPUT 2 -p tcp -m string --algo bm --string hello -j REJECT

结果如下:

linux防火墙字符串,linux下的防火墙_第14张图片

使用本机访问hello.html:

1f9b36d056632bf4903b4da56167b1cd.png

5.time扩展

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:使用内核中配置的时区

6.connlimit扩展

--connlimit-upto n:连接数数量小于等于n,此时应该允许;

--connlimit-above n:连接数数量大于n,此时应该拒绝;

7.limit扩展

--limit rate[/second|/minute|/hour|/day]:平均速率

--limit-burst number:峰值速率

8.state扩展

4.保存,重载和优化

iptables-save > /PATH/TO/SOME_RULE_FILE

iptables-restore < /PATH/FROM/SOME_RULE_FILE

CentOS 6:

保存规则:

service iptables save

自动保存规则至/etc/sysconfig/iptables文件中;

重载规则:

server iptables restore

从/etc/sysconfig/iptables文件中重载规则;

规则优化:

(1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;

(2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;

(3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;

(4) 设置默认策略;

(a) 最后一条规则设定;

(b) 默认策略设定;

你可能感兴趣的:(linux防火墙字符串)