防火墙课堂实验

实验目的

1.学习iptables防火墙基本操作。

2.设置iptables防火墙的包过滤规则,分别实现以下功能:

(1)禁止所有主机ping本地主机;

(2)仅允许某特定IP主机ping本地主机;

(3)允许每10秒钟通过1个ping包;

(4)阻断来自某个mac地址的数据包。

3.设置iptables规则,实现特定远端主机SSH连接本地主机

实验环境

1.配置防火墙的虚拟机:kali

2.验证防火墙功能的虚拟机:ubuntu

3.软件:iptables

4.Windows平台SSH工具:putty

(网络连接均设置为仅主机模式)

实验过程与结果

步骤一:查看主机信息并实现ping通

1.kali终端输入“ifconfig”,可知IP地址为192.168.32.129

图1

2.ubuntu终端输入“ifconfig”,可知IP地址为192.168.32.130

图2

3.kali ping通ubuntu。

图3

4.ubuntu ping通kali。

图4

步骤二:设置iptables防火墙的包过滤规则

1.在kali终端输入以下命令,禁止所有主机ping本地主机。

1
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT

图5

2.此时再次在ubuntu中尝试ping kali发现无法ping通。

图6

3.在kali终端输入以下命令,仅允许指定ip地址的ubuntu主机ping主机kali。

1
sudo iptables -I INPUT -p icmp -s 192.168.32.130 -j ACCEPT

图7

4.此时ubuntu就又能ping通kali了。

图8

5.为了保证两条规则的先后顺序,首先输入sudo iptables -F清空全部规则,再输入sudo iptables -I INPUT -p icmp -m limit –limjit 6/min –limit-burst 1 -j ACCEPT命令加入允许每十秒通过一个ping包的规则,最后再加入禁止任何主机ping本地主机的规则,保证每十秒一个ping包的规则优先于后者。

1
2
3
sudo iptables -F
sudo iptables -I INPUT -p icmp -m limit --limit 6/min --limit-burst 1 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT

图9

6.此时利用sudo iptables -L查看规则列表如下图所示,ACCEPT优先于REJECT。

1
sudo iptables -L

图10

7.设置完成后,此时ubuntu ping kali,每十秒成功发送一个ping包,其余时间无法ping通。

图11

8.再次清空iptables规则后,在kali终端输入sudo iptables -I INPUT -p icmp -m mac –mac-source 00:0c:29:71:1d:82 -j DROP,阻断来自ubuntu的Mac地址00:0c:29:71:1d:82的数据包。

1
2
sudo iptables -F
sudo iptables -I INPUT -p icmp -m mac --mac-source 00:0c:29:6d:cc:fd -j DROP

图12

9.查看此时的规则列表如下,只有一条DROP规则。

图13

10.此时ubuntu 无法ping通kali了。

图14

步骤三:实现特定远端主机SSH连接本地主机

1.在kali终端分别执行sudo /etc/init.d/ssh startsudo /etc/init.d/ssh status命令,启动kali的SSH服务并查看ssh服务器状态,使得客户端可以通过22端口连接。

1
2
sudo /etc/init.d/ssh start
sudo /etc/init.d/ssh status

图15

2.在ubuntu终端输入ssh kali@192.168.32.129,ubuntu客户端SSH连接服务器kali。

图16

3.在windows 11主机命令行中也输入ssh kali@192.168.32.129,主机客户端SSH连接服务器kali。

图17

4.在kali终端再次查看ssh服务器状态,发现SSH服务器上留下记录,两个客户端成功连接服务器。

1
sudo journalctl -u ssh -f

图18

图19

5.再次清空iptables规则后,在kali终端输入sudo iptables -I INPUT -p tcp –dport 22 -s 192.168.32.130 -j ACCEPT允许远端主机ubuntu进行SSH连接,再输入sudo iptables -A INPUT -p tcp –dport 22 -j DROP禁止其他远端主机SSH连接。

1
2
3
sudo iptables -F
sudo iptables -I INPUT -p tcp --dport 22 -s 192.168.32.130 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP

图20

6.在iptables中允许连接的客户端1ubuntu仍可远程SSH连接。

图21

7.客户端2本机windows 11已经无法连接,显示“client_loop: send disconnect: Connection reset”。

图22

实验总结

