iptables之四扩展匹配及网络防火墙功能

一、开放被动模式的ftp服务

  如果想开放被动模式的ftp服务,大体上要通过连接追踪中的RELATED这么一个状态来实现,也就是说对于21号端口开放NEW和ESTSBLESHED。(命令连接一般是通过21号端口实现的),而对于数据连接由于它通过无法固定的模式时,工作在非固定的随机端口上,所以我们只需要检查这个连接的状态是否是RELATED的,如果是RELATED,无论入栈还是出栈统统给予放行即可。

  由此,要想开放被动模式的ftp服务大体上要三个步骤即可实现:

(1)、装载ftp追踪时专用的模块;(其实是叫RELATED状态追踪时的专用模块,只不过对于应用来讲,它也的确是专用ftp的)

  nf_conntrack_ftp是专门为ftp追踪RELATED连接的专用模块;

  需要注意的是有可能需要手动装载此模块;

(2)、放行请求报文;

  所有的数据连接都是那些连接状态为RELATED状态的连接,所以它的请求报文只跟21号命令连接相关,因为我们所有的ftp请求也一定是先跟命令连接先建立一个连接。

  命令连接:放行NEW、ESTABLISHED

  数据连接:放行RELATED、ESTABLISHED刚连接时即第一次请求时不叫NEW而叫RELATED,但是一旦连接建立起来所有的后续的通信也叫ESTABLISHED)

(3)、放行响应报文;

    ESTABLISHED

测试:

  先改ACCEPT再改规则,再看没有规则时访问是否有问题:

  保存此前规则:

  重新装载刚才保存的规则:

  刚才清空的主要目的就是为了测试ftp正常情况下我们不加防火墙规则是OK的。

  若加了防火墙规则若未放行ftp访问显然是访问不到的,此时放行ftp服务依然可以访问到:

 

 

  注意:在iptables使用领域当中,到此为止,至少说这已经可以达到中等规模的使用规格了。

 

二、保存或重载规则

  如何保存及重载规则?

保存规则至指定文件:

  iptables-save >/PATH/TO/SOMEFILE   (将需要保存的规则重定向并指明将当前内核中生效的规则保存在何处即可)

 

 

 

 

 

 

 

 

 

 

 

 

  这种保存方式对于某些系统来讲可能还有其他的用法:

 

    如CentOS 6可以使用service iptables save来保存,相当于执行iptables-save>/etc/sysconfig/iptables

 

从指定文件重载(重新载入)规则:

 

  iptables-restore < /PATH/TO/SOMEFILE

 

  而另外重载规则CentOS 6还可以使用:

 

    service iptables restart相当于iptables-restore < /etc/sysconfig/iptables(restart相当于把现有的规则全清了,然后把这个文件再读进来)

 

  但是对于CentOS 7来讲,它对于整个防火墙规则的管理,引入了一个新服务,即引入了新的iptables前端管理服务工具:firewalld。firewalld有很多工具单独使用:

 

    他有自己的专用命令叫firewalld-cmd,

 

    还有前端工具,基于图形的:firewalld-config

 

    而且在firewalld中,它将整个防火墙分为DMZ区、非军事化管理区等。

 

  firewalld首先它是以iptables为基础来生成规则的,来管理实现防火墙的,但它有引入了一些新概念,在有些环境中,比如像docker或openstack这样的云,无论是IAAS或PAAS云这样的环境中,它是的确有那么一定的作用的,的确引入了很多新概念。不过对于简单的本机防火墙的实现,其实firewalld目前来讲他肯定引入了新的机制会使得整个规则管理会更加复杂,为了使得在CentOS 6和CentOS 7上使用风格统一,我们不建议大家非得使用firewalld,可以仍然使用iptables。不过要在CentOS 7上使用iptables,得首先去禁用firewalld。如:

 

    禁用服务,关闭开机启动:

    关闭服务:

 

 

    发现规则已清空:

 

 

期望以后自己写的规则开机后能自动被重载:

 

    启动iptables服务:

 

    其实启动这个服务相当于使用:

 

 

    但如果此前禁用了iptables这个文件是不存在的,因为没有任何规则可以载入。

 

    即便是空规则,依然是可以保存的:

  保存后可以启动了:

  其实依然没有规则:

  /etc/sysconfig/iptables文件中生成的是默认规则:

 

 

  所以只有这么一个文件存在时,一般来讲,它在保存时才有真正的意义;

 

    这个服务脚本也能帮我们重启,而它重启的主要意义在于我们写的规则一旦保存下来后,而iptables设置为开机自动启动。即只要在2,3,4,5级别开机自启:

 

 

  这就意味着这些规则在启动时能够被载入,可以让其生效了。而从哪载入呢?默认情况下是通过/etc/rc.d/init.d/iptables这个服务脚本指明的:

    所以这就是为什么它是独立一个文件,保存也是默认保存在这个文件中,实际上是靠脚本来控制的。我们使用iptables-save时可以保存在任何我们所重写的文件中而未必是非得是这个文件,但这个脚本使用了这个文件。

    再次说明个,这个脚本不是启动任何服务,它虽然叫服务也支持start但没有启动任何进程,仅仅是让那些规则生效而已,但是除此之外这个服务脚本还有另外一个作用,比如我们让跟ftp相关的规则能够生效,还得去装载ftp相关的专用模块nf_controlc_ftp,而这个配置脚本是能够让我们在启动服务时自动把我们某些所需要的模块给装载进来的,那装载哪些模块?他依赖于这么一个配置文件:/etc/sysconfig/iptables-config

    如果想启动服务时自动装载nf_controlc_ftp,直接将其添加至IPTABLES_MODULES即可。启动时它会自动使用modprobe把这里给定的模块转载进来,如果有多个模块需要装入,中间使用空格分开即可。

    这是CentOS 6上使用的是iptables服务脚本,但它事实上没启动任何服务,再次提醒,仅仅是在内核中生效规则或从内核中清空规则的。

    那对CentOS 7而言,启动对CentOS 6兼容的服务:

    这也是使用类似的服务实现相应的功能的,不过可能是将iptables禁用了,不再启用了,我们自己去写一个iptables的Unit即可,将来用到的时候再用即可。

    对于iptables没有服务脚本是没有任何妨碍的;

 

