Linux中的防火墙简介

2019-11-06 17:03:20 浏览数 (1)

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通了,说明规则顺序会对数据报的传输产生影响

关于防火墙的参数还有很多,包含表规则修改、修改默认策略等等,后续将详细说明具体规则的用法。

0 人点赞