【Iptables】11 Iptables之网络防火墙

特别说明:此系列博文根据 朱双印博客-iptables系列博文,个人实践后总结,此为个人笔记精简版,更通俗易懂请参考 朱双印博客-iptables系列博文 原文内容,诸君必能有所收获

11 Iptables之网络防火墙

之前我们了解到iptables主要是作为主机防火墙,维护主机的安全,如果想让iptables作为网络防火墙呢?想让iptables服务于防火墙背后的局域网呢?

我们知道,网络防火墙往往是处于网络的入口或者边缘,那么,如果想使用iptables充当网络防火墙,iptables的主机就必须处于网络的入口处,即和外网连通的主机,示意图如下
在这里插入图片描述
上图中,直接与Internet连接互通的就是iptables所在主机(当然中间肯定还有网关路由器等),此时iptables充当的角色就是网络防火墙,浅蓝色部分便是网络防火墙所防护的网络区域,圆形里面的便是处于局域网的其他主机

这个时候,无论是进入内部网络的报文还是内部网络发送出去的报文,都得经过iptables所在主机才行,并且iptables所在主机还得对报文进行"过滤并转发",可能你已经忘记了iptables处理报文的具体流程了,如下图
在这里插入图片描述
以往我们使用iptables主要是作为主机防火墙,只用到了上图中的INPUT链和OUTPUT链,其余的链没有使用,而如果iptables作为网络防火墙,就会用到其他链,但我们知道拥有过滤功能的只有INPUT、OUTPUT和FORWARD链,想要转发报文,只有经过FORWARD链才行,所以当iptables作为网络防火墙时,我们着重会在FORWARD链上定义规则

环境准备

为了能验证iptables作为网络防火墙的功能,我们需要搭建一个实验环境,如下
在这里插入图片描述
我们假设,圆形蓝色区域为内部网络

注意:这里所说的内部网络和外部网络与我们平常所说的公网,私网不同;此处描述的内外网,可以理解为在两个不同网段,即A网段和B网段;我们将之分为内部网络和不在该网段的外部网络

我们假设内部网咯的网段为172.16.0.0/16,此时内部网络中存在主机C,其IP地址为172.16.200.129;存在作为网络防火墙的主机B,它也属于内部网络,但是有两个网卡,可以分别和外部网络和内部网络通信,其网卡1与外部网络通信,IP地址为192.168.200.221,网卡2与内部网络通信,IP地址为172.16.220.128;主机A在此充当外部网络主机,我们将用该主机发送报文去验证主机B的网络防火墙功能,其IP地址为192.168.200.115

现在,让我们准备3台虚拟机,试着搭建环境

在VMware虚拟机的设置中给主机B添加一个网络适配器,这样主机B便有了两个网卡了,并且为了让主机B和主机C在一个网段即内部网络,我们需要添加一个主机网络的连接模式,首先在VMware中,编辑–>虚拟网络编辑器–>

更改配置–>添加网络–>选择一个名称–>VMnet信息选择仅主机模式–>子网和子网掩码配置–>确定,这样我们便可以再主机B的网卡2上选择这个模式,同时在主机C上也选择这个模式,保证两主机在同一网段了
在这里插入图片描述
在这里插入图片描述
可能在主机B上还不能使用双网卡,需要我们自己配置一下,如CentOS7中

cd /etc/sysconfig/network-scripts/ 进入到网络配置文件目录

cp ifcfg-网卡名 ifcfg-别名 拷贝网卡配置文件并重命名

编辑两个网络配置文件,保证两个文件里的NAME变量,DEVICE变量不同,并且使用配置静态IP,配置各网卡的IP地址,完成后,在保证能重启网卡后,可以重启主机,这样主机B便有两个不同的地址

配置主机C的IP时,可以将其GATEWAY变量设置为主机B的IP
在这里插入图片描述
最后,ping一下,看一看主机A和主机B是否能连通,主机B和主机C是否能连通

为了尽量的简化路由设置,我们直接将A主机访问172.16网段时的网关指向主机B的IP,这样主机A每次访问172.16网段,都会去访问主机B
在这里插入图片描述
现在看看能不能通过主机A访问主机B和主机C,分别使用主机Aping主机B的内部网络IP和主机C的IP,结果如下
在这里插入图片描述
可以看到,同样是内部网络的IP,主机A能ping通主机B,但是ping不通主机C,这是为什么呢?

