Linux主机防火墙构建iptables的使用

时间:2024-04-06 12:15:12

2.1.1.选题说明
本课设主要使用 Linux 的 iptables 软件完成两类主机防火墙的设计和实现工作,包括了iptables包过滤,iptables状态检测,iptables NAT转换。
2.1.2系统功能
(1) 使用 iptables 实现主机路由包过滤,实现对协议、服务端口和网络接口入、出方向的可控。
(2) 使用 iptables 实现对新建的网络会话进行状态检测,对已建的网络会话进行状态检测,设置默认策略为 DROP,添加规则开放 FTP 服务和 WWW服务,并允许远程用户上传文件至 FTP 服务器,能够访问 WWW 主页。
(3) 清空 filter 表规则链内容,并设置 filter 表 INPUT、FORWARD 和 OUTPUT规则链,默认策略为禁止。添加 filter 表新规则,允许来自内网的数据流进入外网,并允许任何返回流量回到内网。
(4) 继续设置 iptables 规则通过 NAT 屏蔽内部网络拓扑结构,实现数据包从内网到外网的源地址转换。
(5) 继续设置 iptables 规则通过 NAT 实现端口重定向,实现 80/tcp 请求数据从外网到内网的地址转换。
(6) 继续设置 iptables 规则允许内网访问外网的 WWW 服务。
2.1.3知识背景

  1. iptables 简介
    iptables 只是一个内核包过滤的工具,iptables 可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正来执行这些过滤规则的是 netfilter(Linux 内核中一个通用架构)及其相关模块(如 iptables 模块和 nat 模块)。netfilter 提供了一系列的“表(tables)”,每个表由若干“链(chains)”组成,而每条链中有一条或数条规则(rule)组成。我们可以这样来理解,netfilter 是表的容器,表是链的容器,链又是规则的容器。netfilter 系统缺省的表为“filter”,该表中包含了 INPUT、FORWARD 和 OUTPUT3个链。每一条链中可以有一条或数条规则,每一条规则都是这样定义的“如果数据包头符合这样的条件,就这样处理这个数据包”。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件:如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据不符合该链中任一条规则的话,系统就会根据预先定义的策略(policy)来处理该数据包。数据包在 filter 表中的流程如图 3-1 所示。有数据包进入系统时,系统首先根据路由表决定将数据包发给哪一条链,则可能有三种情况:
    (1) 如果数据包的目的地址是本机,则系统将数据包送往 INPUT 链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
    (2) 如果数据包的目的地址不是本机,也就是说,这个包将被转发,则系统将数据包送往 FORWARD 链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
    (3) 如果数据包是由本地系统进程产生的,则系统将其送往 OUTPUT 链,如果通过规则检查,则该包被发给相应的本地进程处理;如果没有通过规则检查,系统就会将这个包丢掉。
    当我们在使用 iptables NAT 功能的时候,我们所使用的表不再是“filter”表,而是“nat”表,所以我们必须使用“-t nat”选项来显式地指明。因为系统缺省的表是“filter”,所以在使用 filter 功能时,我们没有必要显式的指明“-t filter”。同“filter”表一样,nat 表也有三条缺省的链,这三条链也是规则的容器,分别是:
    (1) PREROUTING:可以在这里定义进行目的 NAT 的规则,因为路由器进行路由时只检查数据包的目的 IP 地址,为了使数据包得以正确路由,我们必须在路由之前就进行目的 NAT。
    (2) POSTROUTING:可以在这里定义进行源 NAT 的规则,在路由器进行路由之后才进行源 NAT。
    (3) OUTPUT:定义对本地产生的数据包的目的 NAT 规则。
    2.状态检测概念
    “状态”的意思是指如果一个数据包是对先前从防火墙发出去的包的回复,则防火墙自动不用检查任何规则就立即允许该数据包进入并返回给请求者,这样就不用设置许多规则定义就可实现应用的功能。我们可以把请求端与应答端之间建立的网络通信连接称为网络会话,每个网络会话都包括以下信息——源 IP 地址、目标 IP 地址、源端口、目的端口,称为套接字对;协议类型、连接状态(TCP 协议)和超时时间等。防火墙把这些信息称为状态(stateful)。状态包过滤防火墙能在内存中维护一个跟踪状态的表,比简单的包过滤防火墙具有更大的安全性,而 iptables 就是一种基于状态的防火墙。命令格式如下:
    iptables -mstate --state [!]state[,state,state,state]
    其中,state 表是一个由逗号分割的列表,用来指定连接状态,状态分为 4 种:
    (1) NEW:该包想要建立一个新的连接(重新连接或连接重定向)。
    (2) RELATED:该包是属于某个已经建立的连接所建立的新连接。举例:FTP 的数据传输连接和控制连接之间就是 RELATED 关系。
    (3) ESTABLISHED:该包属于某个已经建立的连接。
    (4) INVALID:该包不匹配于任何连接,通常这些包被 DROP
  2. NAT工作原理
    NAT 的基本思想是为每个企业分配一个 IP 地址(或者是很少几个)来进行 Internet 传输。在企业内部,每个电脑取得一唯一的 IP 地址来为内部传输做路由。然而,当封包离开企业,进入 ISP 之后,就需要进行地址转换了。为了使这个方案可行,IP 地址的范围被声明为私有的,企业可以随意在内部使用他们。仅有的规则是,没有包含这些地址的封包出现在 Internet 上。
    IP 私 有 地 址 范 围 是 : 10.0.0.0 ~ 10.255.255.255/8 、 172.16.0.0 ~172.31.255.255/12、192.168.0.0~192.168.255.255/16。
    3.2实验环境
    VMware® Workstation 15 Pro;Linux操作系统Centos。
    3.3系统设计与实现
  3. 末端数据包访问控制场景
    a) 安装完成 A、B 两台 Linux 主机(推荐 centos 系统,server with GUI, 在 wmware 中安装,每台主机单网卡)

