yuanxiaojiang
人的放纵是本能,自律才是修行

防火墙基础

  防火墙的基本功能

  • 封ip和封端口:防火墙可以配置规则以封锁特定的网络端口和IP地址
  • 实现NAT(网络地址转换)功能:NAT允许多个设备通过一个公共IP地址共享互联网连接,常用于节省IP地址资源和增加网络安全
    • 共享上网:通过NAT功能,多个内部设备可以共享一个外部IP地址
    • 地址隐匿:增加网络安全性,保护内部网络结构不暴露给外部
  • 端口映射(端口转发):将外部请求转发到内部网络中指定的服务或设备上,允许外部访问内部服务器
  • IP映射:将特定的内部IP地址映射到外部IP地址,常见于VPN和远程访问

  防火墙的种类及其使用

硬件防火墙:整个企业的路口

  • 三层路由器(提供防火墙功能):如H3C、华为、Cisco(思科)
  • 专业的防火墙设备:如深信服、绿盟、奇安信、Juniper

 软件防火墙

  • 开源软件:在互联网中可以找到多种开源防火墙解决方案
  • Linux内核中的iptables:iptables用于配置Linux内核中的Netfilter子系统,管理流量和数据包过滤
  • firewalld(CentOS 7及以上):提供动态管理防火墙规则的方式
  • nftables(CentOS 8及以上):是iptables的替代品,提供更多功能和更好的性能
  • UFW (Uncomplicated Firewall):Ubuntu系统中提供的用户友好的防火墙工具,简化iptables配置

 云防火墙

  • 阿里云安全组:容许用户配置入口与出口流量的安全规则,可以封锁特定的IP地址和端口
  • NAT网关:在云环境中实现共享上网及端口映射功能
  • WAF(Web应用防火墙):专门针对HTTP/HTTPS流量的防火墙,用于保护应用程序免受各种攻击(如SQL注入、跨站脚本等)
    • SQL注入攻击:需要阻挡包含“SELECT”、“UNION”等关键字的请求
    • 跨站脚本(XSS):需要检测并阻断包含可能的脚本标签的请求

  防火墙有关名词

 容器(Container)

  • 定义:逻辑单元,用于存放和管理网络流量和规则。
  • 功能:将流量和规则进行分组,便于管理

 表(Table)

  • 定义:存放不同类型链的基本结构。
  • 主要类型:
    • filter:用于包过滤。
    • nat:处理网络地址转换。
    • mangle:修改数据包特性。
    • raw:原始数据包处理。

 链(Chain)

  • 定义:存储具体访问控制规则的序列。
  • 主要类型:
    • INPUT:处理进入设备的数据包。
    • OUTPUT:处理离开设备的数据包。
    • FORWARD:处理转发的数据包。

 规则(policy)

  • 定义:定义条件和动作,决定如何处理数据包。
  • 组成:
    • 匹配条件:源IP、目标IP、协议、端口等。
    • 动作:如ACCEPT(允许)、REJECT(拒绝)、DROP(丢弃)

  iptables执行过程

# 1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的
# 2. 如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数据包就不再向下匹配新的规则
# 3. 则均未匹配时,最终由默认规则决定数据包的处理方式‌
# 4. 防火墙的默认规则是所有规则都匹配完才会匹配

  四表五链条⭐⭐⭐⭐⭐

 

PREROUTING:在数据包进行路径选择之前所要应用的链(防火墙刚刚接收到数据包的时候)

FORWARD:将数据包从一个网络转发到另一个网络的过程中所需要使用的链

POSTROUTING:在数据包进行路径选择之后所要应用的链(防火墙在即将将数据包转发出去前的时候)

INPUT:数据包进入防火墙所要应用的链

OUTPUT:数据包离开防火墙所要应用的链

 

  • 优先级:raw > mangle > nat > filter 
  • filter表:过滤数据包
    • INPUT
    • OUTPUT
    • FORWARD
  • nat表:修改数据包中的ip和端口
    • PREROUTING
    • POSTROUTING
    • OUTPUT
  • mangle表:修改数据包的报文( ttl TOS )
    • PREROUTING
    • FORWARD
    • POSTROUTING
    • INPUT
    • OUTPUT
  • raw表:确定是否对数据包进行状态跟踪
    • OUTPUT
    • PREROUTING

