防火墙配置与使用

防火墙配置与使用

实验目的

  • 进行防火墙的配置与使用,理解防火墙的原理规则等

实验先修知识

  • iptables基本命令使用

    iptables -h #简易帮助
    iptables [-t表名] <-L> [链名] #查看iptables规则
    #–[-t表名],查看哪个表的规则列表
    #–-L,查看指定表指定链的规则列表
    #–链名,查看指定表中哪个链的规则链表
    iptables -L -n -t filter -v #查看iptales的三个链(转发链,input和output链
    iptables.rules #查看防护墙配置规则
    iptables-restore <iptables.rules #iptables-restore命令用来还原iptables-save命令所备份的iptables配置。
    ssh 172.16.111.1 -vv#查看ssh服务
    
  • iptables核心指令格式

    iptables [-t 表] 命令 匹配 操作
    

    其中表选项,指定命令应用于哪个内置表(filter表、nat表或mangle表),命令选项则如表8-1所示,匹配选项如表8-2所示,动作选项为表8-3所示,

    命令说明
    -P或–policy <链名>定义默认策略
    -L或–list <链名>查看iptables规则列表
    -A或–append <链名>在规则列表的最后增加1条规则
    -I或–insert <链名>在指定的位置插入1条规则
    -D或–delete <链名>从规则列表中删除1条规则
    -R或–replace <链名>替换规则列表中的某条规则
    -F或–flush <链名>删除表中所有规则
    -Z或–zero <链名>将表中数据包计数器和流量计数器归零

    表8-1 命令选项表

    匹配说明
    -i<网络接口名>指定数据包从哪个网络接口进入,如ppp0、eth0和eth1等
    -o<网络接口名>指定数据包从哪块网络接口输出,如ppp0、eth0和eth1等
    -p<协议类型>指定数据包匹配的协议,如TCP、UDP和ICMP等
    -s<源地址或子网>指定数据包匹配的源地址
    –sport <源端口号>指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
    -d<目标地址或子网>指定数据包匹配的目标地址
    –dport目标端口号指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口

    表8-2 匹配选项表

    动作说明
    ACCEPT接受数据包
    DROP丢弃数据包
    REDIRECT将数据包重新转向到本机或另一台主机的某个端口,通常用功能实现透明代理或对外开放内网某些服务
    SNAT源地址转换,即改变数据包的源地址
    DNAT目标地址转换,即改变数据包的目的地址
    MASQUERADEIP伪装,即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNAT
    LOG日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错

    表8-3 动作选项表

实验环境准备

  • 虚拟机使用 NAT + Internal / Host-only 方式联网,安装 proftpd / Apache2
  • 使用 stand alone 模式启动 proftpd
  • 配置 proftpd 支持匿名访问

实验拓扑图

  • 网关和victim默认可以互相访问、

实验过程

