实验3:防火墙

1. 实验内容

        学习 Linux 系统下 Iptables 防火墙基本操作,配置 iptables 防火墙。

  1. 配置 Iptables 防火墙的包过滤规则,实现以下功能: 禁止所有 IP 主机 ping 某主机; 允许某 IP 主机远程 ping 另一主机; 允许每 10 秒钟通过 1 个 ping 包。
  2. 配置 NAT 转换,包括 SNAT 和 DNAT。
  3. 配置 SSH 登录规则,允许某远端客户机器 SSH 登录另一主机。

2. 实验要求

  1. 依据《防火墙实验报告》模板撰写实验报告,内容包括:实验内容、 实验原理、实验环境、实验步骤与实验结果、实验中出现的问题、原因和解决、 实验总结等。
  2. 介绍实验拓扑在内的实验环境;
  3. 编写防火墙规则,完成实验内容,对实验结果进行截图。 实验报告命名格式为:《防火墙》实验报告-学号-姓名。

3. 实验过程

步骤1:搭建网络拓扑图

        本次实验在网络安全虚拟仿真系统中完成,首先,登录后创建实例拓扑。

连接方式如上图,具体配置如下。

  • 外网服务器Win10:采用Win10_DoS_WebAttacker模板。
  • 防火墙网络配置如图。
  • 内网用户Centos:采用practice/Centos_7_x64_7.6

进行保存和部署。

       在初期搭建时,我将近端交换机替换为了路由器,因为在真正的网络环境中,是通过近端的路由器连入网络。但发现内网的用户没有本身的IP地址了,所以也ping不通外网服务器,最后重新按照老师的图进行的连接。在出现问题后,尝试过将防火前删除,路由器直接连到内网交换机,发现没有出现上述情况,所以可能是因为实验平台要求两台主机之间需要交换机相连,而在其中路由器和防火墙其实本质上还是两台主机。

        远程连接外网服务器和内网用户,密码均为Planet9Secret,互相发送ping请求,测试网络是否正常连接。

外网服务器->内网用户

内网用户->外网服务器

步骤2:禁止所有IP主机ping某主机

远程连接到防火墙,并以root身份登录。可以看到其防火墙实质是一个Ubuntu系统的主机。

查看iptables防火墙默认表中的所有列,可以看到没有任何的规则。

1
iptables -L

配置iptables

1
iptables -A FORWARD -d 11.0.24.157 -j DROP
  • -A FORWARD:在FORWARD链(转发数据过滤)中添加防火墙规则。
  • -d 11.0.24.157:匹配目标地址(内网用户),到改地址的icmp包都拦截。
  • -j DROP:匹配到的目标动作为丢弃数据包。

此时,通过外网服务器或者外网路由器尝试ping内网用户,发现请求超时。

        此处发现,如果通过内网用户ping外网服务器照样ping不通,其实是因为上面只添加了DROP规则,另外还需要添加FORWARD表的ACCEPT规则在DROP下面才能达到实验目的。

步骤3:允许某 IP 主机远程 ping 另一主机

iptables -F清除之前指定的规则。

1
2
3
iptables -A FORWARD -s 11.0.23.92 -d 11.0.24.157 -j ACCEPT
iptables -A FORWARD -d 11.0.24.157 -j DROP
iptables -L FORWARD --line-numbers
  • -s 11.0.23.93:匹配源地址(由外网服务器发出)。
  • -j ACCEPT: 允许数据包通过。

外网服务器和外网路由器再对内网用户尝试ping连通。可以看出,运行外网服务器ping通内网用户,而路由器则不能ping通内网用户。

外网服务器->内网用户

外网路由器->内网用户

步骤4:允许每 10 秒钟通过 1 个 ping 包

1
iptables -R FORWARD 1 -p icmp -s 11.0.23.92 -d 11.0.24.157 -j ACCEPT -m limit --limit 6/minute --limit-burst 1 
  • -R FORWARD 1:替换防火墙FORWARD链上的第一个规则。
  • -m limit:采用limit的match模块(未查到)。
  • --limit 6/minute:每分钟限制通过6个包。
  • --limit-burst:规则限制在第一个包就发生。

外网服务器->内网用户

可以看到防火墙设置的规则已经生效,其中-t参数是为了让其持续发icmp请求。

步骤5:配置 NAT 转换

首先,打开路由转发功能。

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

分别配置SNAT和DNAT。

1
2
iptables -t nat -A POSTROUTING -s 11.0.24.1/24 -o eth0 -j SNAT --to-source 11.0.23.92
iptables -t nat -A PREROUTING -s 11.0.24.1/24 -i eth1 -j DNAT --to-destination 11.0.24.157

查看nat表,可见配置成功。

1
iptables -t nat -L

步骤6:配置 SSH 登录规则

首先清除之前所有的规则iptables -F。在内网主机中开启并查看ssh-server服务,需要在root用户下开启。

1
2
service sshd start
ps -e|grep ssh

在外网服务器中查看是否安装了ssh程序。

首先,尝试用外网服务器ssh连接内网用户,可以看到能够正常连接。

1
ssh root@11.0.24.157 -p 22

设置防火墙,先拒绝所有的连接,可以看到无法连接。

1
iptables -A FORWARD -p tcp --dport 22 -j DROP

再设置插入允许特定主机的规则。

1
iptables -I FORWARD -p tcp -s 11.0.23.92 -j ACCEPT

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

  • 实验拓扑防火墙外网以路由器连入出现内网无IP:原因可能是因为实验平台不允许两台主机相连,而路由器和防火墙本质上都是主机,所以出现问题。根据老师的连接方法,将路由器换为交换机即可。
  • 步骤2中加入规则后出现双向ping不通,应该是单向:原因为在添加DROP规则后,应该还要添加单项的ACCEPT规则才能实现单向连通。
  • 配置SSH登录规则问题:首先,Win10和Linux系统下SSH语句是存在差异的,另外在实验中只能外网服务器Win10远程连接内网用户,因为Win10模板中没有安装OpenSSH服务端应用,且不能联网安装。

鸣谢❀参考大佬文章