https://blog.csdn.net/Axic123/article/details/130717675#2_25

防火墙的使用

  环境准备

 安装iptables防火墙

[root@m01 ~]# yum install -y iptables-services

[root@m01 ~]# rpm -ql iptables-services
# 防火墙配置文件
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
# 防火墙服务配置文件(命令) systemctl start iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service

[root@m01 ~]# rpm -ql iptables
# iptables主命令行工具,通常用于创建、修改、删除和查看防火墙规则
/usr/sbin/iptables  
# 用于将当前的 iptables 规则保存到标准输出,通常用于备份或将规则导出到文件
/usr/sbin/iptables-save
# 从文件中读取 iptables 规则并加载到内核中,恢复先前保存的防火墙配置
/usr/sbin/iptables-restore

 防火墙模块加载到内核中

# 需要永久生效,写入开机自启动文件/etc/rc.local
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

[root@m01 ~]# systemctl start iptables.service
[root@m01 ~]# systemctl enable iptables.service

lsmod:显示当前加载的内核模块的信息

输出格式

  • Module:模块的名称。
  • Size:模块占用的内存大小(以字节为单位)。
  • Used by:显示正在使用此模块的其他模块或驱动程序的数量,及其名称
[root@m01 ~]# lsmod |egrep 'filter|nat|ipt'
nf_nat_ftp             12809  0 
nf_conntrack_ftp       18478  1 nf_nat_ftp
iptable_nat            12875  0 
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26583  2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack          139264  6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter         12810  0 
ip_tables              27126  2 iptable_filter,iptable_nat
libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

  iptables命令参数⭐⭐⭐⭐⭐

语法:iptables [-t table] command [链名] [条件匹配] [-j 处理动作]

  • -t table:用来指明要操作的表是哪个,不指定时默认为filter
  • command参数:增删改查规则的操作,针对规则有以下参数
    • -A:追加一条规则,默认放到该链的最后
    • -I:在指定的位置插入规则,不指定位置默认在链的最上面插入。比如 iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT,在INPU链的第二个位置插入规则
    • -L:显示表中的所有规则
      • n:只显示 IP 地址和端口号码,不显示域名和服务名称(静止反向解析)
      • v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
      • x:在 v 的基础上,禁止自动单位换算(K、M)
      • --line-number:可以查看到规则序列号,在结合 -D 删除具体第几条规则时很有用
    • -D:从规则列表中删除规则
    • -P:设置某条链的默认规则
    • -F:清空规则
    • -X:删除用户自定义链
    • -Z:将指定链的所有计数器归零
  • 条件匹配参数
    • -i:匹配数据进入的网络接口,主要应用于nat表,如:-i eth0,匹配从网卡eth0流入的数据包
    • -o:匹配数据流出的网络接口,如:-o eth0 匹配从网卡eth0流出的数据包
    • -m:指定模块(multiport)
    • -s:匹配源地址,可以是IP、网段、域名、也可以为空表示任何地址
    • -d:匹配目标地址
    • -p:匹配协议类型,如TCP、UDP、ICMP等
    • --sport:匹配源端口;可以是单个端口,也可以是端口范围,当指定端口时,需要使用-p指定协议,否则会出错
    • --dport:匹配目的端口
  • 处理动作
    • -j ACCEPT:允许数据包通过本链而不拦截它
    • -j DROP:丢弃数据包;阻止数据包通过改链,并且没有消息返回给客户端
    • -j DNAT:目的地址转换,支持转换为单IP,也支持转换到IP地址池
    • -j REJECT:拒绝数据包,会给客户端发送一个数据包被丢弃的响应信息

  配置filter表规则⭐⭐⭐⭐⭐

 禁止访问22端口