iptables配置实例

  • 基本使用

    # (1)传输层防护实例
    
    # 禁止其它机器通过ssh连接自己
    
    iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
    
    # 查看主机防火墙规则
    
    iptables -t filter -L
    
    # 防止各种端口扫描
    
    # 以下规则设定,假设 FORWARD 链默认规则为 DROP 
    # 限制 SYN 请求的频率为:每秒 1 个
    # tcp-flags 的第一个参数 ALL 表示检查 TCP 的所有状态标志位
    # ALL 等价于 SYN,ACK,FIN,RST,URG,PSH (顺序无关,这是一个集合匹配)
    # tcp-flags 的第二个参数 SYN 表示仅匹配设置了 SYN 标志位的报文
    # 其中参数--limit 1/s 表示每秒一次; 1/m 则为每分钟一次
    iptables -A FORWARD -p tcp --tcp-flags ALL SYN -m limit --limit 1/s -j ACCEPT
    
    # 禁止 XMAS 扫描
    iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
    
    # 记录 XMAS 扫描到系统日志
    iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -m limit --limit 3/m --limit-burst 5 -j LOG --log-prefix "XMAS scan "
    
    # 限制 ping 20 秒内不得超过 6 次
    iptables -A INPUT -p icmp --icmp-type echo-request -m recent --name ICMP_check --rcheck --seconds 20 --hitcount 6 -j DROP
    iptables -A INPUT -p icmp --icmp-type echo-request -m recent --set --name ICMP_check
    # 以下是示例测试结果
    #PING 192.168.56.104 (192.168.56.104) 56(84) bytes of data.
    #64 bytes from 192.168.56.104: icmp_seq=1 ttl=64 time=0.237 ms
    #64 bytes from 192.168.56.104: icmp_seq=2 ttl=64 time=0.426 ms
    #64 bytes from 192.168.56.104: icmp_seq=3 ttl=64 time=0.557 ms
    #64 bytes from 192.168.56.104: icmp_seq=4 ttl=64 time=0.416 ms
    #64 bytes from 192.168.56.104: icmp_seq=5 ttl=64 time=0.478 ms
    #64 bytes from 192.168.56.104: icmp_seq=6 ttl=64 time=0.371 ms
    #64 bytes from 192.168.56.104: icmp_seq=21 ttl=64 time=0.380 ms
    #64 bytes from 192.168.56.104: icmp_seq=22 ttl=64 time=0.553 ms
    #64 bytes from 192.168.56.104: icmp_seq=23 ttl=64 time=0.424 ms
    #64 bytes from 192.168.56.104: icmp_seq=24 ttl=64 time=0.377 ms
    #64 bytes from 192.168.56.104: icmp_seq=25 ttl=64 time=0.334 ms
    #64 bytes from 192.168.56.104: icmp_seq=26 ttl=64 time=0.370 ms
    #64 bytes from 192.168.56.104: icmp_seq=41 ttl=64 time=0.397 ms
    
    # 禁止自己主机使用FTP协议下载(即封闭TCP协议的21端口)
    
    iptables -I OUTPUT -p tcp --dprot 21 -j DROP
    
    # 禁用主机的DNS端口(DNS为UDP协议,使用53端口)
    
    iptables -I OUTPUT -p udp --dport 53 -j DROP
    
    # (2)网络层防护实例
    
    # 防止ping洪水攻击。例如,限制ping的并发数,每秒一次。
    # 在 FORWARD 链上设置规则说明 iptables 所在主机是一个网关,可以限制内网主机去扫外网其他主机
    # 如果在 INPUT 链上设置规则,则说明 iptables 保护的是主机自己
    # FORWARD 上设置的这种限速措施可以理解为是从攻击源头进行治理,预防从自己管的这个片区出去的犯罪行为
    iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    
    # 限制一个ip访问自己主机。例如,以下这条命令限制了ip地址为192.168.1.102主机对自己的访问。
    
    iptables -A INPUT -s 192.168.1.102 -j DROP
    
    # (3)数据链路层防护实例
    
    # 阻断来自某个mac地址的数据包
    
    iptables -A INPUT -m mac --mac-source 00:1e:ec:f0:ae:77 -j DROP
    
    # 上面的命令阻断了mac地址为00:1e:ec:f0:ae:77 对本机的连接。
    
    # 查看本机iptables表
    iptables -L -n
    iptables -L -n -t nat
    
  • 禁止指定 IP 访问

#!/bin/bash

# iptables script generated 2011-10-13
# http://www.mista.nu/iptables

IPT="/sbin/iptables"

# Flush old rules, old custom tables
$IPT --flush
$IPT --delete-chain

# Set default policies for all three default chains
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# Enable free use of loopback interfaces
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# All TCP sessions should begin with SYN
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -s 0.0.0.0/0 -j DROP

# Accept inbound TCP packets
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block a specific IP address
$IPT -A INPUT -p IP -s 192.168.56.1 -j DROP
  • 禁止 TCP / UDP 指定端口访问
#!/bin/bash

# iptables script generated 2011-10-13
# http://www.mista.nu/iptables

IPT="/sbin/iptables"

# Flush old rules, old custom tables
$IPT --flush
$IPT --delete-chain

# Set default policies for all three default chains
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# Enable free use of loopback interfaces
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# All TCP sessions should begin with SYN
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -s 0.0.0.0/0 -j DROP

# Accept inbound TCP packets
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -s 0.0.0.0/0 -j DROP

# 通过在源和目的主机(防火墙所在主机)上抓包,对比DROP和REJECT指令在防火墙响应行为上的差异
#$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -s 0.0.0.0/0 -j REJECT
  • 禁止 ICMP ping
#!/bin/bash

# iptables script generated 2011-10-13
# http://www.mista.nu/iptables

IPT="/sbin/iptables"

# Flush old rules, old custom tables
$IPT --flush
$IPT --delete-chain

# Set default policies for all three default chains
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# Enable free use of loopback interfaces
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# All TCP sessions should begin with SYN
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -s 0.0.0.0/0 -j DROP