b) 完成 A、B 两台 Linux 主机的基础配置:设置 ip 地址,添加非管理员账号,安装 telnet 服务,ftp 服务,http 服务,安装 NMAP 软件,安装 SNORT 软件
(1)配置ip地址:
Alice:192.168.227.131 255.255.255.0
Bob:192.168.227.130 255.255.255.0
Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用

(2)添加非管理员账号

Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用

(3)配置telnet
Alice:
Linux主机防火墙构建iptables的使用

Linux主机防火墙构建iptables的使用

Bob:
Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用

**xinetd服务:
Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用

(4)启动ftp服务:

Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用

(5)启动http服务:

Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用

(6)安装 NMAP 软件
已经安装,查看版本:
Linux主机防火墙构建iptables的使用

(7)安装 SNORT 软件(已经安装,查看版本)
Linux主机防火墙构建iptables的使用

c) 在主机 A 通过 iptables 软件实现包过滤功能,具体表现为:

  1. 将 iptablesfilter 链表的所有链规则清空,并设置链表默认策 略:为 DROP(禁止);

Linux主机防火墙构建iptables的使用

2)主机 A 使用 nmap 工具对本主机进行端口扫描,给出主机 当前提供的服务列表;
Linux主机防火墙构建iptables的使用

3)主机 B 用 nmap 对当前主机进行端口扫描,查看扫描结果,并利用 ping 命令进行连通性测试;

Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用

4)在主机 A,利用功能扩展命令选项(ICMP)设置防火墙仅允许ICMP 回显请求及回显应答,并利用 ping 指令测试主机 A、B 间的连通性;
Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用

5)在主机 A,通过 iptables 命令对外开放 Web 服务(默认端口80/tcp),在主机 B 利用 nmap 对当前主机进行端口扫描,查看扫描结果;
Linux主机防火墙构建iptables的使用
Linux主机防火墙构建iptables的使用

  1. 在主机 A,通过 iptables 命令设置防火墙允许来自 eth0(假 设 eth0 为内部网络接口)的任何数据通过,在主机 B 利用 nmap 对当前主机进行端口扫描,查看扫描结果;
    Linux主机防火墙构建iptables的使用

d) 清空 filter 规则链全部内容,设置全部链表默认规则为允许,然后在 主机 A 设置 iptabls 命令实现数据包状态检测,具体表现为:

  1. 对新建的网络会话进行状态检测,设置规则禁止任何新建连接通过。对当前主机防火墙规则进行测试,验证规则正确性。在主机 B 对当前主机防火墙规则进行测试,验证规则正确性。
    清空规则链表:
    Linux主机防火墙构建iptables的使用

设置全部链表默认规则为允许
Linux主机防火墙构建iptables的使用

