Linux中的防火墙简介
Linux防火墙这块儿的内容比较多,一直以来,都是一个使用者的角色,最近在看一些防火墙相关的知识,简单列一下,大家也可以了解一下。
01
防火墙iptables简介
防火墙从逻辑上讲,分为主机防火墙和网络防火墙,
主机防火墙针对单个主机进行防护;
网络防火墙处于网络入口或者边缘,针对于网络入口进行防护。
从物理上讲,防火墙分为硬件防火墙和软件防火墙,
硬件防火墙:在硬件级别实现部分防火墙功能,性能高,成本高
软件防火墙:基于软件实现的防火墙,性能低,成本低。
其实说白了讲,Linux中的防火墙就是用于实现Linux下IP访问控制的功能,我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略和规则。
iptables的前身叫ipfirewall (内核1.x时代),当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。iptables是工作在用户空间中,定义规则的工具,本身并不算是防火墙。我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个安全框架才是真正的防火墙,这个框架的名字叫做netfilter,iptables定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作,所以netfilter才是真正的安全框架(framework)。
02
表和链的概念
netfilter和iptables组成linux平台下的包过滤防火墙,与大多数的Linux软件一样,他可以完成封包过滤、封包重定向和网络地址转换等功能。在iptables中定义的规则,必须要放入内核中功netfilter读取,而放入内核的地方,一共分为五处:
1.内核空间中:从一个网络接口进来,到另一个网络接口出去
2.数据包从内核流入用户空间的
3.数据包从用户空间流出的
4.进入/离开本机的外网接口
5.进入/离开本机的内网接口
这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
下面我们用一张图来说明防火墙对于网络报文的控制流程:
可以看到,每一个规则链都在网络的不同位置扮演不同的角色,从上面的图不难看出报文的流向如下:
传到本机的报文:prerouting-->input
由本机转发的报文:prerouting-->forward-->postrouting
由本机的某个进程发出报文:output-->postrouting
上面介绍了链的概念,下面我们介绍表的概念,表总体分为一下几类:
filter表:负责过滤功能,防火墙;
nat表:network address translation,网路地址转换功能
managle表:拆解报文,作出修改,并重新封装
raw表:关闭nat表上启用的链接追踪机制
03
表和链的对应关系
某些链中只包含某些表,并不是每个链都包含上述这几种表,表和链的对应关系如下:
当一个链中同事包含四种表的时候,这四个表的优先级顺序如下:
raw-->mangle-->nat-->filter
只有output链能够同时包含这四种表,这也就是为什么我们的防火墙文件中output项比较多的原因。
04
匹配规则
只有满足匹配规则的报文才能被转发
基本匹配条件
源地址Source IP和目标地址Destination IP
上述内容都可以作为基本匹配条件。
扩展匹配规则
这里不展开细说,可以是源端口和目标端口,源地址、目的地址、传输协议、服务协议等,
当规则匹配之后,处理方法如下:
规则所定义的方法:
ACCEPT:允许通过
LOG:记录日志信息,然后传给下一条规则继续匹配。
REJECT:拒绝通过,必要时给出提示。
DROP:直接丢弃,不给出任何回应。
匹配规则查看方法:
iptables -t filter -L 查询filter表的所有规则
iptables -t raw -L 查看raw表的所有规则
类比一下,其他两种表的查看方法也类似上面。
当我们使用iptables -L的时候,其默认的表是filter表,我们可以使用参数v显示更加详细的信息,如下:
代码语言:javascript复制[dba_mysql ~]$sudo iptables -vL | grep 192.168
0 0 ACCEPT tcp -- any any 192.168.18.46 anywhere tcp spts:1024:65535 multiport dports visicron-vs state NEW
0 0 ACCEPT tcp -- any any 192.168.18.49 anywhere tcp spts:1024:65535 multiport dports visicron-vs state NEW
3 156 ACCEPT tcp -- any any 192.168.18.228 anywhere tcp spts:1024:65535 multiport dports visicron-vs state NEW
3 152 ACCEPT tcp -- any any 192.168.0.0/16 anywhere tcp spts:1024:65535 multiport dports mysql,33306,ms-sql-s,27017,28017 state NEW
0 0 ACCEPT tcp -- any any 192.168.0.0/16 anywhere tcp spts:1024:65535 dpt:rsync state NEW
0 0 ACCEPT tcp -- any any 192.168.18.92 anywhere tcp spts:1024:65535 multiport dports pinghgl,visicron-vs,compx-lockview,dserver,mirrtex,4311 state NEW
这里我们之过滤192.168网段的数据,这样数据会相对少一些。
清除防火墙内容:
iptbles -F INPUT 清空filter表input链中的规则
05
匹配规则测试
下面我们用192.168.197.136和192.168.197.137两台机器做个测试,他们的hostname分别对应work_NAT_5和work_NAT_4:
1、清理136防火墙,
2、137--->136 ping命令
首先我们从137往136发送一个ping命令
代码语言:javascript复制[root@work_NAT_4 ~]# ping 192.168.197.136
PING 192.168.197.136 (192.168.197.136) 56(84) bytes of data.
64 bytes from 192.168.197.136: icmp_seq=1 ttl=64 time=0.155 ms
64 bytes from 192.168.197.136: icmp_seq=2 ttl=64 time=0.216 ms
^C
--- 192.168.197.136 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1288ms
rtt min/avg/max/mdev = 0.155/0.185/0.216/0.033 ms
可以看到这个是可以ping通的,然后我们给136上面添加一定的规则,命令和执行结果如下:
代码语言:javascript复制iptables -t filter -I INPUT -s 192.167.197.137 -j DROP
[root@work_NAT_5 ~]# iptables -t filter -I INPUT -s 192.168.197.137 -j DROP
此时发现137已经无法ping 通了
[root@work_NAT_4 ~]# ping 192.168.197.136
PING 192.168.197.136 (192.168.197.136) 56(84) bytes of data.
^C
--- 192.168.197.136 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1950ms
其中参数-I表示添加一条规则,-s表示源目标
这个时候,我们去思考,如果添加一条ACCEPT,另外一条是DROP到底哪一条生效呢?目前防火墙中的内容如下:
代码语言:javascript复制[root@work_NAT_5 ~]# iptables -t filter -I INPUT -s 192.168.197.137 -j DROP
[root@work_NAT_5 ~]# iptables -t filter -A INPUT -s 192.168.197.137 -j ACCEPT
[root@work_NAT_5 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 40 packets, 2880 bytes)
pkts bytes target prot opt in out source destination
6 504 DROP all -- * * 192.168.197.137 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.197.137 0.0.0.0/0
我们发现DROP在ACCEPT的上面,此时我们ping一下:
[root@work_NAT_4 ~]# ping 192.168.197.136
PING 192.168.197.136 (192.168.197.136) 56(84) bytes of data.
^C
--- 192.168.197.136 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1798ms
发现还是无法ping通,查看197.136服务器,发现又多了两个DROP的包,也就是说,刚才我们发的那两个包被丢弃了!!!
查看136的input链:
此时我们换一下,这两个规则的顺序,如下:
代码语言:javascript复制136
[root@work_NAT_5 ~]# iptables -F INPUT
[root@work_NAT_5 ~]# iptables -t filter -I INPUT -s 192.168.197.137 -j ACCEPT
[root@work_NAT_5 ~]# iptables -t filter -A INPUT -s 192.168.197.137 -j DROP
[root@work_NAT_5 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 40 packets, 2880 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 192.168.197.137 0.0.0.0/0
0 0 DROP all -- * * 192.168.197.137 0.0.0.0/0
137:
[root@work_NAT_4 ~]# ping 192.168.197.136
PING 192.168.197.136 (192.168.197.136) 56(84) bytes of data.
64 bytes from 192.168.197.136: icmp_seq=1 ttl=64 time=0.281 ms
64 bytes from 192.168.197.136: icmp_seq=2 ttl=64 time=0.280 ms
64 bytes from 192.168.197.136: icmp_seq=3 ttl=64 time=0.239 ms
^C
--- 192.168.197.136 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2541ms
rtt min/avg/max/mdev = 0.239/0.266/0.281/0.027 ms
已经可以ping通了,说明规则顺序会对数据报的传输产生影响
关于防火墙的参数还有很多,包含表规则修改、修改默认策略等等,后续将详细说明具体规则的用法。