【项目实践】使用GNS3模拟三层架构中小型企业组网
原帖地址:https://q1uki.xyz/2026/02/28/gns3/
安装GNS3
-
安装教程:https://blog.csdn.net/qq_63855540/article/details/147834429
(gns3默认的终端难看,建议换个自己习惯的,比如mobaxterm)
-
虚拟化环境报错:https://henchat.net/win11-24h2-vmware-error-intel-vt-x-ept/
-
一直在
waiting http://local:3080:https://tieba.baidu.com/p/6059085630cmd下执行以下两行命令,然后重启
netstat -anb
netsh winsock reset -
思科镜像1:https://github.com/hegdepavankumar/Cisco-Images-for-GNS3-and-EVE-NG
要求
题目要求为200名员工的中型企业设计一个具有安全防护功能的网络架构,公司有销售、开发、管理三个部门,需要提供内网远程访问,DMZ托管web、邮箱、DNS服务器。网络架构使用三层结构:核心(core),汇聚(distribute),接入(access),使用两个及以上三层交换机。设计适当的VLAN、IP范围。内/外部防火墙,路由器,交换机做安全配置和访问控制。接入端包括员工设备和访客AP。用虚拟机网络配置模拟云端,使用kali接入模拟公网攻击者,进行安全测试。
网络设计

其实用冗余设计来满足题目要求更好,但由于时间限制,这里只设计并实现了由两个三层交换机分别作为核心、汇聚层的结构。虽然一个三层交换机也能同时承担核心和汇聚功能,但分开来能提高处理效率,也更符合现实需求。核心层专注于高速、可靠地转发数据,部署在中心机房(比如学校网络中心),而汇聚层负责汇聚多台二层交换机(接入层)的流量,给VLAN做路由,能启用ACL(Access Control List,访问控制)控制VLAN的访问权限,部署在分属的机房(比如宿舍楼的总机房)。
三层解析参考:https://libai.blog.csdn.net/article/details/151764710
在安全设计上,这里使用三脚防火墙three-legged firewall的架构,DMZ交换机直接连接在防火墙上,使得内网与DMZ之间的通信被防火墙保护。但会使得内部主机访问DMZ 服务性能下降,因为要经过防火墙才能访问。此外还有双防火墙方案,外部防火墙用于过滤从公网进入的流量,内部防火墙保护DMZ和内部网络之间的通信。

防火墙结构设计参考:https://www.firewall.cx/networking/network-fundamentals/firewall-topologies-dmz-zone.html
DMZ,Demilitarized Zone,是一个用来部署供内外网访问的服务器的隔离区,因为部署的服务要面对外部不可信流量,所以它也受到“污染”,变得不可信,而同时它也要为内部网络提供服务。为了将内外网流量安全隔离开来,外网流量无法直接穿透服务器抵达内网,就需要使用DMZ,即使DMZ中的服务器被攻破,也无法直接横向移动到内网。

