名古屋 發表於 2023-5-26 00:00:00

Linux下双网卡Firewalld的配置流程(推荐)

<p>
        实验室拟态存储的项目需要通过lvs-nat模式通过lvs服务器来区隔内外网的服务,所以安全防护的重心则落在了lvs服务器之上。笔者最终选择通过firewalld放行端口的方式来实现需求,由于firewall与传统linux使用的iptable工具有不小的区别,接下来通过博客来记录一下firewalld的配置流程。</p>
<p>
        <span><strong>1.firewall服务的简介:</strong></span></p>
<p>
        firewalld提供了一个 动态管理的防火墙,用以支持不同网络区域的规则,分配对一个网络及其相关链接和界面一定程度的信任。它具备对 ipv4 和 ipv6 防火墙设置的支持。它支持以太网桥,并有分离运行时间和永久性配置选择。它还具备一个通向服务或者应用程序以直接增加防火墙规则的接口。</p>
<p>
        上述内容是来自rethat官方文档的说明,看起来不知所云。所以笔者在这里简单介绍一下firewalld的定位与传统的iptable存在什么样的不同:</p>
<ul>
<li>
                动态防火墙</li>
</ul>
<p>
        firewalld 提供的是动态的防火墙服务。配置的改变可以随时随地立刻执行,不再需要保存或者执行这些改变。而iptable的部分,每一个单独更改意味着要清除所有旧有的规则和从 里读取所有新的规则,相对来说firewalld的方式会更加灵活。</p>
<ul>
<li>
                区域隔离</li>
</ul>
<p>
        firewalld 提供了区域隔离的服务,也就是说类似于window之中的公共网络与内部网络的区别,可以通过不同的区域的配置对应的规则来实现不同的网络规则服务。通过区域规则的方式,可以让防火墙的工作更加的灵活。</p>
<p>
        如图所示,firewalld的防火墙本质上是建立在原生的iptable防火墙之上的抽象层,通过定制规则的方式来利用iptable的功能,所以两个防火墙是上下级并行工作的关系,最终都需要落地到内核之中的netfilter来实现网络包的过滤,来简化防火墙的工作流程。(传统iptable的“四表五链”实在是有够复杂~~囧rz)</p>
<p>
        <br><img title="Linux下双网卡Firewalld的配置流程(推荐)" alt="Linux下双网卡Firewalld的配置流程(推荐)" src="https://zhuji.jb51.net/uploads/img/20230519/9f1411d46c8b5e586f6a4723e34f9f65.jpg"></p>
<p>
        <span><strong>2.系统环境:</strong></span></p>
<p>
        如下图所示,这里需要在lvs的服务器需要部署firewall的防火墙,这里笔者仅简要梳理一下一台lvs服务器的工作:</p>
<p>
        <br><img title="Linux下双网卡Firewalld的配置流程(推荐)" alt="Linux下双网卡Firewalld的配置流程(推荐)" src="https://zhuji.jb51.net/uploads/img/20230519/a46f6040607a85bdc3b4dab2161415eb.jpg"></p>
<p>
        系统平台:centos 7</p>
<p>
        <strong>lvs服务器: 双网卡</strong></p>
<ul>
<li>
                外网地址:219.223.199.154</li>
        <li>
                内网地址:192.168.1.17</li>
</ul>
<p>
        <strong>对外服务器:</strong></p>
<ul>
<li>
                服务器a:192.168.1.11</li>
        <li>
                服务器b:192.168.1.14</li>
</ul>
<p>
        在这里,外网地址之上需要开放的端口为10086端口,通过该端口进行转发。而内网地址之上并不设置限制,我们认为是安全的网络环境。</p>
<p>
        <span><strong>3.配置流程:</strong></span></p>
<p>
        firewalld的配置可通过三种方式:</p>
<ul>
<li>
                firewall-config</li>
</ul>
<p>
        一个图形化的用户接口的配置工具</p>
<ul>
<li>
                firewall-cmd</li>
</ul>
<p>
        一个命令行的用户接口的配置工具</p>
<ul>
<li>
                静态xml文件配置</li>
</ul>
<p>
        firewalld 的配置设定存储在/etc/firewalld/ 目录下的 xml 文件里。可以通过查看和编辑这些 xml 文件,来实现firewall的配置。</p>
<p>
        之后笔者的配置流程主要是基于firewall-cmd命令展开,首先启动firewall服务:</p>
<div>
        <div>
                <div id="highlighter_579074">
                        <div>
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
                                                        <div>
                                                                1</div>
                                                </td>
                                                <td>
                                                        <div>
                                                                <div>
                                                                        <code>systemctl start firewalld.service </code><code>//</code><code>启动firewalld服务</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        接下来,开放外网网卡的对应的tcp端口,这里笔者选择public区域,也就是双网卡同时开放端口。</p>
<div>
        <div>
                <div id="highlighter_21241">
                        <div>
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
                                                        <div>
                                                                1</div>
                                                </td>
                                                <td>
                                                        <div>
                                                                <div>
                                                                        <code>firewall-cmd --zone=public --add-port=10086</code><code>/tcp</code> <code>--permanent</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        该命令的配置了public区域添加10086的端口,后续的参数--permannet则代表永久添加。也就是一次写入,后续重启之后依然生效。在firewall之中支持如下不同的区域区隔与过滤规则,之后不同的配置可以参考下面的内容:</p>
<p>
        <strong>区域</strong></p>
<div>
        <div>
                <div id="highlighter_643058">
                        <div>
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
                                                        <div>
                                                                1</div>
                                                        <div>
                                                                2</div>
                                                        <div>
                                                                3</div>
                                                        <div>
                                                                4</div>
                                                        <div>
                                                                5</div>
                                                        <div>
                                                                6</div>
                                                        <div>
                                                                7</div>
                                                        <div>
                                                                8</div>
                                                        <div>
                                                                9</div>
                                                </td>
                                                <td>
                                                        <div>
                                                                <div>
                                                                        <code>drop: 丢弃所有进入的包,而不给出任何响应</code>