置规则禁止任何新建连接通过
Linux主机防火墙构建iptables的使用

主机B ping 主机A,发现无法ping通
Linux主机防火墙构建iptables的使用

  1. 清空 filter 规则链全部内容,并设置默认规则为允许。主机 B 首先 telnet 远程登录当前主机,当出现“login:”界面时,暂停登录操作。
    Linux主机防火墙构建iptables的使用

暂停登录操作:
Linux主机防火墙构建iptables的使用

  1. 主机 A 通过 IPTables 命令添加新规则(状态检测)——仅禁止新建网络会话请求。主机 B 继续执行登录操作,尝试输 入登录用户名及口令,验证登录是否成功。主机 B 启动 Web 浏览器访问当前主机 Web 服务,访问是否成功。对结果进 行解释。
    Linux主机防火墙构建iptables的使用

主机B进行登录操作,输入密码alice:
Linux主机防火墙构建iptables的使用

登录成功
启动web服务器,访问主机A的界面发现不成功
(添加的iptables命令仅对新建会话连接起到阻塞作用,对属于已建立会话连接的数据包不起作用,而telnet会话是已建连接,所以login是可以成功的,而web界面访问主机A的IP地址为建立一个新的tcp连接,故而不成功)
4) 删除上一步添加的规则,主机 B 重新 telnet 远程登录当前 主机,当出现“login:”界面时,暂停登录操作。
删除上一条规则
Linux主机防火墙构建iptables的使用

主机 B 重新 telnet 远程登录当前 主机,当出现“login:”界面时,暂停登录操作
Linux主机防火墙构建iptables的使用

  1. 在主机 A 通过设置 IPTables 命令添加新规则(状态检测)— —仅禁止已建网络会话请求。
    Linux主机防火墙构建iptables的使用

    1. 主机 B 继续执行登录操作,验证登录是否成功;
      Linux主机防火墙构建iptables的使用

登录失败
7) 主机 B 启动 Web 浏览器访问主机 A Web 服务,验证访问是否成功;
不成功
8) 对结果现象进行解释。
添加的规则只对已建立的会话有阻塞作用,这一题中的Telnet是已建立的会话,而web访问虽然是新建立的会话, 但web访问仍然不成功,因为上一步对new 进行drop的时候,已经用http访问过这一地址了,它认为是已有连接了,所以访问仍然不成功。如果第一次new的原则中不使用http来测试,这一步才能够成功。
9) 主机 A 再次清空 filter 链表规则,并通过 iptables 命令设置 默认策略为 DROP,添加规则开放 FTP 服务,并允许远程用户 上传文件至 FTP 服务器。
主机A的配置如下:
Linux主机防火墙构建iptables的使用

bob上传test文件,并查看目录验证

  1. 主机 B 主机尝试上传文件至主机 A,验证是否成功。
    在主机A查看主机B上传的test文件
    Linux主机防火墙构建iptables的使用
    Linux主机防火墙构建iptables的使用
  1. Linux 防火墙实现内外网隔离与网络地址转换场景
    a) 安装完成 A、B、C 三台 Linux 主机(推荐 centos 系统,server with GUI,在 wmware 中安装,A、C 主机单网卡,B 双网卡)
    b) 角色分配:其中主机 A 和主机 B 的 eth0 模拟内网,主机 C 和主机 B 的 eth1 模拟外网,如下图。
    内网主机 A 与 NAT 服务器 B 的 eth0 接口位于同一网段(内网);外网 主机 C 与 NAT 服务器 B 的 eth1 接口位于同一网络(外网);NAT 服务 器提供 NAT 转换。通过设置 NAT 服务器的 IPTables NAT 规则,实现 内、外网主机间的通信数据包的地址转换,达到屏蔽内部网络拓扑 结构与转发外网主机请求端口的目的(端口重定向)。
    c) 完成 A、B、C 三台 Linux 主机的基础配置:设置 ip 地址,添加非管理员账号,安装 telnet 服务,ftp 服务,http 服务,安装 NMAP 软件,安装SNORT软件,所有主机需重置IPTables(命令:service IPTables restart)。其中:
  1. 默认内网IP地址192.168.0.0/24、外网IP地址202.98.0.0/24。 配置完成内网主机 eth0 接口 IP 地址及默认网关(指向 NAT 服务器内网接口),NAT 服务器 eth0 和 eth1 接口 IP 地址, 外网主机 eth0 接口 IP 地址,并记录内网主机 IP 是,其默认网关,外网主机 IP,NAT 服务器内网接口 IP,外网接口 IP。
    配置NAT服务器:
    Linux主机防火墙构建iptables的使用

