目录
1 Linux网络防火墙命令的关系图
下图是Linux网络防火墙命令的关系图,Ubuntu的ufw已经学习过了,今天来做一下iptables试验。
CentOS Ubuntu★ openSUSE
+--------------+ +------------+ +---------------------+ -*-
| firewall-cmd | | ufw | | SUSEfirewall2 | |
+--------------+ +------------+ +---------------------+ |
用户空间
+-----------------------------------------------------------+ |
| iptables command | |
+-----------------------------------------------------------+ -*-
+-----------------------------------------------------------+ -*-
| | |
| OS(Netfilter) | 内核空间
| | |
+-----------------------------------------------------------+ -*-
2 iptables的概念
iptables可以检测、修改、转向、分组和丢弃IPv4数据包。看名字,顾名思义,是工作在网络层。要想理解iptables能做什么,然后什么时候用iptables,先得对iptables有个系统的概念。
结合上面的iptables的数据流来说一下iptables的概念。
2.1 链(chain)
iptables有5条链,按照数据经过的顺序排列。
- PREROUTING-------数据进入网卡,进入路由前调用的链
- INPUT------------------数据经过路由后,进入本地程序前调用的链
- FORWARD-----------数据经过路由后,转发出去之前调用的链
- OUTPUT--------------本地程序产生的数据经过路由前调用的链
- POSTROUTING----经过路由后,从网卡发出之前调用的链
上面的5链是netfilter的内置链(built-in),用户可以自己创建链。
2.2 表(table)
iptables有5张表(不是4表5链)
- raw(不常用)
从上图可以看出,raw的优先级最高,有两个内置链。
- PREROUTING
- OUTPUT
因为这两个链都是在Connection Tracking之前被调用,所以系统跟踪不了,也就是 用conntrack命令监视不到。
- mangle(不常用)
该表用于专门的数据包更改。有所有的5个内置链。
- filter
首先,这是iptables的命令的默认表,也就是不指定表的时候,默认用filter。过滤用的。
有三个内置链。
- INPUT
- FORWARD
- OUTPUT
- security(基本不用)
SELinux security相关的。有三个内置链。
- INPUT
- FORWARD
- OUTPUT
- nat
用来做网络地址转换。有除了FORWARD以外的4个内置链。
raw | mangle | filter | security | nat | |
PREROUTING | ● | ● | ● | ||
INPUT | ● | ● | ● | ● | |
FORWARD | ● | ● | ● | ||
OUTPUT | ● | ● | ● | ● | ● |
POSTROUTING | ● | ● |
据上面的表格来看,主要用的就是filter表和nat表,也就是7条链。
2.3 规则(rule)
规则在链里,每条规则包含匹配的条件(match),和匹配条件后动作(target)。
2.3.1 匹配(match)
匹配条件 | 例子 |
---|---|
按协议匹配 | iptables -A INPUT -p tcp -j REJECT 所有TCP协议都拒绝 |
按源IP匹配 | iptables -A INPUT -s 192.168.0.0/24 -j REJECT 所有来自192.168.0网段的访问都拒绝 |
按目的IP匹配 | iptables -A OUTPUT -d 192.168.0.0/24 -j REJECT 所有去往192.168.0网段的访问都拒绝 |
按入网卡设备匹配 | iptables -A INPUT -i ens33 -j [TARGET] |
按出网卡设备匹配 | iptables -A FORWARD -o ens33 -j [TARGET] |
按源端口匹配 | iptables -A INPUT -p [tcp|udp] --sport 22 -j [TARGET] |
按目的端口匹配 | iptables -A INPUT -p [tcp|udp] --dport 22 -j [TARGET] |
还有各种各样的匹配条件,可以参照链接match
2.3.2 目标(target)
target就是匹配后执行的处理,常用的target有下列几种:
target | 处理内容 |
---|---|
ACCEPT | 匹配条件后,放行。 当前链的后面的规则,还有当前链所在的表的剩余链都不会执行。 |
LOG | 匹配条件后,写入日志 |
DROP | 匹配条件后,丢弃包(因为不会返回信息,发送方一直是等待状态,最好不用,可以用下面的REJECT) |
REJECT | 匹配条件后,丢弃包,并且会通知送信方,访问被拒(跟ufw里一样) REJECT 目标仅在 INPUT、FORWARD 和 OUTPUT 链或其子链中有效 |
RETURN | 如果是在子链中,匹配条件后,无视这条rule,如果是在主链中,则采取默认策略(ACCEPT,REJECT等等) |
REDIRECT | 匹配条件后,做端口转换 REDIRECT 目标仅在 nat 表的 PREROUTING 和 OUTPUT 链中有效 |
DNAT | 匹配条件后,做地址转换 DNAT 目标仅在 nat 表中的 PREROUTING 和 OUTPUT 链中有效 |
NOTRACK | 匹配条件后,数据不被跟踪。也就是用conntrack命令 看不到记录。 |
还有很多target,不常用,再有就是跳转到自定义的子链。
其它详细的可以参照target
2.4 链接追踪 Connection Tracking
# 用conntrack命令来跟踪数据包的路线
# Centos
yum install conntrack-tools
# Ubuntu
apt install conntrack
# 用法
conntrack -E