我们之前将主机A访问172.16网段的IP都指向了主机B,主机C没有回应ping命令,证明主机B并没有把相关的报文转发给主机C,没有收到又怎么回应呢,这就是ping不通主机C的缘故;那为什么又能ping通主机B的内部网络IP呢?这 主要是主机B有两个网卡,它既是172.16网段的主机,也是和主机A一个网段的主机

为了能使Linux主机能转发报文,必须要去设置;我们可以查看/proc/sys/net/ipv4/ip_forward文件中的内容,如果内容为0,则表示当前主机不支持转发
在这里插入图片描述
可以看到,主机B该文件内容为0,不支持转发,如果想让主机B支持转发,可以将内容改为1

同时,还可以使用sysctl命令去设置是否开启核心转发,示例如下
在这里插入图片描述
上述的两种方法都能控制是否开启核心转发,但是通过上述两种方式更改的,只能临时有效,当重启网络以后,核心转发功能将会失效,如果想要核心转发功能永久生效,可以更改文件/etc/sysctl.conf文件(CentOS7中为/usr/lib/sysctl.d/00-system.conf文件),添加或修改配置项 net.ipv4.ip_forward = 1

现在,我们再试试看能通过主机Aping通主机C吗
在这里插入图片描述
看来能ping通,那么反过来用主机Cping主机A呢?
在这里插入图片描述
同样也是可以ping通,至此,我们测试iptables作为网络防火墙的准备工作便完成了

网络防火墙测试

我们之前提到,iptables作为网络防火墙,主要是负责"过滤和转发",这样一想,可能会用到filter表的FORWARD链,具体应该如何去配置呢?慢慢来看一下吧

filter表中的FORWARD链默认策略是ACCEPT,所以我们才能在开启核心转发后即能使主机A与主机B通信,现在我们想在FORWARD链上定义规则,为了安全起见,肯定会用到黑白名单机制,我们之前有了解,只要保持默认策略为ACCEPT,在链的末尾加一条拒绝所有报文的规则即可实现

现在,为FORWARD链加上这条规则

iptables -t filter -A FORWARD -j REJECT

配置了该规则之后,主机A与主机C便不能进行通信了,需要我们进一步配置规则完善防火墙;我们第一时间想到的,便是内部网络主机会提供的服务,例如sshd服务,我们需要在添加了拒绝所有报文的规则前增加什么规则才能正常访问内部网络主机C的sshd服务呢?在主机B配置规则如下

iptables -t filter -I FORWARD -s 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
在这里插入图片描述
现在再来看看能不能在主机C通过ssh执行主机A的命令

ssh -l root 192.168.200.115 "ls ~" 通过ssh执行主机A的命令,查看root用户的家目录内容
在这里插入图片描述
可以看到,并不能连接呢?我们已经放行了内部网络中目标端口为22的报文了呀

哦哦,我们还忘记了返回来的报文,之前只是开放了内部网络可以访问22端口的请求,回应的报文还是被拦下拒绝了,我们需要配置规则如下

iptables -I FORWARD -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT

上述规则即将一切发送到172.16网段的,并且源端口是22的报文放行,这样,22号端口内部网络发送的报文和发送到内部网络的报文都能通过iptables了
在这里插入图片描述
出现了输入密码提示,看来是能够通信的了

从这个例子我们能够看到,当iptables作为网络防火墙的时候,往往不在是简单的一条规则就能达到目的,我们还必须考虑双向性,那么此时,我们虽然能从内部网络访问外部网络的sshd服务,但是外部网络能通过主机B这个防火墙吗?答案很显然,不能,因为我们还没有制定规则放行内部网络回应外部网络主机的报文

那有没有一条规则保证服务连接双方的报文都能通过防火墙,不用特意去分别定义两条规则,可以的,规则如下

iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

我们使用之前使用的state扩展模块,将进行连接的服务响应的报文都一律放行,这样就不用特意去定义两条规则,只需要定义请求时的报文匹配规则就好了
【Iptables】iptables目录
【Iptables】12 Iptables动作总结之一(基础)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值