文章目录

  • 一、Linux防火墙基础
  • 1.1 Linux包过滤防火墙概述
  • 1.2 iptables的表链结构
  • 1.3 数据包控制的匹配流程
  • 二、编写防火墙规则
  • 2.1 iptables安装
  • 2.2 基本语法、控制类型
  • iptables的基本语法
  • 数据包的常见控制类型
  • 2.3 iptables的管理选项
  • **添加新的规则**
  • **查看规则列表**
  • **删除、清空规则**
  • **设置默认策略**
  • **常用管理选项汇总**
  • 2.4 规则的匹配条件
  • 三、SNAT策略及应用
  • 3.1 SNAT策略概述
  • 四、DNAT策略及应用
  • 4.1 DNAT策略概述
  • 4.2 **DNAT策略的应用**


一、Linux防火墙基础

1.1 Linux包过滤防火墙概述

netfilter(过滤)

  • 位于Linux内核中的包过滤功能体系
  • 称为Linux防火墙的"内核态"

iptables

  • 位于/sbin/iptables,用来管理防火墙规则的工具
  • 称为Linux防火墙的"用户态"

以上两种称呼都可以表示Linux防火墙

防火墙
关联端口–对应服务
基于 ip
基于协议:TCP/UDP、ICMP

包过滤的工作层次

  • 主要是网络层,针对IP数据包
  • 体现在对包内的IP地址、端口等信息的处理上
  • ebtables查看output_经验分享

1.2 iptables的表链结构

规则链

  • 规则的作用:对数据包进行过滤或处理
  • 链的作用:容纳各种防火墙规则
  • 链的分类依据:处理数据包的不同时机

默认包括5中规则链

  • INPUT:处理入站数据包(进防火墙的时候就会读这个链)
  • OUTPUT:处理出站数据包
  • FORWARD:处理转发数据包
  • POSTROUTING链:在进行路由选择处理数据包 (SNAT基于源地址)(由内网往外网)
  • PREROUTING链:在进行路由选择处理数据包 (DNAT基于目的地址)

规则表

  • 表的作用:容纳各种规则链
  • 表的划分依据:防火墙规则的作用相似

默认包括4个规则表

  • raw表:确定是否对该数据包进行状态追踪
  • mangle表:为数据包设置标记
  • nat表:修改数据包中的源、目标IP地址或端口
  • filter表:确定是否放行该数据包(过滤)(核心,默认定义filter表)

默认的表、链结构示意图

ebtables查看output_经验分享_02

1.3 数据包控制的匹配流程

规则表之间的顺序

raw → mangle → nat → filter

规则链之间的顺序

入站:PREROUTING → INPUT

出站:OUTPUT → POSTROUTING

转发:PREROUTING → FORWARD → POSTROUTING

规则链内的匹配顺序

按顺序依次检查,匹配即停止(LOG策略例外)

若找不到相匹配的规则,则按该链的默认策略处理

总结:
PREROUTING—>INPUT---->FORWARD---->OUTPUT---->POSTROUTING

匹配流程示意图

ebtables查看output_IP_03

二、编写防火墙规则

2.1 iptables安装

关闭firewalld防火墙

  • CentOS 7默认使用firewalld防火墙,若想使用iptables防火墙必须先关闭firewalld防火墙
[root@hostname ~]# systemctl stop firewalld.service

[root@hostname ~]# systemctl disable firewalld.service

安装iptables防火墙

[root@hostname ~]# yum -y install iptables iptables-services

设置iptables开机启动

[root@hostname ~]# systemctl start iptables.services

[root@hostname ~]# systemctl enable iptables iptables.services

2.2 基本语法、控制类型

iptables的基本语法

语法结构

  • iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
[rooat@hostname ~]# ipitables -t filter -I INPUT -p icmp -j REJECT	'禁止icmp协议ping测试'

注意事项

  • 不指定表名时,默认指filter表(此时可以不写-t )
  • 不指定链名时,默认指表内的所有链 (-A末尾加入、-I开头加入)
  • 除非设置链的默认策略,否则必须指定匹配条件 (-P协议、-s源地址、-d目标地址)
  • 选项、链名、控制类型使用大写字母,其余均为小写

数据包的常见控制类型

  • ACCEPT:允许通过
  • DROP:直接丢弃,不给出任何回应
  • REJECT:拒绝通过,必要时会给出提示
  • LOG:记录日志信息,然后传给下一条规则继续匹配

2.3 iptables的管理选项

添加新的规则

  • -A:在链的末尾追加一条规则
  • -I:在链的开头(或指定序号)插入一条规则
  • -p:用来指定协议
