目录
1. Linux防火墙基础
1.1 iptables 的表、链结构
1.规则表
2.规则链
1.2 数据包过滤的匹配流程
1.2.1 规则表之间的顺序
1.2.2 规则链之间的顺序
1.2.3 规则链内部各条防火墙规则之间的顺序
1.3 编写防火墙规则
1.3.1 安装iptables
1.3.2 基本语法、数据包控制类型
1.3.3 添加、查看、删除规则等基本操作
1. 添加新规则
2. 查看规则列表
3. 删除、清空规则
4. 设置默认策略
1.4 规则的匹配条件
1.4.1 通用匹配
(1)协议匹配
(2)地址匹配
(3)网络接口匹配
1.4.2 隐含匹配
(1)端口匹配
(2)ICMP类型匹配
3. 显示匹配
(1)多端口匹配
(3)MAC地址匹配
(4)状态匹配
netfilter:指的是 Linux 内核中实现包过滤防火墙的内部结构,不以程序或文件的形式
存在,属于“内核态”(Kernel Space,又称为内核空间)的防火墙功能体系。
iptables:指的是用来管理 Linux 防火墙的命令程序,通常位于/sbin/iptables 目录下,
属于“用户态”(User Space,又称为用户空间)的防火墙管理体系。
其中,每个规则“表”相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表;在每个“表”容器内包括不同的规则“链”,根据处理数据包的不同时机划分为五种链;而决定是否过滤或处理数据包的各种规则,则是按先后顺序存放在各规则链中。
filter 表:filter 表用来对数据包进行过滤,根据具体的规则要求决定如何处理一个数据包。filter 表对应的内核模块为 iptable_filter,表内包含三个链,即 INPUT、FORWARD、OUTPUT。
nat 表:nat(Network Address Translation,网络地址转换)表主要用来修改数据包的IP 地址、端口号等信息。nat 表对应的内核模块为 iptable_nat,表内包含三个链,即PREROUTING、POSTROUTING、OUTPUT。
mangle 表:mangle 表用来修改数据包的 TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期),或者为数据包设置 Mark 标记,以实现流量整形、策略路由等高级应用 。mangle 表 对 应 的 内 核 模 块 为 iptable_mangle,表内包含五个链,即PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD。
raw 表:raw 表是自 1.2.9 以后版本的 iptables 新增的表,主要用来决定是否对数据包进行状态跟踪。raw 表对应的内核模块为 iptable_raw,表内包含两个链,即 OUTPUT、PREROUTING。
INPUT 链:当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。
OUTPUT 链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
FORWARD 链:当接收到需要通过防火墙中转发送给其他地址的数据包(转发)时,应用此链中的规则
PREROUTING 链:在对数据包做路由选择之前,应用此链中的规则。
POSTROUTING 链:在对数据包做路由选择之后,应用此链中的规则。
入站数据流向:来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理(是否修改数据包地址等),
然后进行路由选择(判断该数据包应发往何处);
如果数据包的目标地址是防火墙本机(如 Internet 用户访问网关的 Web 服务端口),那么内核将其传递给 INPUT 链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(如 httpd 服务器)进行响应。
转发数据流向:来自外界的数据包到达防火墙后,首先被 PREROUTING 链处理,然后再进行路由选择;
如果数据包的目标地址是其他外部地址(如局域网用户通过网关访问 QQ 服务器),则内核将其传递给 FORWARD 链进行处理(允许转发或拦截、丢弃),最后交给 POSTROUTING 链(是否修改数据包的地址等)进行处理。
出站数据流向:防火墙本机向外部地址发送的数据包(如在防火墙主机中测试公网 DNS服务时),首先进行路由选择,确定了输出路径后,再经由 OUTPUT 链处理,最后再交给 POSTROUTING 链(是否修改数据包的地址等)进行处理。
本章主要介绍 netfilter 防火墙的管理工具——iptables 命令的使用,包括基本的语法格式、数据包控制类型,以及如何管理、编写防火墙规则等。
[root@node1 ~]# systemctl stop firewalld.service
[root@node1 ~]# systemctl disable firewalld.service
[root@node1 ~]#
[root@node1 ~]# yum -y install iptables-services
[root@node1 ~]# systemctl start iptables.service
[root@node1 ~]# systemctl enable iptables.service
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@node1 ~]#
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
下面介绍一个防火墙规则操作示例:在 filter 表(-t filter)的 INPUT 链中插入(-I)一条规则,拒绝(-j REJECT)发给本机的使用 ICMP 协议的数据包(-p icmp)。
[root@node1 ~]# iptables -t filter -I INPUT -p icmp -j REJECT
上述操作产生的直接效果是其他主机无法 ping 通本机。
[root@node1 ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
[root@node1 ~]#
[root@node1 ~]# iptables -I INPUT -p udp -j ACCEPT
[root@node1 ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
[root@node1 ~]#
[root@node1 ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 REJECT icmp -- anywhere anywhere reject-with icmp-port-unreachable
4 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
5 ACCEPT icmp -- anywhere anywhere
6 ACCEPT all -- anywhere anywhere
7 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
8 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
9 ACCEPT tcp -- anywhere anywhere
[root@node1 ~]#
[root@node1 ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
[root@node1 ~]#
删除前:
[root@node1 ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 REJECT icmp -- anywhere anywhere reject-with icmp-port-unreachable
4 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
5 ACCEPT icmp -- anywhere anywhere
6 ACCEPT all -- anywhere anywhere
7 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
8 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
9 ACCEPT tcp -- anywhere anywhere
[root@node1 ~]#
删除后:
[root@node1 ~]# iptables -D INPUT 3
[root@node1 ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
[root@node1 ~]#
[root@node1 ~]# iptables -F INPUT
[root@node1 ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
[root@node1 ~]#
[root@node1 ~]# iptables -F
[root@node1 ~]# iptables -t nat -F
[root@node1 ~]# iptables -t mangle -F
[root@node1 ~]#
[root@node1 ~]# iptables -t filter -P FORWARD DROP
[root@node1 ~]# iptables -P OUTPUT ACCEPT
[root@node1 ~]#
[root@node1 ~]# iptables -I INPUT -p icmp -j DROP
[root@node1 ~]# iptables -A FORWARD ! -p icmp -j ACCEPT (## !代表取反)
[root@node1 ~]#
[root@node1 ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
[root@node1 ~]# iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
[root@node1 ~]#
[root@node1 ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP
[root@node1 ~]# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
[root@node1 ~]#
[root@node1 ~]# iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP
[root@node1 ~]# iptables -A INPUT -i ens33 -s 172.16.0.0/12 -j DROP
[root@node1 ~]# iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP
[root@node1 ~]#
[root@node1 ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
[root@node1 ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --sport 53 -j ACCEPT
[root@node1 ~]#
[root@node1 ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
[root@node1 ~]# iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT
[root@node1 ~]#
[root@node1 ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@node1 ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@node1 ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
[root@node1 ~]# iptables -A INPUT -p icmp -j DROP
[root@node1 ~]#
[root@node1 ~]# iptables -p icmp -h
iptables v1.4.21
Usage: iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
......
[root@node1 ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
[root@node1 ~]#
(2)IP范围匹配
[root@node1 ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j DROP
[root@node1 ~]#
[root@node1 ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
[root@node1 ~]#
[root@node1 ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
[root@node1 ~]#
[root@node1 ~]# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
[root@node1 ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@node1 ~]# iptables -P INPUT DROP
[root@node1 ~]#