</div>
                                                                <div>
                                                                        <code>block: 拒绝所有外部发起的连接,允许内部发起的连接</code>
</div>
                                                                <div>
                                                                        <code>public: 允许指定的进入连接</code>
</div>
                                                                <div>
                                                                        <code>external: 同上,对伪装的进入连接,一般用于路由转发</code>
</div>
                                                                <div>
                                                                        <code>dmz: 允许受限制的进入连接</code>
</div>
                                                                <div>
                                                                        <code>work: 允许受信任的计算机被限制的进入连接,类似 workgroup</code>
</div>
                                                                <div>
                                                                        <code>home: 同上,类似 homegroup</code>
</div>
                                                                <div>
                                                                        <code>internal: 同上,范围针对所有互联网用户</code>
</div>
                                                                <div>
                                                                        <code>trusted: 信任所有连接</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        过滤规则</p>
<div>
        <div>
                <div id="highlighter_255889">
                        <div>
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
                                                        <div>
                                                                1</div>
                                                        <div>
                                                                2</div>
                                                        <div>
                                                                3</div>
                                                        <div>
                                                                4</div>
                                                        <div>
                                                                5</div>
                                                        <div>
                                                                6</div>
                                                        <div>
                                                                7</div>
                                                        <div>
                                                                8</div>
                                                </td>
                                                <td>
                                                        <div>
                                                                <div>
                                                                        <code>source</code><code>: 根据源地址过滤</code>
</div>
                                                                <div>
                                                                        <code>interface: 根据网卡过滤</code>
</div>
                                                                <div>
                                                                        <code>service: 根据服务名过滤</code>
</div>
                                                                <div>
                                                                        <code>port: 根据端口过滤</code>
</div>
                                                                <div>
                                                                        <code>icmp-block: icmp 报文过滤,按照 icmp 类型配置</code>
</div>
                                                                <div>
                                                                        <code>masquerade: ip 地址伪装</code>
</div>
                                                                <div>
                                                                        <code>forward-port: 端口转发</code>
</div>
                                                                <div>
                                                                        <code>rule: 自定义规则</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        之后通过lvs配置好下图是通过ipvsadm配置好的转发机制:<br></p>
<p>
        通过外网尝试连接外网的ip地址,219.223.199.154:10086,发现并无法联通后端服务器的服务,也就是运行在192.168.1.11与192.168.1.14的服务器。</p>
<p>
        调用ipvsadm -lcn命令之后,发现内网的转发出现了问题:</p>
<p>
        <img title="Linux下双网卡Firewalld的配置流程(推荐)" alt="Linux下双网卡Firewalld的配置流程(推荐)" src="https://zhuji.jb51.net/uploads/img/20230519/419bfcebe035caaaf7f869081613e77a.jpg"></p>
<p>
        通过抓包发现lvs服务器在内网网卡192.168.1.17上的通信包被拦截,于是继续通过firewalld-cmd命令开发内网网卡的端口,将内网网卡加入trusted区域:</p>
<div>
        <div>
                <div id="highlighter_141459">
                        <div>
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
                                                        <div>
                                                                1</div>
                                                </td>
                                                <td>
                                                        <div>
                                                                <div>
                                                                        <code>firewall-cmd --zone=trusted --add-interface=enp3s0</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        接下来可以看到开放了对应内网网卡到trusted,trusted区域允许所有通信包放行,因为内网是相对安全的环境,所以并不存在很大的影响,调用:</p>
<div>
        <div>
                <div id="highlighter_576108">
                        <div>
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
                                                        <div>
                                                                1</div>
                                                </td>
                                                <td>
                                                        <div>
                                                                <div>
                                                                        <code>firewall-cmd --list-all-zones</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        命令展示firewall的配置结果,public与trusted区域都出于active状态,外网服务能够正常连接内网的端口服务了。</p>
<p>
        <img title="Linux下双网卡Firewalld的配置流程(推荐)" alt="Linux下双网卡Firewalld的配置流程(推荐)" src="https://zhuji.jb51.net/uploads/img/20230519/a95e54dbe7bcedac0ddfd6e74891b76d.jpg"></p>
<p>
        可以看到上述public的设置之中涉及到了对应的ssh服务于dhcpv6-client的服务,在firewalld之中是可以直接通过服务来放行对应的内容,也就是上文参数service,详细的配置参数需要在目录/usr/lib/firewalld/services之中进行配置,我们尝试打开上文ssh服务的内容:</p>
<p>
        <br><img title="Linux下双网卡Firewalld的配置流程(推荐)" alt="Linux下双网卡Firewalld的配置流程(推荐)" src="https://zhuji.jb51.net/uploads/img/20230519/8de5187c82434ddde19d7f363c4fb3a7.jpg"></p>
<p>
        由上文的配置内容可见:所谓的服务配置防火墙,本身也是通过标注协议与端口的方式进行的,只不过是用服务的逻辑进行包装了。至于使用哪种形式,各位见仁见智了。</p>
<p>
        <span><strong>小结</strong></span></p>
<p>
        梳理了一下在lvs下双网卡firewalld的配置流程。debian系列的发行版也是大同小异,只不过firewalld工具需要自行使用apt-get进行安装。上述内容若有疏漏,望各位指点斧正。</p>
<p>
        原文链接:https://www.cnblogs.com/happenlee/archive/2018/04/24/8928843.html</p>
頁: [1]
查看完整版本: Linux下双网卡Firewalld的配置流程(推荐)