这里写目录标题

  • 概述
  • iptables的四表五链结构
  • 包过滤的匹配过程
  • iptables安装
  • iptables语法
  • 三种匹配规则
  • 通用匹配
  • 显示匹配
  • 隐含匹配


概述

防火墙分为两类:硬件防火墙+软件防火墙
Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制。属于典型的包过滤防火墙。linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和极高的效率,因此获得广泛的应用。
在很多安全技术资料中,netfilter和iptables都用来指linux防火墙,区别如下:
netfilter:指的是linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”又称内核空间的防火墙功能体系
iptables:指的是用来管理linux防火墙的命令程序,通常位于/sbin/iptables目录下,属于“用户态”又称用户空间的防火墙管理体系

iptables的四表五链结构

规则表
表的作用:容纳各种规则链
表的划分依据:防火墙规则的作用相似
默认四种规则表
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中的源、目标IP地址或端口
filter表:确定是否放行该数据包(过滤)

应用最多的是filter和nat
规则链
规则的作用:对数据包进行过滤或处理。
链的作用:容纳各种防火墙规则。
链的分类依据:处理数据包的不同时机。
默认五种规则链
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包
POSTROUTING:在进行路由选择后处理数据包
PREROUTING:在进行路由选择前处理数据包

包过滤的匹配过程

规则表应用顺序:raw→mangle→nat→filter

规则链的应用顺序取决于数据的流向

入站数据流向:PREROUTING→路由选择→INPUT→应用程序
转发数据流向:PREROUTING→路由选择→FORWARD→POSTROUTING
出站数据流向:OUTPUT→路由选择→POSTROUTING

规则链内部的处理规则

1、按顺序依次检查,匹配即停止(LOG策略例外)
2、若找不到相匹配的规则,则按该链的默认策略(默认策略是放通)处理

iptables安装

//
 [root@localhost ~]# systemctl stop firewalld.service
//关闭firewalld防火墙
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# yum -y install iptables iptables-service
//安装iptables防火墙
[root@localhost ~]# systemctl start iptables.service
[root@localhost ~]# systemctl enable iptables.service
//设置iptables开机自启

iptables语法