配置主机A(alice):
Linux主机防火墙构建iptables的使用

配置主机B(bob)
Linux主机防火墙构建iptables的使用

  1. 内网主机添加静态 ARP 缓存表项目。 NAT 服务器作为内网主机访问外网的唯一的安全网关,其 IP 与 MAC 地址应被绑定到内网主机的 ARP 缓存表中,防止内 网主机遭受 ARP 欺骗、IP 欺骗等网络行为,添加 ARP 静态 表项命令如下: arp -s NAT 服务器内网接口 IP NAT 服务器内网接口 MAC 例如,NAT 服务器内网接口的 IP 地址为 192.168.0.50,MAC 地址为 aa:bb:cc:dd:ee:ff,则添加静态表项的命令为 arp -s 192.168.0.50 aa:bb:cc:dd:ee:ff。
    给主机A(alice)配置arp
    Linux主机防火墙构建iptables的使用

  2. 内网主机对 NAT 服务器内网接口进行连通性测试(ping); 外网主机对 NAT 服务器外网接口进行连通性测试(ping)。
    主机A(alice)ping NAT服务器(mid)的eth0接口
    Linux主机防火墙构建iptables的使用

主机B(bob)ping NAT服务器(mid)的eth1接口
Linux主机防火墙构建iptables的使用

d) NAT 服务器设置 IPTables 规则允许内部网络访问外部网络 》 1

  1. NAT 服务器开启路由功能。基于安全的考虑,默认情况下 Linux 路由数据包的功能是关闭的,通过下述命令开启系统 路由功能: echo 1 > /proc/sys/net/ipv4/ip_forward
    Linux主机防火墙构建iptables的使用

  2. 清空 filter 表规则链内容,并设置 filter 表 INPUT、FORWARD 和 OUTPUT 规则链,默认策略为禁止。
    Linux主机防火墙构建iptables的使用

  3. 添加 filter 表新规则,允许来自内网的数据流进入外网,并 允许任何返回流量回到内网(即实现 NAT 服务器内部网络 接口 eth0 与外部网络接口 eth1 间的数据转发)。这样的 IPTables 命令是什么?
    Linux主机防火墙构建iptables的使用
    Linux主机防火墙构建iptables的使用

  4. 外 网 主 机 启 动 snort ( /opt/ExpNIC/FireWallv*nLab/Tools/ids/snort)以网络嗅探方式运行(设置过滤器仅监 听 icmp 数据包),snort 命令如下: snort -dev icmp 内网主机 ping 探测外网主机,是否 ping 通?描述 snort 捕 获数据现象。
    无法ping通
    Linux主机防火墙构建iptables的使用

抓不到包,因为未给外网主机B(bob)配置默认网关
Linux主机防火墙构建iptables的使用

  1. 外网主机的默认网关指向 NAT 服务器的外网接口 eth1,内 网主机再次 ping 探测外网主机,是否 ping 通?外网主机停 止 snort 监听(Ctrl+C),观察捕获到的 ICMP 请求数据,其 源 IP 地址是什么?,结合先前实验现象,说明原因。
    配置主机B(bob)的默认网关为NAT服务器的eth1接口
    Linux主机防火墙构建iptables的使用

可以ping通,观察到源地址为192.168.227.131,未做地址转换
Linux主机防火墙构建iptables的使用

e) NAT 服务器设置 IPTables 规则通过 NAT 屏蔽内部网络拓扑结构。在 上一步操作基础上

  1. NAT 服务器继续添加 nat 表新规则,通过网络地址转换实现 内网主机访问外网。这样的 IPTables 命令是什么?
    Linux主机防火墙构建iptables的使用

  2. 外网主机将默认网关指为空,并重新启动 snort 捕获 ICMP 数据。内网主机对外网主机进行 ping 探测,是否 ping 通? 外网主机停止 snort 监听,观察所捕获到 ICMP 请求数据, 其源 IP 地址是什么?解释观察到的现象。
    将默认网关设置为空:
    Linux主机防火墙构建iptables的使用

