iptables(9)网络防火墙

简介       

        我们在第一篇介绍iptables的时候提到过,iptables是一个包过滤防火墙,那么防火墙是怎么分类的呢?都有哪些防火墙?下面我们先简单介绍下防火墙的分类:

 按部署位置分类

  • 网络层防火墙(网络边界防火墙):位于网络边界处,监控网络流量进出。
  • 主机防火墙:安装在单个主机上,保护该主机免受攻击。

按过滤技术分类

  • 包过滤防火墙:基于数据包的源、目的地址、端口等信息做决策。
  • 应用层代理防火墙:深度检查网络通信内容,能够识别应用层协议,并控制应用层交互。

软、硬件形式分类:

  • 软件防火墙:运行于特定的计算机上,需要客户预先安装好的计算机操作系统的支持。这台计算机通常作为整个网络的网关,俗称“个人防火墙”。
  • 硬件防火墙:基于PC架构,与普通家庭用的PC区别不大。它们运行经过裁剪和简化的操作系统,如老版本的Unix、Linux和FreeBSD系统。这种防火墙可能受到操作系统本身的安全性影响。
  • 芯片级防火墙:基于专门的硬件平台,没有操作系统。专有的ASIC芯片使它们具有更快的速度、更强的处理能力和更高的性能。

防火墙结构分类

  • 单一主机防火墙:保护单个主机免受外部威胁。
  • 路由器集成式防火墙:将防火墙功能集成到路由器中,提供网络层面的安全保护。
  • 分布式防火墙:在网络中的多个位置部署防火墙,提供更全面的安全保护。

以上以一些简单的分类,在前文的举例中,iptables都是作为主机防火墙的角色出现的,那么这篇文章我们介绍iptables怎么作为网络防火墙。

网络防火墙往往处于网络的入口或者边缘,如果想要使用iptables充当网络防火墙,iptables所在的主机则需要处于网络入口处。

如上图所示,防火墙处于网络的边缘,内部可以通过防火墙访问外部,防火墙可以对内部与外部进行隔离。

当外部网络中的主机与网络内部主机通讯时,不管是由外部主机发往内部主机的报文,还是由内部主机发往外部主机的报文,都需要经过iptables所在的主机,由iptables所在的主机进行”过滤并转发”,所以,防火墙主机的主要工作就是”过滤并转发”,那么再次回顾一下之前的iptables报文流程图

注意,想要linux主机支持转发功能,需要开启内核的IP_FORWARD功能

在我们前面文章的介绍中,iptables都是作为”主机防火墙”的角色出现的,所以我们举例时,只用到了上图中的INPUT链与OUTPUT链,因为拥有”过滤功能”的链只有3条,INPUT、OUTPUT、FORWARD,当报文发往本机时,如果想要过滤,只能在INPUT链与OUTPUT链中实现,而此时,iptables的角色发生了转变,我们想要将iptables所在的主机变为”网络防火墙”,网络防火墙的功能就是”过滤并转发”,要想”过滤”,只能在INPUT、OUTPUT、FORWARD三条链中实现,要想”转发”,报文则只会经过FORWARD链(发往本机的报文才会经过INPUT链)。

环境准备

如上图所示,方框中我们假设为内部网络,右侧我们假设为外部网络,此时内部网络和外部网络在不同的网段,通过中间的防火墙连接,此处的防火墙就是我们的iptables主机。

此时主机A的默认网关是iptables防火墙,iptables防火墙的默认网关是公网出口下一跳的ip地址

主机A的ip地址是192.168.140.248,默认网关是140.250
iptables主机B的默认网关是170.128

       注意:此时主机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的路由。

主机C添加到达主机A的路由192.168.140.248 下一跳是192.168.170.200

开启IP路由转发

临时开启IPv4转发(重启后失效)

使用echo命令直接写入到/proc/sys/net/ipv4/ip_forward文件中:

