【Linux入门】iptables的安装与配置应用实例

iptables安装与配置

安装iptables

在CentOS 7中,默认使用firewalld防火墙,若想使用iptables防火墙,需先关闭firewalld防火墙,再安装iptables。

systemctl stop firewalld.service
systemctl disable firewalld.service

yum -y install iptables iptables-services
systemctl start iptables.service

iptables配置方法

  1. 使用iptables命令行
  2. 使用system-config-firewall(图形界面)

iptables命令行配置方法

命令格式:

iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

注意事项

  • 不指定表名时,默认指filter表。
  • 不指定链名时,默认指表内的所有链。
  • 除非设置链的默认策略,否则必须指定匹配条件。
  • 控制类型和链名使用大写字母,其余均为小写。

常用的控制类型

  • ACCEPT:允许数据包通过。
  • DROP:直接丢弃数据包,不给出任何回应信息。
  • REJECT:拒绝数据包通过,会给数据发送端一个响应信息。
  • SNAT:修改数据包的源地址。
  • DNAT:修改数据包的目的地址。
  • REDIRECT:重定向改变目的端口,将接受的包转发至本机的不同端口。
  • MASQUERADE:伪装成一个非固定公网IP地址。
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。

常用的管理选项

  • -A:在指定链的末尾追加一条新的规则。
  • -I:在指定链的开头插入一条新的规则,未指定序号时默认作为第一条规则。
  • -R:修改、替换指定链中的某一条规则,可指定规则序号或具体内容。
  • -P:设置指定链的最低策略。
  • -D:删除指定链中的某一条规则,可指定规则序号或具体内容。
  • -F:清空指定链中的所有规则,若未指定链名,则清空表中的所有链。
  • -L:列出指定链中所有的规则,若未指定链名,则列出表中的所有链。
  • -n:使用数字形式显示输出结果,如显示IP地址而不是主机名。
  • -v:显示详细信息,包括每条规则的匹配包数量和匹配字节数。
  • --line-numbers:查看规则时,显示规则的序号。

常用的匹配条件选项

  • -i [输入接口]:指定数据包从哪个接口进入。
  • -o [输出接口]:指定数据包从哪个接口输出。
  • -s [源地址/掩码]:指定数据包的源IP地址或网络。
  • -d [目的地址/掩码]:指定数据包的目的IP地址或网络。
  • -p [协议]:指定数据包的协议类型,如tcp、udp、icmp等。
  • --sport [源端口]:指定数据包的源端口号(对于TCP/UDP协议)。
  • --dport [目的端口]:指定数据包的目的端口号(对于TCP/UDP协议)。
  • -m [模块]:加载额外的匹配模块,用于更复杂的匹配条件,如multiport(多端口匹配)、mac(MAC地址匹配)等。

添加新的规则

iptables -t filter -A INPUT -p icmp -j REJECT
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT

查看规则列表

iptables [-t 表名] -n -L [链名] [--line-numbers]

iptables -[vn]L

注意:不可以合写为-Ln

iptables -n -L --line-numbers

设置默认策略

iptables [-t 表名] -P<链名> <控制类型>
iptables -P INPUT DROP
iptables -P FORWARD DROP

一般在生产环境中设置网络型防火墙、主机型防火墙时都要设置默认规则为DROP,并设置白名单。

删除规则

iptables -D INPUT 2
iptables -t filter -D INPUT -p icmp -j REJECT

注意:

  1. 若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条。
  2. 按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错。
  3. 按内容匹配删除时,确保规则存在,否则报错。

清空规则

iptables [-t 表名] -F [链名]
iptables -F INPUT
iptables -F

注意:

  1. -F仅仅是清空链中的规则,并不影响-P设置的默认规则,默认规则需要手动进行修改。
  2. -P设置了DROP后,使用-F一定要小心!防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决。
  3. 如果不写表名和链名,默认清空filter表中所有链里的所有规则。