可以Ping通:
Linux主机防火墙构建iptables的使用

可以观察到此时捕获到的数据包中的源地址已经改变为了NAT服务器的网关地址:
Linux主机防火墙构建iptables的使用

源ip是服务器外网接口ip,由于NAT服务器对来自内网主机的数据包做了SNAT,即替换数据包源IP地址为外网接口IP,然后再将转换后的数据包发送到外网中,变成了外网的包,不用bob设网管也能收到。同样的在接收到应答包时,对数据包进行反向转换,即替换数据包的目的IP地址为内网主机IP,然后再将反向转换后的数据包发送到内网中 。
f) 设 IPTables 规则通过 NAT 实现端口重定向。继续在上一步基础上:

  1. 添加 nat 表新规则,实现 80/tcp 请求数据从外网到内网的 地址转换。这样的 IPTables 命令是什么?

Linux主机防火墙构建iptables的使用

  1. 使用 IPTables 命令完成 NAT 外网接口 eth1 到内网接口 eth0 之间的数据转发
    Linux主机防火墙构建iptables的使用

  2. NAT 服务器停止本机 Web 服务,具体命令如下: service httpd stop
    Linux主机防火墙构建iptables的使用

  3. 确定外网主机 C 默认网关指为空,内、外网主机 A、C 均启 动 snort,捕获目的端口为 80/tcp 的数据包;外网主机 C 启 动 Web 浏览器,在地址栏中输入:http://NAT 服务器外网接 口 IP,在成功访问到 Web 页面后,观察 snort 捕获数据,
    命令为:snort -dev tcp and dst port 80
    Linux主机防火墙构建iptables的使用

回答下列问题:
外网主机观察80/tcp会话的源、目的IP地址对是什么?
Linux主机防火墙构建iptables的使用

目的地址是192.168.227.128,即NAT服务器外网接口的IP地址
源地址没有进行改变,还是bob的IP地址
内网主机观察80/tcp会话的源、目的IP地址对是什么?。
Linux主机防火墙构建iptables的使用

目的IP地址为alice主机的IP地址,说明NAT服务器进行了转换
源地址不变,仍为bob的IP地址
外网主机所访问 Web 页面来源哪台主机?
来源于内网主机A(alice)
解释上述现象。
外网主机无法知道内网主机ip,只知道外网接口ip,因此捕获的目的地址ip是外网网关地址,源ip是外网主机。而对于内网主机,由于进行了NAT转换,所以目的地址为内网主机的IP地址,源地址不变。
g) 允许 NAT 服务器访问外网主机提供的 Web 服务。

  1. 首先思考以下问题并做出解答:前面的步骤里,filter 表的 INPUT 和 OUTPUT 规则链默认策略始终为 DROP(禁止数据 包流入和流出),而步骤中也没有为这两个链表进行任何操作,为什么内、外网主机间访问还会成功?
    因为NAT服务器起到路由的功能,只是转发数据包, 只关系到forward链,不进行接收的发包

  2. NAT 服务器启动 Web 浏览器,访问外网主机 Web 服务,是否成功?
    不成功,超时
    Linux主机防火墙构建iptables的使用

  3. 添加 filter 表新规则,仅允许 NAT 服务器本地数据访问外网主机Web服务(80/tcp)。这样的 IPTables 命令是什么?

Linux主机防火墙构建iptables的使用

  1. NAT 服务器再次访问外网主机 Web 服务,是否成功?回答 上面的思考问题。
    Linux主机防火墙构建iptables的使用

3.4项目分析总结
通过在Linux系统下实际动手设置防火墙的过滤条件,对书本上的理论知识有了更深的理解。对Linux的操作也进行了复习,在真正使用环境中进行网络配置,了解了防火墙工作原理,掌握了防火墙功能的配置实现,熟悉了 iptables 工作原理,能够灵活运用 iptables 命令及规则。同时了解了包过滤、网络地址转换的概念与配置实现。对各个链的实际含义有了更深入的了解,理论与实践相结合的方法让我对这防火墙这里的知识理解更深了。
值得注意的是,在网络中的主机B(bob)和主机C(darth)的网卡设置,其中darth的两个网卡均需要重新配置,而主机B需要将网卡配置为NAT,更改eth2为eth0即可完成整个网络的连接。