设备选择(镜像坑)
-
Cloud
我这里在本机上模拟公网,实际上并不与真实互联网互通。在vmware的虚拟网络编辑器里选择一个vmnet,设置为仅主机模式,自己设置一个子网ip给它。给gns3 vm添加一个网卡,接入这个vmnet,我还使用kali模拟公网的入侵者,所以给kali也接入这个vmnet。
-
外部防火墙
pfsense同时满足外部路由器和防火墙的功能,VPN配置方便。在官网上下载pfsense镜像,从edit>preferences>Qemu VMs中新建一个虚拟机,将下载的镜像导入,没有截图的部分默认即可。
![image-20260226172820597]()
![image-20260226195830148]()
![image-20260226195854827]()
给2G RAM,否则运行不了。
![image-20260226200040540]()
选择下载的镜像。
![image-20260226195919337]()
根据自己需要修改接口数量:
![image-20260226203626568]()
-
L3交换机(core、distribution-switch)
选择c3725-adventerprisek9- mz.124-15.T14镜像,在IOS routers导入。
因为要求启用安全防护功能,找了很多L3交换机都没有这个功能,所以用c3725路由器来模拟L3交换机。参考:https://blog.csdn.net/woay2008/article/details/124045710
![image-20260226215100488]()
-
L2交换机(DMZ交换机、sales/dev/mgmt/guest-switch、访客AP)
选择viosl2-adventerprisek9-m.ssa.high-iron-20200929镜像,跟pfsense类似,在QEMU VM中导入,设置全都默认。
访客AP也用L2交换机模拟。
-
DMZ服务器
DMZ中的服务器全都使用docker:python:3-alpine。
(因为我用各个服务的docker镜像都遇到各种问题)
在docker containers里new,选择new image,输入上述docker名即可。
![image-20260227221904540]()
-
用户PC
因为要测试网络连通性和调用DMZ服务,用了一个有网络工具的docker。docker:praqma/network-multitool
-
配置pfsense的浏览器
pfsense有web端,为了方便配置,拉一台机器出来连上pfsense。选docker:jlesage/firefox
![image-20260227225105902]()
注意项:镜像不一定有你想要的功能,多换几个试试
网段划分
-
关键IP
pfsense:10.0.254.1
核心L3 f1/1:10.0.254.2
核心L3 f1/0:10.0.253.2
汇聚L3:10.0.253.1
-
DMZ
vlan 99
子网:10.0.99.0/24
网关(pfsense与dmz连接的接口e3):10.0.99.1
web:10.0.99.10
dns:10.0.99.20
mail:10.0.99.30
-
销售部
vlan 10
子网:10.0.10.0/24
网关(汇聚L3与销售部交换机的接口):10.0.10.2
保留地址:10.0.10.1-10.0.10.10
DHCP池:10.0.10.10-10.0.10.254
-
开发部
vlan 20
子网:10.0.20.0/24
网关(汇聚L3与开发部交换机的接口):10.0.20.2
保留地址:10.0.20.1-10.0.20.10
DHCP池:10.0.20.10-10.0.20.254
-
管理部
vlan 30
子网:10.0.30.0/24
网关(汇聚L3与管理部交换机的接口):10.0.30.2
保留地址:10.0.30.1-10.0.30.10
DHCP池:10.0.30.10-10.0.30.254
-
访客wifi
vlan 50
子网:10.0.50.0/24
网关(汇聚L3与访客交换机的接口):10.0.50.2
保留地址:10.0.50.1-10.0.50.10
DHCP池:10.0.50.10-10.0.50.254
-
OpenVPN(pfsense上配置)
子网:10.0.8.0/24
配置二层交换机(L2)
分配vlan,连通三层交换机和用户终端:
enable
conf t
vlan xx
exit
interface 上级接口
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan xx
no shut
exit
interface 下级接口
switchport mode access
switchport access vlan xx
no shut
end
wr mem
若二层要加上arp防护:(先关闭option 82)
enable
conf t
vlan xx
exit
(no ip dhcp snooping information option)
ip dhcp snooping
ip dhcp snooping vlan xx
ip arp inspection vlan xx
interface 上级接口
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan xx
ip dhcp snooping trust
ip arp inspection trust
no shut
exit
interface 下级接口
switchport mode access
switchport access vlan xx
no shut
end
wr mem
检查arp防护设置,设置正确会类似下图:


配置汇聚三层交换机(distribution L3)
配置与核心L3的连接:
conf t
interface f1/0
no switchport
ip address 10.0.253.1 255.255.255.0
no shutdown
exit
! 默认路由指向核心交换机
ip route 0.0.0.0 0.0.0.0 10.0.253.2
创建vlan:
! 新建vlan xx (比如vlan 10)
enable
conf t
vlan 10
exit
! 给vlan 10 分配地址
interface vlan 10
ip address 10.0.10.2 255.255.255.0
no shutdown ! 启用
exit
! 给指定接口放行vlan 10
interface 下级接口 ! 不确定名字的话在该设备设置里看
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 10
no shut
end
wr mem
配置DHCP:
enable
conf t
ip routing
ip dhcp excluded-address 10.0.10.1 10.0.10.10
ip dhcp pool VLAN10
network 10.0.10.0 255.255.255.0
default-router 10.0.10.2
dns-server 10.0.99.20
lease 7
end
wr mem
! 检查DHCP状态
show ip dhcp binding
show ip dhcp pool
ACL:
ip access-list extended GUEST_IN
! DNS
permit udp 10.0.50.0 0.0.0.255 host 10.0.99.20 eq 53
permit tcp 10.0.50.0 0.0.0.255 host 10.0.99.20 eq 53
! Web
permit tcp 10.0.50.0 0.0.0.255 host 10.0.99.80 eq 80
! Mailhog(按实际端口)
permit tcp 10.0.50.0 0.0.0.255 host 10.0.99.30 eq 1025
permit tcp 10.0.50.0 0.0.0.255 host 10.0.99.30 eq 8025
! 禁止访问其它10/8内部网段
deny ip 10.0.50.0 0.0.0.255 10.0.0.0 0.255.255.255
! 允许出网
permit ip 10.0.50.0 0.0.0.255 any
interface vlan 50
ip access-group GUEST_IN in
配置核心三层交换机(core L3)
enable
conf t
! 开启路由功能
ip routing
! 配置连接 pfSense 的接口 (f1/1)
interface f1/1
no switchport
ip address 10.0.254.2 255.255.255.0
no shutdown
exit
! 配置连接 汇聚L3 的接口 (f1/0)
interface f1/0
no switchport
ip address 10.0.253.2 255.255.255.0
no shutdown
exit
配置静态路由:
! 默认路由,所有去往外部的数据包都给pfSense
ip route 0.0.0.0 0.0.0.0 10.0.254.1
! 回程路由,所有去往内网的数据包都给汇聚L3
ip route 10.0.10.0 255.255.255.0 10.0.253.1
ip route 10.0.20.0 255.255.255.0 10.0.253.1
ip route 10.0.30.0 255.255.255.0 10.0.253.1
ip route 10.0.50.0 255.255.255.0 10.0.253.1
end
wr mem
内网连通测试
用户PC获取ip:
ip link set eth0 up
udhcpc -i eth0 -v
成功拿到ip示例:

