目录
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范围匹配