[rooat@hostname ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT

[rooat@hostname ~]# iptables -I INPUT -p udp -j ACCEPT

[rooat@hostname ~]# iptables -I INPUT 2 -p icmp -j ACCEPT		'-p 用来指定协议'

查看规则列表

  • -L:列出所有的规则条目
  • -n:以数字形式显示地址、端口等信息
  • -v:以更详细的方式显示规则信息
  • –line-number:查看规则时,显示规则的序号(查看第几行)
[root@hostname ~]# iptables -n -L INPUT		'-n -L 可合写为-nL'

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:67
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:67
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0           
INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0           
INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0           
DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

删除、清空规则

  • -D:删除链内指定序号(或内容)的一条规则
  • -F:清空所有的规则
[root@localhost ~]# iptables -D INPUT 3		'删除INPUT里面的第三条规则'
[root@localhost ~]# iptables -n -L INPUT	'查看INPUT规则(-nL 前后不能颠倒)'
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:67
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0           
INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0           
INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0           
DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
[root@hostname ~]# iptables -F					'清空默认表的所有链(接-F 只清filter表,其他三张表要加规则)'

[root@hostname ~]# iptables -t -nat -F		'清空nat表的所有链'

[root@hostname ~]# iptables -t mangle -F	'清空mangle表的所有链'

[root@hostname ~]# iptables -t raw -F		'清空raw表的所有链'

设置默认策略

  • -p:为指定的链设置默认规则
[root@localhost ~]# iptables -t filter -P FORWARD DROP

[root@localhost ~]# iptables -P OUTPUT ACCEPT

清空所有默认策略要么是ACCEPT、要么是DROP表所有的链

常用管理选项汇总

ebtables查看output_经验分享_04

2.4 规则的匹配条件

通用匹配

  • 可直接使用,不依赖于其他条件或扩展
  • 包括网络协议、IP地址、网络接口等条件

隐含匹配

  • 要求以特定的协议匹配作为前提
  • 包含端口、TCP标记、ICMP类型等条件

显式匹配

  • 要求以 “-m 扩展模块” 的形式明确指出类型
  • 包含多端口、MAC地址、IP范围、数据包状态等条件

常见的通用匹配条件

  • 协议匹配:-p 协议名
  • 地址匹配:-s 源地址 、-d 目的地址
  • 接口匹配:-i 入站网卡 、-o 出站网卡
[root@hostname ~]# iptables -I INPUT -p icmp -j DROP

[root@hostname ~]# iptables -A FORWARD ! -p icmp -j ACCEPT	'叹号!表示条件取反''除了icmp协议,其他协议都允许通过'
[root@hostname ~]# iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP

[root@hostname ~]# iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP

[root@hostname ~]# iptables -A INPUT -i ens33 -s 172.16.0.0/12 -j DROP    'ens33:外网接口'
  • -i 和 -o 是按照数据的流向而言(双向)
  • (内网访问外网,内网网卡为in接口,外网网卡为out接口;外网访问内 网,外网网卡为in接口,内网网卡为out接口)

常用的隐含匹配条件

  • 端口匹配:- - sport 源端口、- -dport 目的端口
  • ICMP类型匹配:- -icmp-type ICMP类型
[root@hostname ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT  '53;DNS'

[root@hostname ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT   '多端口以冒号隔开,FTP:20、21'

TFTP UDP:69
FTP UDP 20 21

[root@hostname ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP		'8表示请求'
[root@hostname ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT		'0表示回显'

[root@hostname ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT		'3表示不可达'

[root@hostname ~]# iptables -A INPUT -p icmp -j DROP

常用的显示匹配条件

  • 多端口匹配:
  • -m multiport --sports 源端口列表
  • -m multiport --dports 目的端口列表
  • IP范围匹配:-m iprange --src-range IP范围
  • MAC地址匹配:-m mac --mac-source MAC地址
  • 状态匹配:-m state --state 连接状态
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT

[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT    '范围用中间-'

[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP   '用的多,指定性拒绝,相当于封杀,除非拆网卡'

上面三条命令常用

常用管理选项汇总

ebtables查看output_linux_05

三、SNAT策略及应用

  • SNAT(源地址转换),根据指定条件修改数据包的源IP地址。DNAT(目标地址转换),根据指定条件修改数据包目标IP地址和目标端口。
  • 如何区分SNAT和DNAT:从定义来讲它们一个是源地址转换,一个是目标地址转换。都是地址转换的功能,将私有地址转换为公网地址。
  • 要区分这两个功能可以简单的由连接发起者是谁来区分:内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
  • 当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
    在配置防火墙或者路由acl策略时要注意这两个NAT一定不能混淆。

3.1 SNAT策略概述

SNAT策略的典型应用环境

  • 局域网主机共享单个公网IP地址接入Internet

SNAT策略的原理

  • 源地址转换,Source Network Address Translation
  • 修改数据包的源地址

SNAT策略的应用

  • 前提条件
  • 局域网各主机正确设置IP地址/子网掩码
  • 局域网各主机正确设置默认网关地址
  • Linux网关支持IP路由转发

实现方法

  • 编写SNAT转换规则
[root@hostname ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to-source 218.29.30.31

四、DNAT策略及应用

4.1 DNAT策略概述

DNAT策略的典型应用环境

  • 在Internet中发布位于企业局域网内的服务器

DNAT策略的原理

  • 目标地址转换,Destination Network Address Translation
  • 修改数据包的目标地址

4.2 DNAT策略的应用

前提条件

  • 局域网的Web服务器能够访问Internet
  • 网关的外网IP地址有正确的DNS解析记录
  • Linux网关支持IP路由转发

实现方法

  • 编写DNAT转换规则
[root@localhost ~]# iptables -t nat -A PREROUTING -i ens33 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6

SNAT用来修改源IP地址,而DNAT用来修改目标IP地址、目标端口;
SNAT只能用在nat表的POSTROUTING链,而DNAT只能用在nat表的PREROUTING链和OUTPUT链(或被其调用的链)中。