# Accept inbound TCP packets
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# DROP inbound ICMP messages
$IPT -A INPUT -p ICMP --icmp-type 8 -s 0.0.0.0/0 -j DROP
  • 在victim访问外网之前使用iptables -L -n -t filter -v查看chain的状态,发现包的数量都为0

  • victim对sec.cuc.edu.cn进行ping,发现gateway中forward chain中多了两个包,即刚刚转发的两个包

  • 这也同时说明了流量经过了网关

  • iptables规则编辑

    # 导出当前防火墙规则到文件
    iptables-save > iptables.rules
    
    # 备份当前规则文件
    cp iptables.rules iptables.rules.bak
    
    # 用文本编辑器编辑上一步备份出来的当前 iptables 规则文件的副本 iptables.rules
    
    # 应用编辑后的防火墙规则
    # -c  指定在还原 iptables 时候,重置当前的数据包计数器和字节计数器的值为零
    iptables-restore < iptables.rules
    
    # 随时可以使用之前备份的 iptables.rules.bak 来重置回最近一次没问题的规则
    
  • 我们根据上述指令查看到了默认的iptables规则

网络层

  • 使用以下代码进行icmp包drop,禁止icmpping,并保存

    $IPT -A INPUT -p ICMP --icmp-type 8 -s 0.0.0.0/0 -j DROP
    
  • 发现victim ping不通主机但是能ping通外网,说明我们的设置确实生效了,因为forward我们并未设置,只设置了input链的drop,所以能正常访问

  • 使用以下代码对指定ip的ip包drop,转回debian的原因是ssh突然断了连接

    $IPT -A INPUT -p IP -s 192.168.56.1 -j DROP
    
  • 发现victim确实ping不通主机了

  • 查看iptables状态,发现确实被drop了

传输层

  • 设置防火墙规则以禁止其它机器通过ssh连接自己

    # (1)传输层防护实例
    iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
    
  • 在设置之前发现ssh能远程登录

  • 然后发现远程登录被驱逐,说明我们的过滤规则确实发生了作用

  • 为了进一步证明上述规则,我们把刚刚那条规则删去以后,发现又可以进行ssh远程登录了

数据链路层

  • 阻断来自某个mac地址的数据包

    iptables -A INPUT -m mac --mac-source 08:00:27:f3:96:90 -j DROP
    
    # 上面的命令阻断了mac地址为08:00:27:f3:96:90(victim) 对本机的连接。
    
  • 发现确实victim不再能访问网关,但是不影响其访问别的外网,原因同上面,这只过滤了INPUT链的而不是转发链

应用层

  • 匹配应用层指定字符串

  • 输入以下String限制规则

    $IPT -A INPUT -p tcp -m string --algo bm --string 'Apache' -j REJECT --reject-with tcp-reset
    
  • 在未添加过滤规则时,victim可以直接通过apache访问网关

  • 对debian网关添加过滤规则,但是发现仍然可以访问,原因是我们设置的过滤规则是INPUT栈,但是apache界面是由server提供出去的

  • 但是我们可以更进一步实验,在请求参数中添加一些string请求,我们非常‘无情‘地添加了error,则这个参数肯定要经过INPUT链,则实验预计会成功

    iptables -A INPUT -p tcp -m string --algo bm --string 'error' -j REJECT --reject-with tcp-reset
    
  • 我们查看当前iptables的规则,可以看到过滤条件

  • 接下来再对网关进行访问,预计达到效果应为返回的apache界面,发现结果也却为该界面,其实这在某种程度上实现了ip欺骗

  • 我们可以通过以下指令log把过滤的数据包放到日志中

    iptables -A INPUT -p tcp -m string --algo bm --string error -LOG REJECT --reject-with tcp-reset
    
  • 再通过tail -F /var/log/syslog查看系统日志文件