都获取了ip之后互相ping一下测试能否连通。
在交换机上ping其他设备,显示“!”才是通了
配置pfsense
拉一个firefox镜像出来连上pfsense,如果关闭这个firefox设备再开启它,端口会被占用没法打开网页,需要删掉这个设备重新拉出来连接。
firefox拉出来之后是没有ip的,要在VMware的gns3 vm里,进入firefox docker的shell设置:
docker ps
docker exec -it <容器ID或名字> sh
ip addr add 192.168.1.10/24 dev eth0
ip route add default via 192.168.1.1

System -> Routing -> Static Routes:添加一条静态路由:将内网网段 10.0.0.0/16的下一跳(Gateway)指向核心交换机的接口 IP:10.0.254.2
配置DMZ服务器
-
web服务器
拖出来之后双击进设置,填start command,启动设备时web服务也随之启动。
sh -lc "ip addr add 10.0.99.10/24 dev eth0; ip link set eth0 up; ip route replace default via 10.0.99.1; mkdir -p /srv/www; echo 'DMZ WEB OK' > /srv/www/index.html; cd /srv/www; exec python3 -m http.server 80 --bind 0.0.0.0"![image-20260227230459947]()
-
DNS服务器
接Cloud上一个能访问公网的接口下载
ip link set eth0 up udhcpc -i eth0 ip route apk update apk add dnsmasq bind-tools接dmz交换机,这里在编辑配置文件并启动服务:
ip link set eth0 up ip addr add 10.0.99.20/24 dev eth0 ip route replace default via 10.0.99.1 cat > /etc/dnsmasq.conf <<'EOF' port=53 listen-address=10.0.99.20 bind-interfaces domain=dmz.local address=/web.dmz.local/10.0.99.10 address=/mail.dmz.local/10.0.99.30 EOF dnsmasq -k -C /etc/dnsmasq.conf各客户端测试命令:
dig @10.0.99.20 web.dmz.local dig @10.0.99.20 mail.dmz.local -
Mail服务器
接Cloud上一个能访问公网的接口下载:
ip link set eth0 up udhcpc -i eth0 apk update apk add ca-certificates wget wget -O /usr/local/bin/MailHog https://github.com/mailhog/MailHog/releases/latest/download/MailHog_linux_amd64 chmod +x /usr/local/bin/MailHog /usr/local/bin/MailHog -h接DMZ:
ip link set eth0 up ip addr add 10.0.99.30/24 dev eth0 ip route replace default via 10.0.99.1 /usr/local/bin/MailHog测试:
nc -vz 10.0.99.30 1025 nc -vz 10.0.99.30 8025
奇怪的错误
gns3开久了会出现明明配置没错,却死活打不通的情况,可以在连线上右键抓包检查。有时候网线(两个设备间连的线)连着但实际上断了,设备网口抽风了,等等。遇事不决重启一下gns3,节省很多时间。(调DHCP时调了大半天最后重启好了,气疯了)
改进
- 汇聚和分发交换机只有一个,流量都通过一个三层交换机转发,性能上受限制,存在单点故障风险(一个坏了全都宕机),如果时间足够的话,应该实现一个冗余结构。在真实的冗余架构中,汇聚层通常会有两台三层交换机,通过配置 HSRP(热备份路由器协议) 或 VRRP(虚拟路由器冗余协议) 虚拟出一个统一的网关 IP(如 10.0.10.1)。这样当一台汇聚交换机宕机时,另一台会瞬间接管网关,用户端完全无感知。
- 虽然实现了一些安全设置,但非常基本,只能满足学习和实验的需要,实际应用中要采用IDS等高级检测防御系统。
本文来自博客园,作者:q1uki,关注python自动化,爬虫,协议分析与逆向,隐匿通信,网络发现与资产扫描,正在入坑逆向工程,转载请注明原文链接:https://www.cnblogs.com/q1uki/p/19649536










浙公网安备 33010602011771号