echo 1 > /proc/sys/net/ipv4/ip_forward
这条命令会立即开启IPv4转发功能,但系统重启后会失效。
默认是0,表示未开启

永久开启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发行版中)中读取并应用内核参数设置。
我这里直接编辑该文件,取消注释
重新加载生效

测试

主机A ping主机C

主机A已经可以ping通主机C
使用tracepath -n可以看到我们经过的路由下一跳是140.250,然后是170.128

网络防火墙

        iptables作为网络防火墙时,主要负责”过滤与转发”,既然要过滤,则需配置filter表,既然要转发,则需在FORWAED链中定义规则,所以,我们应该在filter表中的FORWARD链中配置规则。

FORWARD链中没有任何规则,默认策略为ACCEPT,我们可以使用白名单/黑名单机制的方式进行策略设置,具体使用哪种则需要根据自己的需求和具体使用环境定义。我这里使用黑名单的机制,即默认策略修改为拒绝,然后在前面规则里设置放行规则
我修改的是默认策略,当然也可以直接在FORWARD链插入一条规则,策略是拒绝所有,然后后面写的新策略都插入到该条规则之前,此时主机A和主机C已经无法进行通信了。
主机A在ping主机C时,需要靠主机B进行转发,而上述规则设置完成后,所有报文都无法通过FORWARD链,所以任何经过转发的报文在经过FORWARD链时都会被拒绝,外部主机的报文无法转发到内部主机中,内部网主机的报文也无法转发到外部主机中,因为主机B已经拒绝转发所有报文。

主机A访问主机C的SSH服务

想要使内部的主机A能够访问外部主机C的ssh服务,我们需要在FORWARD链中放行内部主机对外部主机的ssh请求

放行内部网段192.168.140.0/24的主机访问目的端口为22的tcp连接,注意需要应用在FORWARD链上
主机A通过ssh连接主机C,现在无法连接,这是为什么呢?

我们前面在FORWARD放行了主机A所在网段192.168.140.0/24访问主机C的tcp 22端口的链接,但是,连接是双向的,当主机A访问主机C ,主机C给主机A返回数据时也需要经过主机B,但是主机B的FORWARD链的默认规则是DROP,所以返回的数据包无法转发给主机A导致无法通信。

新增一条规则,允许从源端口22来的tcp流量转发至主机A所在网段192.168.140.0/24
此时从主机A ssh主机C,已经可以连接
两条规则都匹配了对应的数据包

从上述例子可以看出,和路由表一样,当iptables作为”网络防火墙”时,在配置规则时,往往需要考虑”双向性”。这个在之前我们介绍扩展模块state提到的--tcp-flags时也有介绍,即tcp的三次握手、tcp的状态。

在上述的例子中,我们只放通了ssh端口就需要两条规则进行双向放通,那么如果我们有很多端口需要放通,那就需要更多的规则去匹配需要进行匹配。那么有什么办法可以高效的实现我们想要的功能呢?我们可以结合前面文章中所介绍的扩展模块state和自定义链来实现同样的功能。

举例:A可以访问C的服务,但是C不能主动访问A

先创建自定义链FRW-A-C,创建state扩展模块,匹配ESTABLISHED,RELATED,就能匹配返回的数据包,允许返回的数据包通过,下面放行22和80端口即允许A访问C的22和80端口
主机A访问主机C的ssh服务可以访问
主机A也可以访问主机C的80端口
此时主机C是无法访问主机A的,因为在主机B上,我们的FORWARD链使用的是扩展模块state,该流量是无法匹配我们的自定义链FRW-A-C中的规则的,而FORWARD的默认规则是DROP,所以无法访问。

在上述例子中,我们只需要在FRW-A-C中添加主机A要访问主机C的规则,即只需要增加主机A需要访问主机C的端口,返回流量会自动匹配到FRW-A-C自定义链中的第三条规则。这样随着业务数量的增加,可以缩小iptables规则条目的数据量。iptables还有更多各种各样的组合,需要大家自己去尝试。

  • 35
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值