iptables 【-t 表名】 管理选项{【链名】【匹配条件】 【-j 控制类型】
【-t 表名】如果不指定表名,默认是filter表

// 
参数:
-A	在指定链末尾追加一条	iptables -A INPUT
-I	在指定链中插入一条新的,未指定序号默认作为第一条	iptables -I INPUT
-R	修改、替换某一条规则	iptables -t nat -R INPUT
-D	删除	iptables -t nat -D INPUT
-L	查看	iptables -L -t nat
-F	清除所有规则	iptables -F
-P	指定默认规则	iptables -P
-n	以数字形式显示	iptables -L -n’,iptables -nL
-n --line-number	规则带编号	iptables -L -n --line-number -t nat

控制选项:
控制选项	含义
ACCEPT	允许数据包通过
REJECT	拒绝数据包通过,必要时会给数据包发送端一个响应信息
DROP	直接丢弃数据包,不给任何回应
LOG	在/var/log/messages文件中记录日志信息,然后将数据包给下一条规则,它本身不处理数据包

配置

// 
[root@localhost ~]# iptables -t filter -S INPUT
//过滤出input链的规则   默认规则不在规则列表里面
[root@localhost ~]# iptables -t filter -L --line-number
//显示规则编号,每个链的规则编号

linux防火墙通过docker_包过滤

// 
[root@localhost ~]# iptables -t filter -L 
//看规则
[root@localhost ~]# iptables -L  
//默认是filter表
[root@localhost ~]# iptables -t filter -s

linux防火墙通过docker_linux防火墙通过docker_02

// 
[root@localhost ~]# iptables -t filter -L -v
//显示详情,多用于分析使用
[root@localhost ~]# iptables -vnL
//一般是这样子结合一起使用;

linux防火墙通过docker_路由选择_03


linux防火墙通过docker_linux防火墙通过docker_04

// 
[root@localhost ~]# iptables -t filter -F
//清空所有
[root@localhost ~]# iptables -t filter -X
//清空自定义的链
[root@localhost ~]# iptables -t filter -Z
//清空计数器   (数据包的数,字节的数)
//一般是一键三连   清空的干干净净
;

三种匹配规则

通用匹配

协议匹配
iptables编写协议匹配的规则时用-p指定协议名,如tcp、udp、icmp和all
不允许其他主机ping本机

// 
[root@firewall ~]# iptables -I INPUT -p icmp -j REJECT
[root@firewall ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     icmp --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

网络接口匹配
iptables编写地址匹配的规则时用 -i 进站接口名和 -o 出站接口名的形式
丢弃来自192.168.100.0网段并且从ens33接口进入的数据包

//
 [root@firewall ~]# iptables -A INPUT -i ens33 -s 192.168.100.0/24 -j DROP
;

地址匹配
iptables编写地址匹配的规则时用 -s:表示源地址,-d:表示目标地址
允许192.168.100.200这个主机ping本主机

//
 [root@firewall ~]# iptables -I INPUT -s 192.168.100.200 -p icmp -j REJECT
[root@firewall ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
REJECT     icmp --  192.168.100.200      anywhere             reject-with icmp-port-unreachable

显示匹配

配需要额外的内核模块提供支持,必须手动以‘-m 模块名称’的形式调用相应的模块

多端口匹配
编写多端口匹配时使用“-m multiport --dports 端口列表” “-m multiport --sports 端口列表” 的形式
例1:允许开放25,80,110,143端口,以便访问邮件和网站服务

//
 iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT;

开放ftp访问,冒号表示端口的范围从20-21端口

// 
[root@firewall ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT;

开放ftp访问的另一种方法,写成多端口模式,端口之间用逗号分隔

// 
[root@firewall ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21 -j ACCEPT

ip范围匹配
编写ip地址范围匹配时使用“-m iprange --src-range IP范围” “-m iprange --dst-range IP范围” 的形式

例1:不允许192.168.100.110-192.168.100.150范围的主机经过防火墙转发数据包

// 
[root@firewall ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.100.110-192.168.100.150 -j REJECT;

mac地址匹配
mac地址匹配:‘-m mac --mac-source MAC地址’
不允许mac地址为00:0c:29:52:c0:ae的任何访问

// 
[root@firewall ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:52:c0:ae -j DROP;

修改一下规则,虽然拒绝访问但是会给一个主机无法到达的回应

//
 [root@firewall ~]# iptables -R INPUT 1 -m mac --mac-source 00:0c:29:52:c0:ae -j REJECT;

-R修改某一条规则的时候,链名后面要加规则的数字,指定具体哪一条规则,并且把过滤的规则也要写上,哪怕只是修改控制类型也不能直接-j REJECT,否则它会视为拒绝所有

状态匹配
编写iptables规则时使用“-m state --state 连接状态(可以写多个用逗号隔开)”的形式
常用的连接状态:
NEW:想要新建立联机的封包状态。
ESTABLISHED: 已经联机成功的联机状态。
RELATED:表示这个封包是与我们主机发送出去的封包有关,可能是响应封包或者是联机成功之后的传送封包。
INVALID: 无效的封包,例如数据破损的封包状态。

允许响应请求的连接放行

// 
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT;

隐含匹配

端口匹配
编写端口匹配规则时使用“–port 源端口”或“–dport 目标端口”的形式,针对的协议为tcp或udp,单个端口号或者以冒号分隔的端口范围都是可以的,但是不连续的端口不可以用冒号表示
开放ssh接口

// 
[root@firewall ~]# iptables -I INPUT -p tcp -dport 22 -j ACCEPT
[root@firewall ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
           all  --  anywhere             anywhere           

;

icmp类型匹配
编写icmp类型匹配规则时使用“–icmp-type ICMP类型”的形式,针对的协议是icmp
允许本机ping别的主机但是不允许别的主机ping本机

//
 [root@firewall ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@firewall ~]# 
[root@firewall ~]# 
[root@firewall ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
           all  --  anywhere             anywhere

icmp类型:
Echo-Request:代码为8
Echo-Reply:代码为0
Destination-Unreachable:代码为3