linux防火墙部署与配置-编程思维

Linux防火墙部署与配置

1. 实验概述

Linux作为网关,搭建小型局域网,在此基础上进行实验,了解Linux防火墙的构成、NAT和包过滤配置方法等。

2. 实验环境

网络大致结构如图2-1所示,由centos虚拟机作为防火墙,实现NAT和包过滤等功能,两台ubuntu作为内网服务器,kali作为外网的客户端。

图2-1 拓扑结构

3. 实验原理

3.1 防火墙

防火墙是建立在两个网络的边界上的实现安全策略和网络通信监控的系统或系统组,强制执行对内部网和外部网的访问控制。通过建立一整套规则和策略来监测、限制、更改跨越防火墙的数据流,达到保护内部网络的目的。

简单来说,防火墙作为网关,可以检测进出局域网边界的所有数据包,并通过一些手段检测和处理这些数据包内的信息,达到保护局域网边界内部的所有设备的目的。

对于防火墙,其能实现的最基本的两个技术就是NAT和包过滤,NAT建立内外网络地址的映射,向外界隐藏内部的真实IP地址,包过滤对数据包进行检查和过滤,实现了信息安全。

3.2 Netfilter

Netfilter是Linux内核中的一个重要框架,它允许实现对网络流量的各种操作,采用一组hook实现了包过滤、NAT和端口转换等相关功能。其组织架构分为三层,使用表来定义规则,而规则在表内被组织在链中。

Netfilter主要内置了三张表,其中filter表实现数据包的过滤,NAT表用于网络地址转换,mangle表用于包的重构。

对于不同的表,Netfilter中有先后顺序,分别为

security --> raw --> mangle --> nat --> filter

图3.2-1 Netfilter结构

更详细地说,Netfilter模块内数据流向大致如图3.2-2所示。

图3.2-2 Netfilter数据流向

3.3 IPtables

IPtables是软件包iptables提供的命令行工具,其位于用户态空间,允许管理员配置内核防火墙的表。

iptables的命令格式为:

iptables [-t 表名] -子命令 [链名] 匹配条件 目标动作

其中 -t table指定配置的表格,表格有五个,分别为mangle、nat、filter、raw、security,其中前三个使用最多。

常用子命令及用途如图3.3-1。

图3.3-1 子命令

常见的匹配条件如图3.3-2所示。

图3.3-2 匹配条件

动作如图3.3-3。

图3.3-3 目标动作

3.4 NAT

局域网内数据包传送路径为

  • 先经过 NAT table 的 PREROUTING 链;
  • 经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;
  • 再经过 Filter table 的 FORWARD 链;
  • 通过 NAT table 的 POSTROUTING 链,最后传送出去

如果要使用iptables实现NAT,需要修改NAT table的PREROUTING 链和POSTROUTING 链,其中POSTROUTING 链修改来源IP,即SNAT,而PREROUTING 链修改目的IP,即DNAT

实验过程

4.1 小型局域网搭建与验证

首先在VMware虚拟网络编辑器中添加两个仅主机模式的虚拟适配器VMnet0和VMnet1。

图4.1-1 添加虚拟适配器

在centos上添加两个网卡,作为局域网网卡,分别连接这两个虚拟适配器。保留原来的NAT网卡作为外部网卡。

图4.1-2 防火墙网卡设置

在两个ubuntu系统中将网卡分别连接到VMnet0和VMnet1。并将网关设置分别为10.10.10.1和10.10.20.1,再使用ping测试连通性。

sudo route add default gw 10.10.20.1 ens33

图4.1-3 10.10.10.2 ping 10.10.10.1

在centos设置允许转发。

sysctl -w net.ipv4.ip_forward=1

sysctl net.ipv4.ip_forward

图4.1-4 查询是否设置成功

安装iptables和firewalld

yum install -y iptables

yum install iptables-services

yum install firewalld firewall-config

打开iptables服务

systemctl start firewalld

systemctl start iptables

查看是否成功打开。

systemctl status firewalld iptables

图4.1-5 查询是否设置成功

设置10.10.*.*到10.10.*.*的转发,允许局域网内互相通信。并ping测试是否联通。