# 拒绝用户访问22端口
[root@m01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP

# 测试
[root@web01 ~]# nmap -p 22 10.0.0.61 22
PORT   STATE    SERVICE
22/tcp filtered ssh
[root@web01 ~]# telnet 10.0.0.61 22
telnet: connect to address 10.0.0.61: Connection refused

# 查看规则并加上序号
[root@m01 ~]# iptables -nL -t filter --line-number

# 删除规则
[root@m01 ~]# iptables -t filter -D INPUT 6  # 根据序号删除

 封ip,屏蔽某个ip⭐⭐⭐

[root@m01 ~]# iptables -A INPUT -s 10.0.0.7 -j DROP
[root@web02 ~]# ping 10.0.0.61  # 可以ping通
[root@web01 ~]# ping 10.0.0.61  # 不可以ping通

 禁止网段连入(禁止10.0.0.0/24网段访问8888端口)⭐⭐⭐

[root@m01 ~]# iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8888 -j DROP
[root@web01 ~]# nmap -p 22 10.0.0.61
PORT   STATE SERVICE
22/tcp open  ssh
[root@web01 ~]# nmap -p 8888 10.0.0.61
PORT     STATE    SERVICE
8888/tcp filtered sun-answerbook

 只允许指定的网段连入(允许10.0.0.0/24)⭐⭐⭐

# 方法1:利用 ! 进行排除
[root@m01 ~]# iptables -I INPUT ! -s 10.0.0.0/24 -j DROP

# 方法2:修改链默认规则
[root@m01 ~]# iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT
[root@m01 ~]# iptables -P INPUT DROP

 指定多个端口

[root@m01 ~]# iptables -I INPUT -m multiport -p tcp --dport 80,443 -j DROP
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443

[root@web01 ~]# nmap -p 80 10.0.0.61
PORT   STATE    SERVICE
80/tcp filtered http
[root@web01 ~]# nmap -p 88 10.0.0.61
PORT   STATE  SERVICE
88/tcp closed kerberos-sec

# 如果是连续的端口,可以不加上-m multiport(1024:65535)
[root@m01 ~]# iptables -I INPUT -p tcp --dport 1024:65535 -j DROP

 匹配ICMP类型⭐

ICMP(Internet Control Message Protocol):Internet控制报文协议 ping

# 精简写法
[root@m01 ~]# iptables -t filter -I INPUT -p icmp -j DROP
# 精确写法
[root@m01 ~]# iptables -t filter -I INPUT -p icmp --icmp-type 8 -j DROP

# 通过内核参数控制禁止被ping
[root@m01 ~]# cat /etc/sysctl.conf 
#/proc/sys/net/ipv4/icmp_echo_ignore_all
#net网络 ipv4协议 icmp协议忽略所有
net.ipv4.icmp_echo_ignore_all = 1
[root@m01 ~]#sysctl -p    # 生效

 匹配网络状态(TCP/IP连接状态)⭐

  • -m state --state 状态模块
  • NEW:尚未建立的新的连接
  • ESTABLISHED:已建立的连接
  • RELATED:正在启动的新连接
  • INVALID:非法或无法识别的
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

 限制并发及速率⭐

-m limit 限制模块

# -m limit --limit n/{second/minute/hour}
-m limit --limit 10/minute  # 每分钟只能有10个数据包(每6秒生成一个)

# --limit-burst [n]
在同一时间允许通过的请求数
-m limit --limit 10/minute --limit-burst 5

测试

[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
[root@m01 ~]# iptables -t filter -I INPUT -p tcp -j ACCEPT  # 没有这行则断开xshell的ssh连接
[root@m01 ~]# iptables -P INPUT DROP
[root@web01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.190 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.355 ms
64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.408 ms
64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.388 ms
64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=0.628 ms
64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=0.407 ms  # 7比1 间隔为6秒
64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.377 ms  # 7比13 间隔为6秒
64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.374 ms  # 13比19 间隔为6秒
64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.410 ms  # 19比25 间隔为6秒

 防火墙规则的保护与恢复⭐⭐⭐⭐⭐

iptables-save 进行备份,默认输出到屏幕
iptables-restore 进行恢复,加上文件
写入到/etc/sysconfig/iptables
[root@m01 ~]# iptables-save
# Generated by iptables-save v1.4.21 on Tue Apr  8 15:36:40 2025
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [98:10373]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Apr  8 15:36:40 2025

[root@m01 ~]# iptables-save >/etc/sysconfig/iptables
[root@m01 ~]# iptables-restore </etc/sysconfig/iptables

  实际生产用法

  • iptables配置方式
    • 默认规则是 ACCEPT
    • 默认规则是 DROP
  • 实际生产使用 DROP 配置方式

 允许ssh远程连接

[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -X
[root@m01 ~]# iptables -Z
[root@m01 ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
[root@m01 ~]# iptables -P INPUT DROP
[root@m01 ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

 设置本地回环接口通信规则

  • lo:本地回环接口(localhost),是计算机网络中用于处理本地通信的一个虚拟接口
  • 允许本地回环接口进出系统的数据流量的流入与流出
    • 本地应用程序通信:应用程序通过回环接口通信,缺少规则会导致无法互通。
    • 提高系统稳定性:确保本地服务正常接收和响应请求,增强系统稳定性。
[root@m01 ~]# iptables -t filter -A INPUT -i lo -j ACCEPT
[root@m01 ~]# iptables -t filter -A OUTPUT -o lo -j ACCEPT

 配置默认规则及放行80,443端口

[root@m01 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -s 10.0.0.0/24 -j ACCEPT
[root@m01 ~]# iptables -t filter -A INPUT -s 172.16.1.0/24 -j ACCEPT
[root@m01 ~]# iptables -t filter -P INPUT DROP
[root@m01 ~]# iptables -t filter -P FORWARD ACCEPT
[root@m01 ~]# iptables -t filter -P OUTPUT ACCEPT
[root@m01 ~]# iptables-save >/yuan/iptables

[root@m01 ~]# iptables -nL -t filter 
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
ACCEPT     all  --  172.16.1.0/24        0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0     

  NAT(网络地址转换)

  • 共享上网
  • 隐匿地址
  • 端口映射
  • IP映射

 实现共享上网⭐⭐⭐⭐⭐

# 清除现有规则  
iptables -F  
iptables -t nat -F  

# 设置NAT  
iptables -t nat -A POSTROUTING -s 172.16.1.24/24 -j MASQUERADE  

# 允许局域网内的机器访问互联网  
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT  
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT  


iptables -t nat -A POSTROUTING  -s 172.16.1.7   -j SNAT  --to-source 10.0.0.61
1. 指定nat表,配置POSTROUTING链
2. 源ip是172.16.1.7这台主机进行共享上网,如果是多台(-s
172.16.1.0/24)
3. 指定使用SNAT功能,源地址转换.
4. 通过SNAT功能把数据包中的源ip地址改为防火墙公网的ip地址.
(10.0.0.61)
 
温馨提示: 如果公网ip不固定, -j SNAT --to-source 10.0.0.61 可以写为 -j MASQUERADE 伪装成公网ip
  • 环境准备
m01 配置共享上网规则
web01

只保留eth1网卡,添加网关172.16.1.61(需要配置DNS)

eth0网卡(ONBOOT=no)

web02

只保留eth1网卡,添加网关172.16.1.61(需要配置DNS)

eth0网卡(ONBOOT=no)

  • 配置防火墙
  • 配置防火墙规则,默认规则是准许
  • 清空其它规则
  • 配置防火墙共享上网规则
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
[root@m01 ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf
[root@m01 ~]# sysctl -p
net.ipv4.ip_forward = 1

 实现端口转发⭐⭐⭐⭐⭐

端口映射(端口转发):将外部请求转发到内部网络中指定的服务或设备上,允许外部访问内部服务器

[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
[root@m01 ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9000 to:172.16.1.7:22

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61

 实现ip映射⭐

[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7

iptables防火墙笔试题

iptables防火墙面试题

posted on 2025-04-07 22:45  猿小姜  阅读(172)  评论(0)    收藏  举报

levels of contents