参考文章:
https://www.jianshu.com/p/8b0642cf8d34
https://blog.csdn.net/u011537073/article/details/82685586
https://blog.csdn.net/weixin_42497941/article/details/105219278
iptables是集成在linux内核中的包过滤防火墙系统, 是linux防火墙系统的重要组成部分。
二、iptables原理先来看下主机如何处理数据包:当主机收到一个数据包后, 数据包会先在内核空间进行处理, 若发现目的地址是自身, 则传到用户空间交给相应的应用程序处理, 若目的地址不是自身, 则会将包丢弃或转发。
而iptables的主要功能就是在内核处理数据包的几个关键位置添加对数据包的处理“规则”,即对数据包进出设备及转发的控制。
数据包在内核中会经过五个关键位置, 分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING, iptables这款属于用户进程的软件就是通过在这五个位置增加包处理规则,来实现包过滤防火墙的功能。
规则一般的定义就是“若收到的数据包符合这样的条件, 就这样处理该数据包”。 规则一般存储在内核的包过滤表中。 iptables允许我们从 源地址,目的地址,传输协议,服务类型等维度制定包过滤规则, 对符合条件的包可以进行ACCPET、REJECT、DROP等处理。
iptables的命令主要就是添加、修改、删除这些规则。
内核对数据包的处理流程主要有以下三种
数据包地址是本机:数据包从1进入内核,经过PREROUTING和INPUT,由INPUT决定是否交给用户进程。流程为1->2数据包目的地址非本机:数据包从1进入内核,经过PREROUTING、FORWARD和POSTROUTING,流程为1->3->4->6用户进程发送数据包:数据包经过OUTPUT和POSTROUTING, 流程为5->6 2. 链
链就是文中提到的PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING, 即共有5个链。从上面包传输方式可以看出, 链就是数据包的传输路径。每一条链中都可以有一条或多条规则, 当数据包到达一个链时, iptables就会从链中的第一条规则开始检查匹配, 看数据包是否满足规则所定义的条件;如果满足条件, 系统就会根据该条规则所定义的方法(ACCPET/DROP等)处理该数据包; 否则iptables将继续检查下一条规则, 如果不符合链中的任意一条规则, 则会根据该链预先定义的默认策略处理数据包。
PREROUTING: 对数据包作路由选择前应用此链中的规则【所有数据包进来的时候,都先由此链处理】
INPUT: 进来的数据包应用此链中的规则
OUTPUT:从本机发出去的包应用此链中的规则
FORWARD:转发数据包时应用此链中的规则
POSTROUTING:对数据包作路由选择后应用此链的规则【所有数据包发出的时候都由此链处理】
iptables有一种表的结构, 它用来区别iptables提供的各种功能。包括filter、nat、mangle、raw四张表,这些表的优先级是raw > mangle > nat > filter
filter:实现包过滤, 包含链: INPUT、FORWARD、OUTPUT
即在它的包含链中,可以设置包过滤规则, 比如过滤所有经过INPUT的包
nat: 用于网络地址转换(IP、PORT) 包含链:PREROUTING、OUTPUT、POSTROUTING
即在它的包含链中,可以设置包的网络地址等,比如对所有要发送出去的包进行port的转换
Mangle:实现包修改, 包含链:全部五个链
可以修改包的服务类型,TTL,并且可以配置路由实现QOS, 虽然看着很复杂, 但一般设置策略时不会用到
raw: 实现数据跟踪,决定数据包是否被状态跟踪机制处理 包含链:OUTPUT、PREROUTING
四、基本语法iptables [-t 表] [操作命令] [链] [条件、规则匹配] [-j 目标动作]
表、链、目标动作前面都有提及, 操作命令和规则匹配整理如下:
1、 操作命令| 操作命令 | 说明 |
|---|---|
| -A | 在指定链尾部添加规则 |
| -D | 删除匹配的规则 |
| -R | 替换匹配的规则 |
| -I | 在指定位置插入规则 |
| -L/S | 列出指定链或所有链的规则 |
| -F | 删除指定链或所有链的规则 |
| -N | 创建用户自定义链 |
| -X | 删除指定的用户自定义链 |
| -P | 为指定链设置默认规则策略,对自定义链不起作用 |
| -Z | 将指定链或所有链的计数器清零 |
| -E | 更改自定义链的名称 |
| -n | ip地址和端口号以数字方式显示 |
| 常用规则匹配器 | 说明 |
|---|---|
| -p tcp/udp/icmp/all | 匹配协议, all会匹配所有协议 |
| -s addr[/mask] | 匹配源地址 |
| -d addr[/mask] | 匹配目的地址 |
| –sport port1[:port2] | 匹配源端口 |
| –dport port1[:port2] | 匹配源端口 |
| -o interface | 匹配出口网卡,只适用于FORWARD、POSTROUTING、OUTPUT |
| -i interface | 匹配入口网卡,只使用PREROUTING、INPUT、FORWARD |
| –icmp-type | 匹配icmp类型 |
| –tcp-flags mask comp | 匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。(例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT 表示匹配SYN和ACK标记的数据包) |
| 目标动作 | 说明 |
|---|---|
| ACCEPT | 允许数据通过 |
| DROP | 丢弃数据包 |
| REJECT | 丢弃数据包, 并且将拒绝信息发给对方 |
| SNAT | 源地址转换(在nat表上)例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1 |
| DNAT | 目标地址转换(在nat表上)例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102 |
| REDIRECT | 目标端口转换(在nat表上)例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80 |
| MARK | 将数据包打上标记;例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60 |
对于CentOS7以上版本, 需要安装iptables-service,
yum install -y iptables-services.x86_64
安装后查看状态
systemctl status iptables
如果本机有firewall, 则需要先关掉
systemctl stop firewalld systemctl disable firewalld
启用iptables-services
systemctl enable iptables systemctl start iptables
规则保存
service iptables save
命令可将iptables当前运行的条目保存到/etc/sysconfig/iptables,主机重启后将会自动加载防火墙条目。
五、常见规则