若想去了解CentOS 7上的firewalld,可到如下地址了解:

 

三、构建网络防火墙

  我们前面演示和讲解的都是关于主机防火墙的,那我们要想将iptables这台主机扮演成网络防火墙怎么办呢?iptables FORWARD,更重要的是需要打开核心转发,而且我们在本机内部后端应该有内网中的其它主机,那因此为了演示效果,接下来我们构建这么一个拓扑来看看网络防火墙怎么实现。

 

 

  大体上,我们假设防火墙主机有两个接口,一个面向内网用户,一个面向外网主机。我们就以192.168.241这个网络作为外网,那另一边我们构建一个内网,添加第二块网卡,内部我们再添加一台虚拟机,这两个接口可以通过一个内部的虚拟通道像WMNET2或VMNET3,它们配置同一个地址并且第一个接口内网这个主机的接口它访问的网关应该指向网关的内网网卡地址。

 

    我们构建出这么一个网络模型出来,我们在防火墙主机上添加一些规则,看能不能用来实现外网主机对内网主机或内网主机对外网主机所有的报文的转发功能的实现,这个才称为网络防火墙。当然作为网络防火墙来讲,它内部应该有多个主机存在,网关都应该指向这台防火墙主机,这是我们所假设的模型,而且防火墙主机所接的外网使我们能够接入互联网或者接入外部网络的唯一接口才可以。当然将来也可以有多个接口甚至必要时还可以做负载均衡的。

 

    规划:内网主机网络使用192.168.20.0,网关使用192.168.20.1,外网主机192.168.241.7,外网网关192.168.241.6,内网主机192.168.20.2或192.168.20.3。

  说明:此处使用三台虚拟主机进行演示,CentOS 7作为网关,CentOS 6.5-i386作为内网主机,CentOS 6.5-x86_64作为外网主机。

 

 

 

具体实现:

 

   在CentOS 7上添加两块网卡:

 

  内网CentOS 6.5-i386主机:

 

  对于另一台主机CentOS 6.5-x86_64将其当做外网主机使用。

  再次说明,CentOS 6.5-x86_64是外网主机,CentOS 7是网关,CentOS 6.5-i386是内网主机。

 

  调整CentOS 7的地址:

    ping一下外网地址:

  调整内网主机CentOS 6.5-i386网络地址:

    添加默认网关:

  要想使用CentOS 7.1转发报文,需要打开其转发功能:

    此时没有打开转发,意味着要去ping其它主机是ping不通的,如CentOS 6.5-x86_64为例:

    使用CentOS 6.5-i386去ping 192.168.241.7不通:

    但是网关CentOS 7去ping192.168.241.7是可以通的:

    此时打开CentOS 7的转发功能:

    再使用CentOS 6.5-i386 ping依然不通:

    此时还是不通是因为,外网主机在收到报文后,发送响应报文时,因为外网主机与内网主机不在同一个网络中,外网主机需要发送报文给网关进行转发,而此时外网主机的网关设置为192.168.241.2因此响应报文无法响应给内网主机。此时可在外网主机添加一个路由解决:

    此时CentOS 6.5-i386:

    此时内外网都可以互相通信了!

  在内网主机上启动Web服务:

    外网主机访问Web服务,访问正常:

  添加防火墙规则控制访问这个Web服务:(在Cent OS 7上实现)

    分析:所有的转发都会经过本机的FORWARD链,此前的ping操作和Web请求都是通过FORWARD来转发的。

    现在要求只能访问内网主机的Web服务:

      一DROP外网的ping操作马上就不通了,Web也访问不到了:

    放行Web服务,要考虑请求和响应:

    此时外网主机可访问Web服务,但依然无法ping通:(因此有时候ping不通并不意味着对方主机不在线)

  放行SSH使得能够远程连接内网主机:

    此时优化这两条规则,假设一开始就知道需要放行SSH和Web服务:

    清空规则,重新建立:

    不允许内网主机访问外网,当然内网主机响应外网是可以的:(即只要允许请求进来就允许它出去)

    请求是从外网请求的:

    从外到内的所有已建立的连接都放行了,而内网主机假设都是服务器不可能主动连接别人(此处只是假设)。

    外网主机访问验证:

    那么到此实现的功能就是网络防火墙所实现的功能了!

 

假如内网主机安装有ftp服务器,如何开放它呢?

  CentOS 6.5-i386安装vsftpd;

  测试让网关自己去访问,访问正常,但外网主机无法访问:

  打开ftp访问的请求:

  外网主机测试访问:

当然,若想让规则永久有效,需要将规则保存下来,服务启动时自动装载即可!

posted @ 2019-04-15 15:58  LongMX  阅读(630)  评论(0编辑  收藏  举报