在本次关于iptables防火墙配置的实验中,我深入学习了iptables这一Linux核心安全工具的基本操作与原理知识。iptables作为Linux系统中用于配置IPv4数据包过滤规则、实现网络地址转换(NAT)以及管理数据包队列的强大工具,其价值在于允许用户通过定义精细的规则集,主动控制网络数据包的流向与处理方式,从而构建起灵活而有效的网络安全策略,实现包括端口控制、访问限制及防御网络攻击在内的多种功能。

实验过程中,我首先熟悉了iptables的基本命令结构,包括对INPUT、FORWARD、OUTPUT等链的操作。随后,我着手设置具体的包过滤规则以完成一系列预定目标。首要任务是掌握如何限制ICMP协议,我们通过添加规则,将所有传入的ICMP回显请求包(即ping请求)丢弃,从而实现了禁止所有主机ping通本地主机的效果,这让我直观地理解了防火墙如何基于协议类型进行访问控制。

在此基础上,实验进一步提升了规则的精确性。我学习了如何使用-s参数指定源IP地址,通过设置一条允许特定IP主机ping的规则,并确保其位于默认的禁止规则之前,成功实现了仅允许该授权主机进行ping操作,而其他任何主机的请求均被阻断。这一正一反的规则设置,深刻体现了iptables规则顺序的重要性以及“白名单”策略的实现方法。

为了应对更复杂的流量整形需求,我们尝试使用了limit模块。通过配置-m limit –limit 6/minute(即每分钟6个,约合每10秒1个)这样的参数,我们实现了对ICMP请求的频率限制。当 ping 包的到来速率超过此阈值时,超出的请求会被自动丢弃。这个实验环节让我认识到,iptables不仅能够进行简单的“允许”或“拒绝”判断,还能对流量速率进行智能管理,这对于缓解网络洪泛攻击等场景具有实用意义。

此外,我们还探索了基于数据链路层信息的过滤方式,即根据源MAC地址来阻断数据包。这通过-m mac –mac-source参数实现,尽管MAC地址过滤在跨路由器的场景下作用有限,但它让我了解到防火墙规则可以作用于网络模型的不同层次,为局域网内的安全控制提供了另一种手段。

最后,实验的重点转向了应用层的访问控制,即管理SSH远程连接。我们通过添加规则,允许来自特定远端IP地址的TCP 22端口连接,同时可以配置默认策略拒绝其他所有SSH连接尝试。这个过程巩固了我对基于端口和状态(如新建连接)进行过滤的理解,这是保障服务器远程管理安全的基础。

总而言之,本次实验不仅让我熟悉了iptables的各种命令参数和规则链概念,更重要的是通过亲手实践,使我清晰地认识到如何将理论上的安全策略转化为具体、可执行的防火墙规则。iptables的高度可定制性确实使其成为Linux系统网络管理与安全防御中不可或缺的利器。通过这次实践,我初步具备了利用iptables构建基础主机防火墙的能力,并对网络数据包的流动与控制有了更为具象化的认识。

防火墙课后实验

实验目的

设置iptables规则,实现内网服务的发布:

1.配置网络环境,测试网络连通情况。

2.开启防火墙路由转发,设置iptables规则。

3.验证公网主机能否通过访问防火墙获得内网服务。

实验环境

1.两台虚拟机:一台配置防火墙、一台作为内网服务器

2.需一台虚拟机或物理主机作为公网主机

3.了解实验场景:假设PC2不能直接访问局域网内的电脑PC1上的服务,但PC2可以与firewall上的公网IP:192.168.2.254相互通讯,由此可以进行NAT的设置,让PC2访问firewall的公网地址上的服务,再由firewall对数据进行处理,将访问请求发送到内网PC1上。

图1

实验过程与结果

步骤一:配置网络环境

1.首先给作为配置防火墙的主机ubuntu增设网卡,并设置两张网卡在不同的网络中。

(1)ifconfig查看ubuntu的IP地址。

图2

图3

(2)查看PC1(windows XP)的IP地址

图4

(3)查看PC2(windows 10)的IP地址

图5

2.由上图可知,网关的配置入下:

(1)内网IP:10.21.227.244,子网掩码:255.255.128.0

(2)公网IP:192.168.32.132,子网掩码:255.255.255.0

3.然后设置PC1(windows XP)的网络适配器,与firewall网络适配器ens33处于一个网段(Vmnet0)。

图6

4.设置PC2(windows 10)的网络适配器,与firewall网络适配器ens37处于一个网段(Vmnet1)。

图7

5.点击“开始”按钮找到控制面板,点击进入“网络和Internet-网络连接”,设置PC1的网关为firewall。

