1. 一些相关的概念
1. 链的概念
- 如上图,linux系统中提供了五个链
- prerouting:数据包进入路由表之前
- input:通过路由表后目的地为本机
- forword:通过路由表后目的地不为本机
- output:由本机产生,向外转发
- postrouting:发送到网卡接口之前
- 在链上可以放置一系列规则(匹配条件+动作=规则)。
- 每一个要经过这些链的报文,都会按照这些链上的所有规则进行匹配一遍。如果有符合条件的规则,则需要执行对应的动作
2. 表的概念
- 将规则分类,把相同类别的规则放在一张表中。linux提供的4张表:(优先级由低到高)
- filter表:负责过滤功能
- nat表:负责网络地址转换功能
- mangle表:负责拆解报文,做出修改,并重新封装的功能
- raw表:决定数据包是否被状态跟踪机制处理
3. 四表五链的关系
3. iptables查看规则命令
3.1 查看指定表上的所有规则
iptables -t filter -L
- -L表示查看规则
- -t 指定查看哪张表,不写默认查看filter这张表
3.2 查看指定链上的指定表的所有规则
iptables -t filter -L INPUT
3.3 查看指定链上的指定表的所有规则(详细信息)
- -v:verbose。详细的
# -v显示详细信息
iptables -t filter -vL FORWARD
#-n:不对ip进行反解析
iptables -t filter -vnL FORWARD
# 命令显示结果
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
929K 255M DOCKER-USER all -- any any anywhere anywhere
929K 255M DOCKER-ISOLATION-STAGE-1 all -- any any anywhere anywhere
431K 53M ACCEPT all -- any docker0 anywhere anywhere ctstate RELATED,ESTABLISHED
42321 2410K DOCKER all -- any docker0 anywhere anywhere
456K 199M ACCEPT all -- docker0 !docker0 anywhere anywhere
0 0 ACCEPT all -- docker0 docker0 anywhere anywhere
- 第一行说明了哪条链
- 第二行显示了许多字段
- pkts:对应规则匹配到的报文的个数
- bytes:对应规则匹配的报文包的大小总和
- target:规则对应的动作,即匹配成功后需要采取的措施
- prot:规则对应的协议,是否只针对某些协议应用此规则
- opt:规则的可选项
- in:表示数据包从哪个网卡流入。我们可以设置通过哪个网卡流入的报文需要匹配当前规则
- out:表示数据包从哪个网卡流出,我们可以设置通过哪个网卡流出的报文需要匹配当前规则
- source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段
- destination:表示规则对应的目标地址,可以是一个IP,也可以是一个网段
4. 增加规则
4.1 拒绝指定主机所有报文访问当前机器
# 在指定链的首部位置添加规则
iptables -t filter -I INPUT -s 192.168.1.146 -j DROP
# 在指定链的指定位置添加规则
iptables -t filter -I INPUT 5 -s 192.168.1.146 -j DROP
# 在指定链的尾部位置添加规则
iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
- -I : 插入规则。默认在链的首部添加一条规则
- -A:在链的尾部添加规则
- -s:表示源地址
- -j:匹配条件满足时对应的动作(可选项有ACCEPT,DROP,REJECT。)
4.2 给指定表的指定链设置默认策略(动作)
iptables -t filter -P FORWARD ACCEPT
- -P:设置某个链的默认策略
5. 删除规则
5.1 按指定表的指定链上的编号删除规则
# 查看指定表上的指定链的规则编号
iptables --line-numbers -nvL INPUT
# 删除指定表上的指定链的第3条规则
iptables -t filter -D INPUT 3
- -D:删除规则
5.2 清空指定表的指定链上的所有规则
iptables -t filter -F INPUT
-F:flush,清空
5.3 清空指定表上的所有规则
iptables -t filter -F
6. 保存规则
- 默认清空下,我们对防火墙做出的修改都是临时的。重启iptables或者服务器,我们平时添加的规则都会消息
6.1 centos6中保存规则
# centos6中
service iptables save
- 默认保存到/etc/sysconfig/iptables文件中
6.2 通用保存规则
# 将保存规则显示到终端
iptables-save
# 保存规则
iptables-save > /etc/sysconfig/iptables
6.3 载入规则
iptables-restore < /etc/sysconfig/iptables
7. 添加规则的基本匹配条件
7.1 指定多个ip,或者指定一个网段
# 逗号左右不能有空格
iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP
# 指定网段
iptables -t filter -I INPUT -s 192.168.1.0/24 -j DROP
# 指定目标地址
iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
-d:目标地址
7.2 匹配协议
iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
- -p :protocol协议
7.3 匹配网卡
iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
8.添加规则的扩展匹配条件
- 扩展匹配条件依赖于基本匹配条件。
8.1 添加端口匹配
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22 -j REJECT
iptables -t filter -I OUTPUT -s 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
# 支持匹配连续范围的端口
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
- -m tcp:表明是tcp的扩展匹配
- --dport:目的端口
iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
- -m multiport :多端口扩展匹配
8.2 iprange扩展模块
# 匹配源地址在某个范围之间
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP
- -m iprange:ip范围匹配扩展模块
- --src-range:源地址范围
8.3 icmp扩展
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
- -m icmp:icmp的扩展模块
- --icmp-type 8/0 : 匹配icmp的type=8,code=0的报文。
8.4 tcp扩展
iptables -t filter -I INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
# 简写形式
iptables -t filter -I INPUT -p tcp -m tcp --tcp-flags ALL SYN -j REJECT
- --tcp-flags:需要两个参数
- 第一个参数是需要匹配哪些标志位(用逗号分割)
- 第二个参数是哪些标志位置位1才算匹配成功
9. 自定义链
9.1 为什么自定义链
- 默认链中的规则过多则不方便管理
9.1 创建自定义链
iptables -t filter -N IN_WEB
- -N:创建自定义链
9.2 给自定义连添加规则
iptables -t filter -I IN_WEB -s 192.168.1.139 -j REJECT
- 跟给系统自带的链添加规则一样
9.3 将自定义链挂载到默认五链中使其生效
# 在指定表上的指定链的指定端口匹配的报文上生效我们的自定义链。
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB
9.4 指定链重命名
iptables -E IN_WEB WEB
9.5 删除指定链
iptables -X WEB
- 运行删除的条件
- 自定义链上没有被引用
- 自定义链上没有任何规则
10. 动作
- ACCEPT:接受
- DROP:丢弃
- REJECT:决绝
- LOG:记录日志
- SNAT:源地址转换
- DNAT:目标地址转换
- MASQUERADE:源地址动态转换为指定网卡上可用的IP地址
- REDIRECT:重定向:将本机端口映射到本机的另一个端口
10.1 SNAT
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146
- --to-source:将源地址改为指定地址
10.2 DNAT
iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 801 -j DNAT --to-destination 10.1.0.1:80
10.3 MASQUERADE
iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE
- -o:出口网卡
10.4 REDIRECT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080