iptables 常见概念
8.1.1 iptables 概述
netfilter/iptables:IP 信息包过滤系统, 它实际上由两个组件 netfilter 和 iptables 组成.
netfilter/iptables 关系:
netfilter 组件也称为内核空间 (kernelspace), 是内核的一部分, 由一些信息包过滤表组成, 这些表包含内核用来控制信息包过滤处理的规则集.
iptables 组件是一种工具, 也称为用户空间 (userspace), 它使插入, 修改和除去信息包过滤表中的规则变得容易.
netfilter/iptables 后期简称为: iptables. iptables 是基于内核的防火墙, 功能非常强大, iptables 内置了 filter,nat 和 mangle 三张表. 所有规则配置后, 立即生效, 不需要重启服务.
8.1.2 三张表介绍
filter 负责过滤数据包, 包括的规则链有, input,output 和 forward;
nat 则涉及到网络地址转换, 包括的规则链有, prerouting,postrouting 和 output;
mangle 表则主要应用在修改数据包内容上, 用来做流量 *** 的, 给数据包打个标识, 默认的规则链有: INPUT,OUTPUT, forward,POSTROUTING,PREROUTING;
五个链
input 匹配目标 IP 是本机的数据包.
output 出口数据包, 一般不在此链上做配置
forward 匹配流经本机的数据包,
prerouting 用来修改目的地址, 用来做 DNAT . 如: 把内网中的 80 端口映射到路由器外网端口上
postrouting 用来修改源地址用来做 SNAT. 如: 内网通过路由器 NAT 转换功能实现内网 PC 机通过一个公网 IP 地址上网.
总结: iptables 三个表, 5 个链接, 结构如图:
raw 表: 用于处理异常, 包括的规则链有, prerouting,output; 一般使用不到, raw 在整个防火墙体系优先级最高, 如果启动用 raw 表, 数据将会跳过 conntrack(连接跟踪机制)
[[email protected] ~]# iptables -t raw -L
Iptables 过滤封包流程, 表 -> 链 -> 规则
整体数据包分两类: 发给防火墙本身的数据包, 和需要经过防火墙的数据包.
当一个数据包进入网卡时, 它首先进入 PREROUTING 链, 内核根据数据包目的 IP 判断是否需要转送出去.
如果数据包就是进入本机的, 它就会沿着图向下移动, 到达 INPUT 链. 数据包到了 INPUT 链后, 任何进程都会收到它.
本机上运行的程序可以发送数据包, 这些数据包会经过 OUTPUT 链, 然后到达 POSTROUTING 链输出.
如果数据包是要转发出去的, 且内核允许转发, 数据包就会如图所示向右移动, 经过 FORWARD 链, 然后到达 POSTROUTING 链输出.
表, 链, 规则处理的顺序
表间的优先顺序
raw> mangle> nat> filter
链间的匹配顺序
入站数据: PREROUTING,INOUT
出站数据: OUTPUT,POSTROUTING
转发数据: PREROUTING,FORWARD,POSTROUTING
链内的匹配顺序
自上向下按顺序依次进行检查, 找到相匹配的规则即停止
若在该链内找不到的相匹配的规则, 则按该链的默认策略处理 (未修改的情况下, 默认策略为允许)
注意: 规则的次序非常关键, 谁的规则越严格, 应该放的越靠前, 而检查规则的时候, 是按照从上往下的方式进行检查的.
iptables 服务器安装及相关配置文件
Iptables 部署
Iptables 是逻辑性比较强的服务, 所以我们一个一个的实验疏通
安装
关闭 firewall:
[[email protected] ~]# systemctl stop firewalld.service
停止 firewalld 开机启动
[[email protected] ~]# systemctl disable firewalld.service
安装 iptables
[[email protected] ~]# yum ***tall iptables-services
配置文件位置
- [[email protected] ~]# ls /etc/sysconfig/iptables
- /etc/sysconfig/iptables
启动服务
- [[email protected] ~]# systemctl start iptables.service
- [[email protected] ~]# systemctl enable iptables.service
- Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
iptables 使用方法
iptables 命令的语法格式
Iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或或跳转]
注意事项
不指定表名时, 默认表示 filter 表
不指定链名时, 默认表示该表内所有链
除非设置规则链的缺省策略, 否则需要指定匹配条件
iptables 语法总结:
iptables 命令使用方法
iptables [-t 要操作的表]
< 操作命令 >
[要操作的链]
[规则号码]
[匹配条件]
[-j 匹配到以后的动作]
操作命令
-A 添加规则
-I num 插入, 把当前规则插入为第几条
-D num 删除, 明确指定删除第几条规则
-P 设置默认策略的
-F 清空规则链的
查看命令
-[vnx]L
-L 列出规则
-n 以数字格式显示 ip 和 port, 需要配合 - L 选项使用
-v 显示信息, 以详细信息显示
-A < 链名 > APPEND, 追加一条规则 (放到最后)
拒绝所有人访问
[[email protected] ~]# iptables -t filter -A INPUT -j DROP
在 filter 表的 INPUT 链里追加一条规则 (作为最后一条规则)
匹配所有访问本机 IP 的数据包, 匹配到的丢弃
-I < 链名 > [规则号码] INSERT, 插入一条规则
[[email protected] ~]# iptables -I INPUT -j DROP
在 filter 表的 INPUT 链里插入一条规则 (插入成第 1 条)
iptables -I INPUT 3 -j DROP
在 filter 表的 INPUT 链里插入一条规则 (插入成第 3 条)
注意:
-t filter 可不写, 不写则自动默认是 filter 表
-I 链名 [规则号码], 如果不写规则号码, 则默认是 1
确保规则号码 ≤ (已有规则数 + 1), 否则报错
-R num:Replays 替换 / 修改第几条规则
格式: iptables -t filter -R INPUT 3 ......... 修改 filter 的 INPUT 链第三条规则
-D < 链名 > < 规则号码 | 具体规则内容 > DELETE, 删除一条规则
例如:
[[email protected] ~]#iptables -P INPUT DROP
注意:
当数据包没有被规则列表里的任何规则匹配到时, 按此默认规则处理. 动作前面不能加 -j, 这也是唯一 一种匹配动作前面不加 -j 的情况.
-F [链名] FLUSH, 清空规则
- [[email protected] ~]# iptables -t filter -A INPUT -j DROP
- # 清除 INPUT 链上的规则
- [[email protected] ~]# iptables -F INPUT
- # 清除 filter 表中所有链上的规则
- [[email protected] ~]#iptables -F
- # 清空 NAT 表中所有链上的规则
- [[email protected] ~]# iptables -t nat -F
- # 清空 NAT 表中 PREROUTING 链上的规则
- [[email protected] ~]# iptables -t nat -F PREROUTING
注意:
-F 仅仅是清空链中规则, 并不影响 -P 设置的默认规则. 需要手动改:
[[email protected] ~]# iptables -P INPUT ACCEPT
-P 设置了 DROP 后, 使用 -F 一定要小心!!
# 在生产环境中, 使用 - P DROP 这条规则, 一定要小心, 设置之前最好配置下面两个任务计划, 否则容易把自己 drop 掉, 链接不上远程主机.
配置 crontab :
/15 iptables -P INPUT ACCEPT/15 iptables -F
如果不写链名, 默认清空某表里所有链里的所有规则
-Z 将封包计数器归零
[[email protected] ~]# iptables -Z INPUT
-L [链名] LIST, 列出规则
v: 显示详细信息, 包括每条规则的匹配包数量和匹配字节数
x: 在 v 的基础上, 禁止自动单位换算 (K,M)
n: 只显示 IP 地址和端口号码, 不显示域名和服务名称
--line-number: 可以查看到规则号
例如:
iptables -L
粗略列出 filter 表所有链及所有规则
iptables -t nat -vnL
用详细方式列出 nat 表所有链的所有规则, 只显示 IP 地址和端口号
iptables -t nat -vxnL PREROUTING
用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字, 不反解
互动: iptables -L -n 可以执行成功
iptables -Ln 是否可以执行成功?
8.3.2 匹配条件
流入, 流出接口 (-i,-o)
来源, 目的地址 (-s,-d)
协议类型 (-p)
来源, 目的端口 (--sport,--dport)
按网络接口匹配
-i < 匹配数据进入的网络接口 > #此参数主要应用于 nat 表, 例如目标地址转换
例如:
-i ens33
匹配是否从网络接口 ens33 进来
-i ppp0
匹配是否从网络接口 ppp0 进来
-o 匹配数据流出的网络接口
例如:
-o ens33
-o ppp0
按来源目的地址匹配
-s < 匹配来源地址 >
可以是 IP, 网段, 域名, 也可空 (任何地址)
例如:
-s 192.168.0.1 匹配来自 192.168.0.1 的数据包
-s 192.168.1.0/24 匹配来自 192.168.1.0/24 网络的数据包
-s 192.168.0.0/16 匹配来自 192.168.0.0/16 网络的数据包
-d < 匹配目的地址 >
可以是 IP, 网段, 域名, 也可以空
例如:
-d 202.106.0.20 匹配去往 202.106.0.20 的数据包
-d 202.106.0.0/16 匹配去往 202.106.0.0/16 网络的数据包
-d www.abc.com 匹配去往域名 www.abc.com 的数据包
按协议类型匹配
-p < 匹配协议类型 >
可以是 TCP,UDP,ICMP 等, 也可为空
例如:
-p tcp
-p udp
-p icmp --icmp-type 类型
ping: type 8 ping: type 0
按来源目的端口匹配
--sport < 匹配源端口 >
可以是个别端口, 可以是端口范围
例如:
--sport 1000 匹配源端口是 1000 的数据包
--sport 1000:3000 匹配源端口是 1000-3000 的数据包 (含 1000,3000)
--sport :3000 匹配源端口是 3000 以下的数据包 (含 3000)
--sport 1000: 匹配源端口是 1000 以上的数据包 (含 1000)
--dport < 匹配目的端口 >
可以是个别端口, 可以是端口范围
例如:
--dport 80 匹配目的端口是 80 的数据包
--dport 6000:8000 匹配目的端口是 6000-8000 的数据包 (含 6000,8000)
--dport :3000 匹配目的端口是 3000 以下的数据包 (含 3000)
--dport 1000: 匹配目的端口是 1000 以上的数据包 (含 1000)
注意:--sport 和 --dport 必须配合 -p 参数使用
匹配应用举例
端口匹配
-p udp --dport 53
匹配网络中目的端口是 53 的 UDP 协议数据包
地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16
匹配来自 10.1.0.0/24 去往 172.17.0.0/16 的所有数据包
端口和地址联合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80
匹配来自 192.168.0.1, 去往 www.abc.com 的 80 端口的 TCP 协议数据包
注意:
--sport,--dport 必须联合 -p 使用, 必须指明协议类型是什么
条件写的越多, 匹配越细致, 匹配范围越小
8.3.3 动作 (处理方式)
- ACCEPT
- DROP
- SNAT
- DNAT
- MASQUERADE
- -j ACCEPT
通过, 允许数据包通过本链而不拦截它
例如:
iptables -A INPUT -j ACCEPT
允许所有访问本机 IP 的数据包通过
-j DROP
丢弃, 阻止数据包通过本链而丢弃它
例如:
iptables -A FORWARD -s 192.168.80.39 -j DROP
阻止来源地址为 192.168.80.39 的数据包通过本机
-j SNAT --to IP[-IP][: 端口 - 端口](nat 表的 POSTROUTING 链)
源地址转换, SNAT 支持转换为单 IP, 也支持转换到 IP 地址池 (一组连续的 IP 地址)
例如:
- [[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
- # 将内网 192.168.0.0/24 的原地址修改为 1.1.1.1, 用于 NAT
- iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
同上, 只不过修改成一个地址池里的 IP
-j DNAT --to IP[-IP][: 端口 - 端口](nat 表的 PREROUTING 链)
目的地址转换, DNAT 支持转换为单 IP, 也支持转换到 IP 地址池
(一组连续的 IP 地址)
例如:
表达方式 1: 把从 eth0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1.
[[email protected] ~]# iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.0.1
表达方式 2:
[[email protected] ~]# iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 81 -j DNAT --to 192.168.0.1:81
表达方式 3: 把从 eth0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1-192.169.1.10
[[email protected] ~]# iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.169.0.10
-j MASQUERADE 伪装
动态源地址转换 (动态 IP 的情况下使用)
例如:
[[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ens33 -j MASQUERADE
将源地址是 192.168.0.0/24 的数据包进行地址伪装, 转换成 ens33 上的 IP 地址. ens33 为路由器外网出口 IP 地址
8.3.4 附加模块
按包状态匹配 (state)
按来源 Mac 匹配 (Mac)
按包速率匹配 (limit)
多端口匹配 (multiport)
按包状态匹配 (state)
-m state --state 状态
状态: NEW,RELATED,ESTABLISHED,INVALID
NEW: 有别于 tcp 的 syn #如果我们发送一个流的初始化包, 状态就会在 OUTPUT 链 里被设置为 NEW, 当我们收到回应的包时, 状态就会在 PREROUTING 链里被设置为 ESTABLISHED. 如果第一个包不是本地产生的, 那就会在 PREROUTING 链里被设置为 NEW 状 态.
ESTABLISHED: 连接态
RELATED: 衍生态, 与 conntrack 关联 (FTP)
INVALID: 不能被识别属于哪个连接或没有任何状态
例如:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
四个状态详解:
这些状态可以一起使用, 以便匹配数据包. 这可以使我们的防火墙非常强壮和有效. 以前, 我们经常打 开 1024 以上的所有端口来放行应答的数据. 现在, 有了状态机制, 就不需再这样了. 因为我们可以只开放那些有应答数据的端口, 其他的都可以关闭. 这样就安全多了.
按来源 Mac 匹配 (Mac)
-m Mac --Mac-source Mac
匹配某个 Mac 地址
例如:
iptables -A FORWARD -m Mac --Mac-source xx:xx:xx:xx:xx:xx -j DROP
阻断来自某 Mac 地址的数据包, 通过本机
注意:
报文经过路由后, 数据包中原有的 Mac 信息会被替换, 所以在路由后的 iptables 中使用 Mac 模块是没有意义的
按包速率匹配 (limit)
-m limit --limit 匹配速率 [--burst 缓冲数量]
用一定速率去匹配数据包
例如:
- iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
- iptables -A FORWARD -d 192.168.0.1 -j DROP
注意:
limit 英语上看是限制的意思, 但实际上只是按一定速率去匹配而已, 50/s 表示 1 秒中转发 50 个数据包, 要想限制的话后面要再跟一条 DROP
多端口匹配 (multiport)
-m multiport <--sports|--dports|--ports> 端口 1[, 端口 2,.., 端口 n]
一次性匹配多个端口, 可以区分源端口, 目的端口或不指定端口
例如:
iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT
必须与 -p 参数一起使用
- [[email protected] ~]# iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT
- [[email protected] ~]# service iptables save
- iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
总结:
iptables 常见概念
iptables 服务器安装及相关配置文件
实战: iptables 使用方法
来源: http://www.bubuko.com/infodetail-3092756.html