图8

图9

图10

步骤二:测试网络连通性

1.PC1 windows xp和firewall kali可以互相ping通。

(1)PC1 ping通firewall。

图11

(2)firewall ping通PC1。

图12

2.PC2 windows 10和firewall kali可以互相ping通。

(1)PC2 ping通firewall。

图13

(2)firewall ping通PC2。

图14

3.PC1 windows XP和PC2 windows 10无法互ping。

(1)PC1 ping不通PC2。

图15

(2)PC2 ping不通PC1。

图16

步骤三:开启防火墙的路由转发,设置NAT规则

1.在ubuntu终端输入以下命令,开启firewall的路由转发。

1
echo 1 > /proc/sys/net/ipv4/ip_forward

图17

2.在ubuntu终端输入以下命令,对公网来的访问数据设置DNAT规则,将其访问目标地址通过NAT修改由原ip(firewall)为提供服务的ip(PC1),以便将请求转发到内网对应IP上。

1
iptables -t nat -A PREROUTING -i ens37 -p tcp -d 192.168.32.132 --dport 80 -j DNAT --to-destination 10.21.156.73

图18

3.在ubuntu终端输入以下命令,设置一条SNAT的规则,以便内网对公网数据访问的回应信息能够到达请求的客户。

1
iptables -t nat -A POSTROUTING -o ens37 -p tcp -j SNAT --to-source 192.168.32.132

图19

4.在ubuntu终端输入以下两条命令,在FORWARD链上设置允许PC1 windows xp访问内网的规则。

1
2
iptables -A FORWARD -i ens37 -p tcp -d 10.21.156.73 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -m state --state established,related -j ACCEPT

图20

步骤四:PC1启动nginx开启http服务,PC2验证通过firewall访问内网服务

1.解压nginx-1.1.0文件夹后放在C盘下。

图21

2.在命令行中进入nginx-1.1.0文件夹后,输入“start nginx”命令,启动PC1的nginx开启http服务。

图22

3.在PC1中打开任务管理器查看进程,可以找到nginx.exe进程,说明nginx服务启动成功。

图23

4.在PC2中打开浏览器访问firewall的外网ip地址192.168.32.132,看到如图所示的nginx欢迎页面即为通过firewall的ip访问内网主机服务成功。

图24

步骤五:解释上述iptables规则并分析NAT的实现原理

1.开启firewall的路由转发

1
echo 1 > /proc/sys/net/ipv4/ip_forward

所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。

出于安全考虑,Linux系统默认是禁止数据包转发的。默认/proc/sys/net/ipv4/ip_forward该文件内容为0,即表示禁止数据包转发。1表示允许数据包转发,故使用echo 1 > /proc/sys/net/ipv4/ip_forward修改文件内容,将其内容修改为1,即开启firewall的路由转发。

2.首先了解局域网内封包的传送过程:

(1)先经过NAT table的PREROUTING链;

(2)经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;

(3)再经过Filter table的FORWARD链;

(4)通过NAT table的POSTROUTING链,最后传送出去。

3.对公网来的访问数据设置DNAT规则:

1
iptables -t nat -A PREROUTING -i ens37 -p tcp -d 192.168.32.132 --dport 80 -j DNAT --to-destination 10.21.156.73

(1)PREROUTING:在进行路由判断之前所要进行的规则。

(2)-A:在规则链的末尾加入新的规则。

(3)DNAT:目标地址转换,能够让外网用户访问局域网内不同的服务器。

本条规则即表示将ens37网段(外网)上发送给firewall(ubuntu)的包的目标地址在路由前就由firewall(ubuntu)的IP地址转换为HTTP服务器PC1(windows XP)的IP地址。

4.设置一条SNAT的规则:

1
iptables -t nat -A POSTROUTING -o ens37 -p tcp -j SNAT --to-source 192.168.32.132

(1)POSTROUTING:在进行路由判断之后所要进行的规则。

(2)-A:在规则链的末尾加入新的规则。

(3)-p:匹配协议,如TCP、UDP、ICMP。

(4)SNAT:源地址转换,能够让多个内网用户通过一个外网地址上网。

本条规则即表示将ens37网段(外网)上发出的包的源地址在路由前就由firewall(ubuntu)在ens33(内网)的IP地址转换为ens37(外网)的ip地址。

5.在FORWARD链上设置允许访问内网的规则:

1
2
iptables -A FORWARD -i ens37 -p tcp -d 10.21.156.73 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -m state --state established,related -j ACCEPT

