简介
我们在第一篇介绍iptables的时候提到过,iptables是一个包过滤防火墙,那么防火墙是怎么分类的呢?都有哪些防火墙?下面我们先简单介绍下防火墙的分类:
按部署位置分类
- 网络层防火墙(网络边界防火墙):位于网络边界处,监控网络流量进出。
- 主机防火墙:安装在单个主机上,保护该主机免受攻击。
按过滤技术分类:
- 包过滤防火墙:基于数据包的源、目的地址、端口等信息做决策。
- 应用层代理防火墙:深度检查网络通信内容,能够识别应用层协议,并控制应用层交互。
软、硬件形式分类:
- 软件防火墙:运行于特定的计算机上,需要客户预先安装好的计算机操作系统的支持。这台计算机通常作为整个网络的网关,俗称“个人防火墙”。
- 硬件防火墙:基于PC架构,与普通家庭用的PC区别不大。它们运行经过裁剪和简化的操作系统,如老版本的Unix、Linux和FreeBSD系统。这种防火墙可能受到操作系统本身的安全性影响。
- 芯片级防火墙:基于专门的硬件平台,没有操作系统。专有的ASIC芯片使它们具有更快的速度、更强的处理能力和更高的性能。
防火墙结构分类:
- 单一主机防火墙:保护单个主机免受外部威胁。
- 路由器集成式防火墙:将防火墙功能集成到路由器中,提供网络层面的安全保护。
- 分布式防火墙:在网络中的多个位置部署防火墙,提供更全面的安全保护。
以上以一些简单的分类,在前文的举例中,iptables都是作为主机防火墙的角色出现的,那么这篇文章我们介绍iptables怎么作为网络防火墙。
网络防火墙往往处于网络的入口或者边缘,如果想要使用iptables充当网络防火墙,iptables所在的主机则需要处于网络入口处。
![](https://img-blog.csdnimg.cn/direct/f626e94be56447749329c797f5e6ec51.png)
当外部网络中的主机与网络内部主机通讯时,不管是由外部主机发往内部主机的报文,还是由内部主机发往外部主机的报文,都需要经过iptables所在的主机,由iptables所在的主机进行”过滤并转发”,所以,防火墙主机的主要工作就是”过滤并转发”,那么再次回顾一下之前的iptables报文流程图
![](https://img-blog.csdnimg.cn/direct/47baf4611883461289f74e40982f56a4.png)
在我们前面文章的介绍中,iptables都是作为”主机防火墙”的角色出现的,所以我们举例时,只用到了上图中的INPUT链与OUTPUT链,因为拥有”过滤功能”的链只有3条,INPUT、OUTPUT、FORWARD,当报文发往本机时,如果想要过滤,只能在INPUT链与OUTPUT链中实现,而此时,iptables的角色发生了转变,我们想要将iptables所在的主机变为”网络防火墙”,网络防火墙的功能就是”过滤并转发”,要想”过滤”,只能在INPUT、OUTPUT、FORWARD三条链中实现,要想”转发”,报文则只会经过FORWARD链(发往本机的报文才会经过INPUT链)。
环境准备
如上图所示,方框中我们假设为内部网络,右侧我们假设为外部网络,此时内部网络和外部网络在不同的网段,通过中间的防火墙连接,此处的防火墙就是我们的iptables主机。
此时主机A的默认网关是iptables防火墙,iptables防火墙的默认网关是公网出口下一跳的ip地址
![](https://img-blog.csdnimg.cn/direct/4002fdc41ade4b1586be35d7b1c74813.png)
![](https://img-blog.csdnimg.cn/direct/5efa4259513647b59fef60d7ad3cfa7c.png)
注意:此时主机A可以访问主机B,主机B可以访问主机C,也就是说A-B,B-C之间可以进行互访,因为两两之间默认都在同一网段。但是主机A不能直接访问主机C,默认情况下主机B没有开启路由转发功能,当主机A访问主机C的数据包到达主机B后,主机B不进行转发。
假设,此时主机B即iptables开起了ipv4路由转发,那么主机A能否ping同主机C呢?答案是不能,因为主机C没有主机A的路由。这里简单解释一下:
主机A ping主机C,即192.168.140.248 ping 192.168.170.128,默认网关是192.168.140.250,当数据包到达192.168.140.250主机B后,那么主机B查路由表,主机B的默认网关是主机C 192.168.170.128,数据包发送到192.168.170.128。但是,主机C无法回数据包,因为发送数据包的源是主机A,即192.168.140.248,主机C的路由表中,没有到达192.168.140.248的路由,此时会匹配的主机C的默认路由。所以我们现在主机C上添加到达主机A的路由。
![](https://img-blog.csdnimg.cn/direct/dbcdae08d7a540a3bbd23ee9e98690cc.png)
开启IP路由转发
临时开启IPv4转发(重启后失效)
使用echo
命令直接写入到/proc/sys/net/ipv4/ip_forward
文件中:
echo 1 > /proc/sys/net/ipv4/ip_forward
这条命令会立即开启IPv4转发功能,但系统重启后会失效。
![](https://img-blog.csdnimg.cn/direct/7cf72277f1754466bc3918c96ef4806b.png)
永久开启IPv4转发:
修改/etc/sysctl.conf
文件,在文件末尾添加或修改以下行:
net.ipv4.ip_forward=1
保存文件后,为了使更改生效,执行以下命令:
sysctl -p
sysctl -p 是一个在Linux系统中用于加载或重新加载/etc/sysctl.conf文件(以及/etc/sysctl.d/目录下的任何配置文件)中设置的内核参数的命令。
当你在/etc/sysctl.conf文件(或其他sysctl配置文件中)更改了内核参数的设置后,这些更改并不会立即生效,除非系统重新启动。然而,你可以使用sysctl -p命令来应用这些更改,而无需重新启动系统。
下面是这个命令的简要解释:
sysctl: 这是用来查看和修改运行中的内核参数的工具。
-p: 这个选项表示从默认的文件/etc/sysctl.conf以及/etc/sysctl.d/目录(在某些Linux发行版中)中读取并应用内核参数设置。
![](https://img-blog.csdnimg.cn/direct/62af42c6bb3d454d96fcc48218003d8c.png)
![](https://img-blog.csdnimg.cn/direct/f4e9b49493fe4288af95884214b3aeda.png)
测试
主机A ping主机C
![](https://img-blog.csdnimg.cn/direct/8a2fe1f4eee44bf8a136e87c40872514.png)
![](https://img-blog.csdnimg.cn/direct/04db6ea0639947d289aaf402902c4a3e.png)
网络防火墙
iptables作为网络防火墙时,主要负责”过滤与转发”,既然要过滤,则需配置filter表,既然要转发,则需在FORWAED链中定义规则,所以,我们应该在filter表中的FORWARD链中配置规则。
![](https://img-blog.csdnimg.cn/direct/e68147bb1fe646c2be175d1d04d9be1f.png)
![](https://img-blog.csdnimg.cn/direct/993dab9457954233928ce324a954768b.png)
![](https://img-blog.csdnimg.cn/direct/139859c3ebfa48f4aa8d56f222b488eb.png)
主机A访问主机C的SSH服务
想要使内部的主机A能够访问外部主机C的ssh服务,我们需要在FORWARD链中放行内部主机对外部主机的ssh请求
![](https://img-blog.csdnimg.cn/direct/73804633bce9441c8db016133e4f6620.png)
![](https://img-blog.csdnimg.cn/direct/ce2a477231324eb58e5654e0631acd0b.png)
我们前面在FORWARD放行了主机A所在网段192.168.140.0/24访问主机C的tcp 22端口的链接,但是,连接是双向的,当主机A访问主机C ,主机C给主机A返回数据时也需要经过主机B,但是主机B的FORWARD链的默认规则是DROP,所以返回的数据包无法转发给主机A导致无法通信。
![](https://img-blog.csdnimg.cn/direct/9f12e5a94b074ff4b07b7e15f95a5dea.png)
![](https://img-blog.csdnimg.cn/direct/e0bab96c34624493b346249d6b3e5ec6.png)
![](https://img-blog.csdnimg.cn/direct/db1d578c5b7a4115be7f35670e54f8bc.png)
从上述例子可以看出,和路由表一样,当iptables作为”网络防火墙”时,在配置规则时,往往需要考虑”双向性”。这个在之前我们介绍扩展模块state提到的--tcp-flags时也有介绍,即tcp的三次握手、tcp的状态。
在上述的例子中,我们只放通了ssh端口就需要两条规则进行双向放通,那么如果我们有很多端口需要放通,那就需要更多的规则去匹配需要进行匹配。那么有什么办法可以高效的实现我们想要的功能呢?我们可以结合前面文章中所介绍的扩展模块state和自定义链来实现同样的功能。
举例:A可以访问C的服务,但是C不能主动访问A
![](https://img-blog.csdnimg.cn/direct/798a10450b9c498bbce8c694ab82757c.png)
![](https://img-blog.csdnimg.cn/direct/33e6351f9c774289a72d806b81cb5f34.png)
![](https://img-blog.csdnimg.cn/direct/bd5ba4e3d3684ad587cbbe241001d56d.png)
![](https://img-blog.csdnimg.cn/direct/6933224871a649ec946ab82f5168fd9e.png)
在上述例子中,我们只需要在FRW-A-C中添加主机A要访问主机C的规则,即只需要增加主机A需要访问主机C的端口,返回流量会自动匹配到FRW-A-C自定义链中的第三条规则。这样随着业务数量的增加,可以缩小iptables规则条目的数据量。iptables还有更多各种各样的组合,需要大家自己去尝试。