表名操作选项链名匹配条件选项示例及说明(需跟随值)-j 控制类型及参数注释
filter-AINPUT-i eth0
-s 192.168.1.0/24
-p tcp
(需指定端口)
ACCEPT追加规则到INPUT链,允许来自192.168.1.0/24的TCP流量
-IOUTPUT-o eth1
-d 8.8.8.8
–dport 53
DROP插入规则到OUTPUT链,丢弃发往8.8.8.8的DNS查询
-DFORWARD-p udp
–sport 12345
(需指定目标IP或端口)
REJECT删除FORWARD链中匹配特定源端口的UDP规则
-PINPUTDROP设置INPUT链的默认策略为丢弃
-LFORWARD列出FORWARD链的所有规则
nat-APREROUTING-d 192.168.1.100
–dport 80
DNAT --to-destination 10.0.0.1:8080将目标为192.168.1.100:80的流量重定向到10.0.0.1:8080
mangle-DPREROUTING-p icmp
(可能需要更具体的ICMP类型)
MARK --set-mark 1删除PREROUTING链中标记ICMP包的规则(注意可能需要具体ICMP类型)
raw-ROUTPUT–sport 22
-p tcp
ACCEPT将OUTPUT链中指定源端口为22的TCP流量替换为ACCEPT(注意-R需要指定规则编号)
-FPREROUTING清空PREROUTING链的所有规则
-L列出所有表或指定表的规则(无链名时默认为filter表)

注意

  1. 匹配条件选项:每个-i, -o, -s, -d, --sport, --dport 等都需要跟随一个值来指定具体的网络接口、源/目标IP地址、源/目标端口等。
  2. 控制类型:如 ACCEPT, DROP, REJECT, SNAT, DNAT, MARK 等,其中 SNATDNAT 通常与 nat 表一起使用,而 MARK 可能与 mangle 表一起使用来设置数据包标记。
  3. 操作选项-A 追加规则,-I 插入规则,-D 删除规则,-P 设置默认策略,-L 列出规则,-F 清空规则。
  4. 表名filter, nat, mangle, raw 是iptables中定义的四种表,每种表处理数据包的不同方面。

iptables操作管理表格,增删改查规则的操作:

操作命令格式示例
iptables -t 表名 -L -n -v --line-numbers [链名]iptables -t filter -L -n -v --line-numbers
iptables -t 表名 -nvLiptables -t nat -nvL
iptables -t 表名 -D 链名 规则序号iptables -t mangle -D FORWARD 3
iptables -t 表名 -F [链名]iptables -t raw -F
iptables -t 表系 -A 链名 匹配条件选项 -j 控制类型iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t 表名 -I 链名 [规则序号] 匹配条件选项 -j 控制类型iptables -t nat -I POSTROUTING 1 -s 10.0.0.0/8 -j SNAT --to-source 1.2.3.4
iptables -t 表名 -R 链名 规则序号 新规则内容iptables -t nat -R POSTROUTING 1 --to-source 4.3.2.1
iptables -t 表名 -P 链名 ACCEPT/DROP/REJECTiptables -t filter -P FORWARD DROP

iptables 规则匹配详细整理

1. 通用匹配

通用匹配不依赖于特定的协议或其他条件,主要用于网络层的基本过滤。

  • 协议匹配 (-p): 指定数据包的网络协议类型,如 TCP、UDP、ICMP 等。

    • 示例:iptables -A FORWARD ! -p icmp -j ACCEPT(允许除 ICMP 外的所有协议转发)
  • 地址匹配:

    • 源地址 (-s): 指定数据包的源 IP 地址或网段。
      • 示例:iptables -A INPUT -s 192.168.80.11 -j DROP(拒绝来自 192.168.80.11 的入站数据包)
    • 目的地址 (-d): 指定数据包的目的 IP 地址或网段。
      • 示例:略(因为通用匹配示例中未直接展示,但用法相同)
  • 接口匹配:

    • 入站网卡 (-i): 指定数据包进入的网卡接口。
      • 示例:iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP(拒绝来自 192.168.80.0/24 网段且通过 ens33 接口的入站数据包)
    • 出站网卡 (-o): 指定数据包离开的网卡接口。

2. 隐含匹配

隐含匹配依赖于特定的协议,并允许进一步的过滤条件,如端口、TCP 标志、ICMP 类型等。

  • 端口匹配:

    • 源端口 (--sport): 指定数据包的源端口。
      • 示例:iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT(允许 TCP 协议的目的端口为 20 到 21 的数据包入站)
    • 目的端口 (--dport): 指定数据包的目的端口。
      • 示例同上,但注意 --dport 用于目的端口。
  • TCP 标志位匹配 (--tcp-flags): 用于 TCP 协议的特定控制标志,如 SYN、ACK、FIN 等。

    • 示例:
      • 允许仅带有 SYN 标志的 TCP 数据包(如 SSH 连接的第一次握手):iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j ACCEPT
      • 拒绝带有 ACK 标志但非 SYN,ACK 的 TCP 数据包(阻止非法的 TCP 连接):iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH ACK -j REJECT
  • ICMP 类型匹配 (--icmp-type): 用于 ICMP 协议的数据包类型过滤。

    • 示例:
      • 禁止 ICMP Echo Request(ping 请求):iptables -A INPUT -p icmp --icmp-type 8 -j DROP
      • 允许 ICMP Echo Reply(ping 回应):iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
      • 允许 ICMP 目标不可达消息:iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT

显式匹配(扩展匹配)

在 iptables 中,显式匹配通过 -m 选项加载特定的扩展模块来实现更复杂的匹配条件,包括多端口、MAC 地址、IP 范围、数据包状态等。

1. 多端口匹配

使用 multiport 模块可以匹配多个源端口或目的端口。

  • 示例
    • 允许 TCP 协议的多个目的端口(80, 22, 21, 20, 53)入站:
      iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
      
    • 允许 UDP 协议的多个目的端口(53, 67, 68)入站:
      iptables -A INPUT -p udp -m multiport --dport 53,67,68 -j ACCEPT
      

2. IP 范围匹配

使用 iprange 模块可以匹配 IP 地址范围。

  • 示例
    • 禁止转发源地址位于 192.168.80.100-192.168.80.200 的 UDP 数据包:
      iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
      
    • 注意:--dst-range 用于匹配目标地址范围,但在此示例中未使用。

3. MAC 地址匹配

使用 mac 模块可以匹配数据包的源 MAC 地址。

  • 示例
    • 禁止来自特定 MAC 地址(xx:xx:xx:xx:xx:xx)的数据包通过本机转发:
      iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
      

4. 状态匹配

使用 state 模块可以基于数据包的连接状态进行匹配。
-m state --state 连接状态

  • 常见连接状态
    • NEW:新的连接请求。
    • ESTABLISHED:已建立的连接(回应包)。
    • RELATED:与已建立的连接相关的新连接(如 FTP 数据传输)。
    • INVALID:无效的数据包。

注意:ESTABLISHED,RELATED 表示已经建立tcp连接的包以及该连接相关的包都允许通过。简单来说就是放行所有自己发出去的包的应答包进来。

  • 示例
    • 允许新的 SSH 连接请求(TCP 端口 22):
      iptables -I INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
      
    • 允许多个 TCP 端口(443, 80, 22, 21, 20, 53)的已建立连接和相关连接:
      iptables -A INPUT -p tcp -m multiport --dport 443,80,22,21,20,53 -j ACCEPT
      iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
      
    • 允许 UDP 端口 53 的入站数据包(DNS):
      iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
      
    • 设置默认策略为 DROP,以确保只有明确允许的数据包才能通过:
      iptables -P INPUT DROP
      

SNAT与DNAT

SNAT(源网络地址转换)原理与应用

SNAT 应用环境

  • 场景:当局域网内的多台主机需要共享单个公网IP地址接入Internet时,由于私有IP地址(如192.168.x.x)无法在Internet中直接路由,需要使用SNAT技术。

SNAT 原理

  • 核心功能:修改数据包的源地址,将局域网内主机的私有IP地址转换为公网IP地址或公网IP地址池中的一个地址,以便数据包能在Internet上正常传输。

SNAT 转换前提条件

  1. 局域网各主机已正确设置IP地址、子网掩码、默认网关地址。
  2. Linux网关已开启IP路由转发。
    • 临时打开:
      echo 1 > /proc/sys/net/ipv4/ip_forward
      
      sysctl -w net.ipv4.ip_forward=1
      
    • 永久打开:
      vim /etc/sysctl.conf
      net.ipv4.ip_forward = 1
      sysctl -p
      

SNAT 转换示例

  1. 固定公网IP地址

    iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j SNAT --to 12.0.0.1
    

    或指定地址池:

    iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j SNAT --to-source 12.0.0.1-12.0.0.10
    
  2. 非固定公网IP地址(共享动态IP地址)

    iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j MASQUERADE
    

DNAT(目标网络地址转换)原理与应用

DNAT 应用环境

  • 场景:在Internet中发布位于局域网内的服务器,使得外部用户可以访问局域网内部的特定服务。

DNAT 原理

  • 核心功能:修改数据包的目的地址,将目的地址从公网IP地址转换为局域网内服务器的私有IP地址,以便外部用户能够访问内部服务。