网络防火墙的主要职责是“过滤并转发”,在五链中只有INPUT、OUTPUT和FORWARD有filter(过滤)功能,要想实现转发,报文必须经过FORWARD链。因此,iptables的角色变为”网络防火墙”时,规则只能定义在FORWARD链。

第一条是网段ens37(外网)上发送给firewall的包都由HTTP服务器PC1(windows XP)的80端口接收,第二条是允许基础转发。

6.NAT的实现原理:

(1)NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”。它是一个IETF标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。

图25

(2)NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。

(3)参考本次实验中的场景:

图26

如上图所示,NAT网关(firewall-ubuntu)有两个网络端口,其中外网(ens37)端口的IP地址为192.168.32.132,内网(ens33)端口的IP地址为10.21.227.244。

当外网的IP包目的IP为192.168.32.132时这个IP包就会经过NAT网关,NAY Gateway会将该IP包的目的地址转换为HTTP服务器的IP地址并转发至内网。此时的IP包(Dst=10.21.156.73,Src=10.21.227.244)中已经不含任何外网IP的信息,HTTP Server发出的响应IP包(Dst=10.21.227.244,Src=10.21.156.73)将被发送到NAT Gateway。

这时,NAT Gateway会将IP包的目的IP转换为外网中的主机IP并转发至外网。此时的IP包(Dst=192.168.32.131,Src=192.168.32.132)中则已经不含任何内网IP的信息。

至此,对于通信双方PC1和PC2而言,这种地址的转换过程是完全透明的。

实验中出现的问题、原因和解决

问题一

问题:firewall ping不通PC2 win10

原因:windows 10的Windows Defender防火墙没有关闭。

解决办法:

(1)在windows 10虚拟机中找到我的电脑,右键选择“属性”。

图27

(2)在属性中选择“控制面板主页”进入控制面板。

图28

(3)选择“系统和安全-Windows防火墙”。

图29

图30

(4)在左侧“启用或关闭Windows防火墙”中关闭专用网络和公用网络下的Windows防火墙。

图31

图32

(5)关闭windows10防火墙后即可ping通。

问题二

问题:firewall ubuntu和PC1 windows XP不能互相ping通。

原因:在设置PC1网关为ubuntu时,“使用下面的IP地址”中填写的IP地址是原XP的IP地址,并非加入网段vmnet0后的IP地址。

解决办法:

(1)首先将windows XP虚拟机网络连接模式修改回NAT连接模式,然后重新将其加入网段vmnet0,本地连接属性也修改回“自动获得IP地址”。

图33

(2)此时再使用ipconfig命令查看PC1的IP地址,可知加入网段vmnet0后PC2的IP地址为10.21.156.73。

(3)然后再修改本地连接中Internet协议的属性为“使用下面的IP地址”,其中IP地址为PC1加入网段vmnet0后的IP地址10.21.156.73,子网掩码和默认网关为ubuntu内网的子网掩码和IP地址。

图34

(4)修改完成后即成功设置好PC1,PC1和firewall可以实现ping通。

图35

PC1(windows xp)ping通firewall(ubuntu)

图36

firewall(ubuntu)ping通PC1(windows xp)

实验总结

本次实验让我对iptables防火墙的工作原理有了更深入的理解。我成功设置了iptables规则,实现了内网服务的发布。通过实践,我认识到iptables作为工作在网络层的防火墙,通过内核层面的netfilter来处理TCP/IP数据包,这种机制确实具有很高的效率和稳定性。

在实验过程中,我首先配置了网络环境,确保各个节点之间的连通性。我特别注意到了防火墙路由转发的设置,这是实现服务发布的关键步骤。通过精心设计iptables规则,我实现了数据包的正确转发和地址转换。

最让我有成就感的是,当我在公网主机上访问防火墙的公网IP时,成功获得了内网服务器提供的服务。这个结果验证了我的配置是正确的,也让我切实感受到了防火墙在网络中的重要作用。通过DNAT和SNAT的配合使用,我实现了在保护内网安全的同时,又能让外部用户访问内网服务。

通过这次实验,我不仅掌握了iptables的具体配置方法,更重要的是理解了防火墙策略的设计思路。我认识到,一个合理的防火墙配置既要保证服务的可用性,又要确保网络的安全性,这需要在实践中不断摸索和优化。这次实验为我后续学习更复杂的网络安全管理打下了坚实的基础。