iptables -I FORWARD -s 10.10.0.0/16 -d 10.10.0.0/16 -j ACCEPT

图4.1-6 10.10.10.2 ping 10.10.20.2

这样说明小型局域网搭建成功,局域网内可以通信了。

在centos使用wireshark在任一个内部网卡上抓包可以看到ICMP报文。

图4.1-7 wireshark捕获

4.2 SNAT实现内网设备访问外网与验证

在4.1节中,只实现了内网环境内IP为10.10.*.*的设备之间的通信,但所有的设备仍然无法实现对外部的访问,在这里可以使用nat 实现IP地址的转换。

在centos使用以下实现SNAT,修改源IP,将10.10.*.*的所有报文转发到自己的IP为192.168.137.133的网卡。再使用ping测试连通性。

iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -j SNAT --to 192.168.137.133

图4.2-1 ping kali 192.168.137.128

使用wireshark在内网网卡上捕获,可以看到10.10.20.2到192.168.137.128之间的ICMP报文。

图4.2-2 内网网卡捕获

在外网网卡重新捕获,这里将10.10.20.2改为了192.168.137.133。对kali来说是192.168.137.133的IP地址与其进行通信,实现了NAT地址翻译。

图4.2-3 外网网卡捕获

4.3 DNAT实现外网访问内网设备

在centos将外部发送给192.168.137.133的流量全部转发给10.10.10.2,实现一对一DNAT。

iptables -t nat -A PREROUTING -d 192.168.137.133 -j DNAT --to-destination 10.10.10.2

在192.168.137.128 ping 192.168.137.133。

图4.3-1 192.168.137.128 ping 192.168.137.133

在centos上使用wireshark查看10.10.10.1对应的网卡流量,发现有192.168.137.128到10.10.10.2的ICMP报文,说明将192.168.137.133映射到了10.10.10.2。

图4.3-2 wireshark捕获

4.4 包过滤

在centos使用

iptables -t filter -A FORWARD -p icmp --icmp-type 8 -s 0/0 -j REJECT

禁止外部ping内部设备。

这里有一点需要注意,根据图3.2-2,如果是需要转发的报文(4.3中进行了DNAT映射),其不会经过filter表的INPUT链,需要在filter表的FORWARD链进行拦截,配置规则后ping显示Destination Port Unreachable。

在wireshark中查看内网网卡,不会再有192.168.137.128到10.10.10.2的ICMP报文,而在外部网卡存在192.168.137.128到192.168.137.133的ICMP报文,说明防火墙接收到了ICMP报文但是执行了过滤,没有进行转发。

图4.4-1 ping失败

图4.4-2 捕获内部网卡

图4.4-3 捕获外部网卡

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/muling1m/p/17051574.html

linux常用命令-编程思维

最近都在和Linux打交道,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。我将我了解到的命令列举一下,仅供大家参考: 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) una

误删 /user/bin目录后的补救-编程思维

当危险的动作发生, 误删 /user/bin目录后的补救   以下是昨天晚上真实的误操作现场,模拟记录一下 (这是测试环境,所以操作得很随意,有些执行动作很不规范)   在上面编译一个软件Dboop,完事以后想把它做个软链到 /usr/bin sudo - su cd /usr/local/dboop/bin/ cp 

nacos2.x集群+nginx配置-编程思维

架构图 下载nacos安装包 从github上下载相应的安装包,现在是2022-11-04,最新稳定版本是2.1.2 修改配置 解压后,进入conf文件夹 因为本次使用mysql,所以使用mysql-schema.sql进行创建表 修改application.properties 注意:mysql 8.0.

linux添加环境变量-编程思维

以JAVA_HOME为例 用户登录时,会依次加载/etc/profile,/home/.bash_profile,其中/etc/profile文件末尾会遍历/etc/profile.d/*.sh, 方式一: vim /etc/profile在最后添加内容. export JAVA_HOME=/root/jdk1.8

systemctl-编程思维

脚本存放路径 systemctl脚本存放在:/usr/lib/systemd/ 有系统(system)和用户(user)之分 像需要开机不登陆就能运行的程序,就将程序存在系统服务里,即:/usr/lib/systemd/system 目录下。 该目录下的服务有以service结尾的,也有target结尾的。 se