DNAT 转换前提条件

  1. 局域网的服务器能够访问Internet。
  2. 网关的外网地址有正确的DNS解析记录(可选,视具体场景而定)。
  3. Linux网关已开启IP路由转发。

DNAT 转换示例

  1. 发布内网的Web服务
    iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.80.11
    
  2. 发布时修改目标端口
    iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.80.11:22
    

注意事项

  • 使用DNAT时,通常需要配合SNAT使用,以确保响应数据包能够正确返回给外部用户。
  • 响应数据包通过SNAT转换回原始的公网IP地址,再发送给外部用户。

小知识扩展:防火墙类型与规则管理

防火墙类型

  • 主机型防火墙
    • 主要关注进出宿主机的网络流量。
    • 主要使用INPUT(进入主机的数据包)和OUTPUT(从主机发出的数据包)链。
    • 设置规则时,通常需要详细指定到端口,因为主机型防火墙更侧重于保护单一主机的安全。
  • 网络型防火墙
    • 主要关注在网络中转发的数据包。
    • 主要使用FORWARD链,用于处理经过防火墙转发给内部或外部网络的数据包。
    • 设置规则时,一般指定到IP地址或网段,因为网络型防火墙的职责是控制整个网络的数据流动。

防火墙规则的备份与还原

  • 导出(备份)规则
    使用iptables-save命令将当前所有的iptables规则导出到一个文件中,以便后续备份或迁移。

    iptables-save > /opt/ipt.txt
    

    或者,如果你使用的是较旧的系统或配置,可能会将规则保存在/etc/sysconfig/iptables文件中,以便iptables服务启动时自动加载。

    iptables-save > /etc/sysconfig/iptables
    
  • 导入(还原)规则
    使用iptables-restore命令将之前导出的规则文件导入到iptables中,以恢复网络配置。

    iptables-restore < /opt/ipt.txt
    

    如果规则保存在/etc/sysconfig/iptables中,启动iptables服务时会自动加载这些规则。

    systemctl stop iptables    # 注意:这通常不是必需的,除非你想确保环境干净再加载规则
    systemctl start iptables   # 启动iptables服务,自动加载/etc/sysconfig/iptables中的规则
    

总结

SNAT : 内网主机 --> 外网服务器 转换源地址

iptables -t nat -A POSTROUTING -s 内网的源地址/网段  -o 出站网卡  -j SNAT  --to  要转换的公网源地址

DNAT : 外网主机 --> 内网服务器 转换目的地址:端口

iptables -t nat -A PREROUTING  -i 入站网卡  -d 原公网目的地址  -p 协议 --dport 原目的端口  -j DNAT  --to 要转换的私网IP:端口

补充:tcpdump 抓包命令使用示例

抓包工具:
wireshark(Windows)
tcpdump(Linux)

tcpdump  协议  -i 网卡  -s 0  -c 抓包数量  and  src/dst  port 端口号  -w  XXX.cap        
         tcp                                             net  网段             
         udp                                             host 主机IP
         icmp
tcpdump tcp -i ens33 -t -s 0 -c 100 port ! 22 and net 192.168.1.0/24 -w ./target.cap

解析上述命令:

  1. tcp:指定仅捕获TCP协议的数据包。
  2. -i ens33:指定捕获经过ens33网络接口的数据包。
  3. -t:不显示时间戳。
  4. -s 0:抓取数据包时不限制长度,即抓取完整的数据包。
  5. -c 100:仅捕获100个数据包后停止。
  6. port ! 22:过滤掉端口号为22的数据包(注意:在tcpdump中,and关键字用于组合条件,但应放在正确的位置;在此示例中,应调整条件顺序或使用括号)。
  7. net 192.168.1.0/24:仅捕获目标或源IP地址在192.168.1.0/24网段内的数据包。
  8. -w ./target.cap:将捕获的数据包保存到./target.cap文件中,以便后续使用Wireshark等工具进行分析。

注意:上述命令中的port ! 22 and net 192.168.1.0/24可能不会按预期工作,因为tcpdump的过滤表达式在某些版本或上下文中可能不支持and的直接使用,或者需要适当的括号来明确条件组合。正确的命令可能需要根据tcpdump的具体版本和用法进行调整,例如:

tcpdump tcp -i ens33 -t -s 0 -c 100 'not port 22 and net 192.168.1.0/24' -w ./target.cap

使用单引号'将整个过滤表达式括起来,并在not port 22net 192.168.1.0/24之间添加and(或根据需要调整逻辑),以确保过滤条件按预期工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值