课外补充实验

  • 实验要求

    局域网拓扑如下:

    +----------------------+          +-------------------------+       +----------------------+     
    |     host-1           |          |   host-2                |       |     host-3           |  
    |     172.16.18.11     |          |   eth0:0 172.16.18.1    |       |     172.16.18.12     |  
    |                      |          |   eth0: 192.168.1.123   |       |                      |  
    +-------------+--------+          +----------+--------------+       +-------------+--------+  
                  |                              |                                    |
                  |                              |                                    |
         +--------+------------------------------+--+                                 |
         |                交换机                    |---------------------------------+
         +-----------------+------------------------+
                           |
                           |
                     +-----+-----------+
                     |   eth0          |   `
                     |   192.168.1.1   |
                  +--+-----------------+---------+
                  |                              |
                  |        host-gw / dns-svr     |
                  |                              |
                  +------------------+----------++
                                     |  eth1    |
                                     +----------+
    

    上图的补充文字说明如下:

    • host-gw 指的是该局域网的网关,已经配置为 NAT 方式,局域网内的主机 host-2 可以正常无障碍访问互联网;
    • dns-svr 指的是该局域网中的 DNS 解析服务器,可以正常提供域名解析服务;
    • 交换机没有设置 VLAN,所有端口正常工作;
    • host-2上配置了 iptables规则;
    • host-1上配置了默认网关指向 IP 地址:172.16.18.1,域名解析服务器配置为 IP:192.168.1.1
    • host-3上配置了默认网关指向 IP 地址:172.16.18.1,域名解析服务器配置为 IP:192.168.1.1
    • host-2 上的 iptables 配置脚本如下:(带注释)
    #!/bin/bash
    
    IPT="/sbin/iptables"
    
    $IPT --flush
    $IPT --delete-chain# 清空 iptables中的所有链
    
    $IPT -P INPUT DROP      # drop输入
    $IPT -P FORWARD DROP    #drop转发
    $IPT -P OUTPUT ACCEPT   # 允许输出
    
    # 自定义两条链
    $IPT -N forward_demo    # 转发链
    $IPT -N icmp_demo       # icmp链
    
    $IPT -A INPUT -i lo -j ACCEPT   # 允许本地回环输入
    $IPT -A OUTPUT -o lo -j ACCEPT  # 允许本地回环输出
    
    $IPT -A INPUT -p tcp ! --syn -m state --state NEW -s 0.0.0.0/0 -j DROP# TCP 连接要求从 SYN 包开始
    $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 接受连接建立后的数据包和相关的数据包
    $IPT -A INPUT -p icmp -j icmp_demo# 对 icmp 协议使用 icmp_demo 链规则
    
    $IPT -A icmp_demo -p icmp -i eth0 -j ACCEPT# 接受来自 eth0 网卡的 icmp 数据包
    $IPT -A icmp_demo -j RETURN                 # 返回 INPUT 链?
    
    $IPT -A FORWARD -j forward_demo# 对转发数据使用 forward_demo 链
    
    
    $IPT -A forward_demo -j LOG --log-prefix FORWARD_DEMO# 将防火墙过滤日志
    # 丢弃 payload 字段包含 baidu 字符串的数据包
    $IPT -A forward_demo -p tcp --dport 80 -m string --algo bm --string 'baidu' -j DROP
    
    $IPT -A forward_demo -p tcp -s 172.16.18.11 -j ACCEPT# accept源地址为 172.16.18.11 的 tcp 数据包
    $IPT -A forward_demo -p tcp -d 172.16.18.11 -j ACCEPT# accept目标地址为 172.16.18.11 的 tcp 数据包
    $IPT -A forward_demo -p udp -s 172.16.18.11 --dport 53 -j ACCEPT# 接受源地址为 172.16.18.11 或 172.16.18.1 且目标端口为 53 的 udp 数据包
    $IPT -A forward_demo -p udp -s 172.16.18.1  --dport 53 -j ACCEPT
    # 接受源地址为 192.168.56.1 且源端口为 53 的 udp 数据包
    $IPT -A forward_demo -p udp -s 192.168.56.1  --sport 53 -j ACCEPT
    # 接受源地址为 172.16.18.1 的 tcp 数据包
    $IPT -A forward_demo -p tcp -s 172.16.18.1 -j ACCEPT# 返回 FORWARD 链??
    $IPT -A forward_demo -s 172.16.18.1 -j RETURN
    
    $IPT -t nat -A POSTROUTING -s 172.16.18.1/24 -o eth0 -j MASQUERADE# 开启 NAT 转发,动态分配 IP 地址
    
    
  • 搭建的实验拓扑

  • 搭建过程中注意的是:(发现做本实验最难的是配置网络拓扑情况hhh)

    • 由于本次实验拓扑对ip有限制要求,所以大部分都要手动配置,为了多尝试,本次实验使用了kali/debian/xp系统,均进行了手动配置尝试

    • xp配置ip及netmask

    • kali手动配置:只要进入/etc/network/interfaces编辑并保存即可

  • 配置好后查看各主机的ip,检查配置成功

  • 向host2中输入要求的防火墙规则

  • 配置完成以后,进行实验验证(host1和host3在验证时换了一下ip)

    • host-1可以ping通ip: 172.16.18.1吗?

    • host-1可以ping通ip: 192.168.1.1吗?

      非常奇怪,仔细阅读防火墙规则以后发现这个包并没有丢弃,不知道为什么会无法ping通,实验也无法复现了,应该是直接通过转发链 → forward_demo链

    • host-1可以ping通域名: www.baidu.com吗?

      不记得当时设置了什么特殊的规则,但是应该同样是从转发链 → forward_demo链,结果应该是能ping通

    • host-1可以访问: http://www.baidu.com 吗?

    • host-1可以访问:http://61.135.169.121 吗?

    • host-3可以ping通ip: 172.16.18.1吗?

    • host-3可以ping通ip: 192.168.1.1吗?(本次实验的ip是192.168.56.1

    • host-3可以访问互联网吗?

实验所遇问题

  • 防火墙规则添加失败,后来发现规则放错地方了,本应放在input chain中,放到了forward chain
  • proftpd官方压缩包解压失败,最后发现官网下载下来的压缩包居然是0kb??
  • 对debian网关添加过滤规则,但是发现仍然可以访问,原因是我们设置的过滤规则是INPUT,但是apache界面是由服务器提供的
  • 补充实验的实验拓扑配了好久,发现最后理解错了题意,且未分清host-only和intnet网络【回第一章重造吧哈哈】
  • 手动配置ip并未生效,需要输入systemctl restart networking重启生效
  • kali网卡手动设置非常容易自动失效,需多次重试

实验总结

  • 防火墙可以改变网络拓扑规则,可以实现NAT,使原本可以访问的变为无法访问,反之也可

  • 防火墙可以设置网络各层的规则,使用简单

  • 防火墙的使用其实在第五章实验的端口状态就使用过了,防火墙的作用非常强大

实验参考资料

  • iptables-resotore
  • nftables
  • ip转发
    解压失败,最后发现官网下载下来的压缩包居然是0kb??
  • 对debian网关添加过滤规则,但是发现仍然可以访问,原因是我们设置的过滤规则是INPUT,但是apache界面是由服务器提供的
  • 补充实验的实验拓扑配了好久,发现最后理解错了题意,且未分清host-only和intnet网络【回第一章重造吧哈哈】
  • 手动配置ip并未生效,需要输入systemctl restart networking重启生效
  • kali网卡手动设置非常容易自动失效,需多次重试

实验总结

  • 防火墙可以改变网络拓扑规则,可以实现NAT,使原本可以访问的变为无法访问,反之也可

  • 防火墙可以设置网络各层的规则,使用简单

  • 防火墙的使用其实在第五章实验的端口状态就使用过了,防火墙的作用非常强大

实验参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
防火墙是一种网络安全设备,用于监控和控制网络流量,以保护网络免受未经授权的访问和恶意活动的影响。防火墙配置和性能测试是确保防火墙正常运行和有效保护网络的重要步骤。 防火墙配置包括以下几个方面: 1. 确定安全策略:根据组织的需求和风险评估,制定适当的安全策略,包括允许和禁止的网络流量规则。 2. 配置访问控制列表(ACL):根据安全策略,设置ACL规则,限制特定IP地址、端口或协议的访问。 3. 配置网络地址转换(NAT):使用NAT技术将内部私有IP地址转换为公共IP地址,以隐藏内部网络拓扑结构。 4. 启用入侵检测和防御系统(IDS/IPS):配置IDS/IPS来检测和阻止潜在的网络攻击。 5. 更新和维护规则集:定期更新防火墙规则集,以适应新的威胁和漏洞。 性能测试是评估防火墙性能和吞吐量的过程,以确保其能够处理预期的网络流量负载。性能测试可以包括以下几个方面: 1. 带宽测试:通过发送大量数据流量来测试防火墙的带宽容量,以确定其能够处理的最大数据传输速率。 2. 连接数测试:测试防火墙能够同时处理的最大连接数,以确保其在高负载情况下的稳定性。 3. 吞吐量测试:通过发送大量小数据包来测试防火墙的吞吐量,以评估其在处理大量小数据包时的性能。 4. 延迟测试:测试防火墙对数据包的处理延迟时间,以确保其在实时应用中的响应性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值