CentOS7 运维 - iptables防火墙 | 规则实例 | SNAT | DNAT | 超详细

一、概述

工作在网络层的IP信息包过滤系统,由netfilteriptables组成,对数据包内IP地址和端口等信息的处理

netfilter 属于内核的防火墙功能体系,由一些数据包过滤表组成,用于控制数据包过滤处理

iptables 属于用户的刚获取管理体系,用于管理Linux防火墙的命令工具

二、规则表

netfilter/iptables后期简称为iptabes,是基于内核的防火墙,其中内置了rawmanglenatfilter
表里有链,链里有规则

① raw表

  • 用于确定是否对该数据包进行状态追踪
  • 规则链 output | prerouting

② mangle表

  • 修改标记数据包,用于流量整形和策略路由等高级应用
  • 规则链 input | output | forward | prerouting | postrouting

③ nat表

  • 地址转换以及修改数据包中源、目标IP地址或端口
  • 规则链 output | prerouting | postrouting

④ filter表

  • 负责数据包的过滤及规则
  • 规则链 input | forward | output

三、规则链

① input

处理入站数据包,匹配目标IP为本机的数据包

② output

处理出站数据包[一般无需额外配置]

③ forward

处理转发数据包,匹配流经本机的数据包

④ prerouting

在路由选择前处理数据包,用来修改目的地址DNAT,类似映射

⑤ postrouting

在路由选择后处理数据包,用来修改源地址SNAT,类似NAT

►规则表优先顺序

数据包到达防火墙时,规则表之间的优先顺序

raw > mangle > nat > filter

►规则链之间的匹配顺序

  1. 主机型防火墙
  2. 入站数据
prerouting -> input -> 本机的应用程序
  1. 出站数据
本机的应用程序 -> output -> postrouting
  1. 网络型防火墙
  2. 转发数据
prerouting -> forward - > postrouting

自上而下一次匹配,找到的规则就停止(LOG除外),如找不到匹配的规则则按默认策略处理(没修改时,默认允许)

四、iptables的安装

若想使用iptables就需要先关闭firewalld

systemctl stop firewalld
systemctl disable firewalld.service
yum -y install iptables iptables-services
systemctl start iptables

① iptables 命令行配置方法

命令格式

iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

注意事项

  • 不指定表名时,默认指filter
  • 不指定链名时,默认指定表内所有链
  • 除非设置链的默认策略,否则必须指定匹配条件
  • 控制类型使用大写字母,其余均为小写

常用的控制类型
ACCEPT 允许数据包通过
DROP 直接丢弃数据包
REJECT 拒绝数据包通过
SNAT 修改数据包的源地址
DNAT 修改数据包的目的地址
MASQUERADE 伪装成一个非固定公网IP地址
LOG/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

常用的管理选项

  • -A 在指定链的末尾追加一条新的规则
  • -I 在指定链的开头中插入一条新的规则
  • -R 修改替换指定链中的某一条规则
  • -P 设置指定链的默认策略
  • -D 删除指定链的策略
  • -F 清空指定链的所有策略
  • -L 列出指定链中所有规则
  • -n 使用数字形式显示输出结果[如显示IP地址而不是主机名]
  • -v 显示详细信息,包括每条规则的匹配包数量和匹配字节数
  • --line-numbers 查看规则时,显示规则的序号

② 实例

►添加新的规则

iptables -t filter -A INPUT -p icmp -j REJECT

如不指定表则默认时filter表

iptables -I INPUT -p tcp --dport 22 -j DORP

拒绝TCP的22的目的端口

►查看规则列表

iptables [-t 表名] -n -L [链名] [--line-numbers]
iptables -L
iptables -n -L --line-numbers

►删除第一条规则[从下网上删]

iptables -D INPUT 1
iptables -t filter -D INPUT -p icmp -j REJECT

若规则列表中有多余相同的规则,按内容匹配只删除的序列号最小的

►在第二行增加一条规则

iptables -I INPUT 2

►设置默认策略

iptables [-t 表名] -P <链名> <控制类型>
iptables -P INPUT DROP

►清空规则

iptables [-t 表名] -F [链名][]
iptables -F INPUT

-F仅仅时清空链中的规则,并不影响-p设置的默认规则,默认规则需要是手进行修改
-P设置了DROP后,使用-F一定要注意,推荐先增加一条放通22
③如果不写表名和链名,默认清空filter表中所有链里的所有规则

五、规则的匹配条件

① 通用匹配

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

协议匹配 -p 协议名
地址匹配 -s 源地址、-d 目的地址
接口匹配 -i 入站网卡、-o 出站网卡
iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -s 192.168.1.1 -j DROP
iptables -I INPUT -i ens33 -s 192.168.1.0/24 -j DROP

② 隐含匹配

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

端口匹配:–sport 源端口 --dport目的端口

--sport 100 指定
--sport 100:200 指定100~200
--sport :100 100以下
--sport 100: 100以上
iptables -A INPUT -p tcp --dport 1:5 -j ACCEPT

③ TCP标记匹配

--tcp-flags TCP标记

iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT

④ ICMP类型匹配

--icmp-type ICMP类型[可以是字符串及数字代码]
Echo-Request[请求] 代码为8
Echo-Reply[回显] 代码为0
Destination-Unreachable[目标不可达] 代码为3

iptables -A INPUT -p icmp -j REJECT

Server1:

# 这样一来Server2就会回显并提示目标不可达
iptables -I INPUT 2 -p icmp --icmp-type 0 -j ACCEPT
iptables -I INPUT 2 -p icmp --icmp-type 3 -j ACCEPT

Server2:

⑤ 显示匹配

要求以-m模块模式的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
多端口匹配

-m multiport --sport 源端口列表
-m mulitiport --dport 目的端口列表
iptables -A INPUT -p tcp -m mulitiport --dport 8080,22,21,20 -j ACCEPT
iptables -A INPUT -p udp -m mulitiport --dport 53 -j ACCEPT

⑥ IP范围匹配

-m iprange --src-range IP范围

iptables -A FORWARD -p udp -m iprange --src-range 192.168.1.1-192.168.1.10 -j DROP
iptables -A FORWARD -p udp -m iprange --dst-range 192.168.1.1-192.168.1.10 -j DROP

⑦ MAC地址匹配

-m mac --mac-source MAC地址

iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP

⑧ 状态匹配

-m state --state 连接状态
常见的连接状态

  • NEW 与任何连接无关的,还没开始连接
  • ESTABLISHED 响应请求或者已创建连接的
  • RELATED 衍生的已有连接
  • INVALID 不能被识别属于哪个连接或没有任何状态
iptables -A FORWARD -m state --state ESTABLISHED;RELATED -p -tcp ! --syn -j DROP

六、SNAT原理与应用

应用场景:局域网主机共享单个公网IP地址接入Internet
原理:修改书包的源地址
转换条件
临时打开设置

  • 局域网各主机已正确设置IP地址、子网掩码、默认网关地址
  • Linux网关开启IP路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward

sysctl -w net.ipv4.ip_forward=1

修改配置文件永久选择设置

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

SNAT转换① [固定的公网IP地址]

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to 10.0.0.1

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to-source 10.0.0.1-10.0.0.10

SNAT转换②[动态公网IP地址]

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j MASQUERADE

小知识扩展

一个IP地址做SNAT转换,一般可以让内网 100 到 200 台主机实现上网。

DNAT原理与应用

应用环境:在Internet中发布位于局域网内的服务器
原理:修改数据包的目的地址。
转换前提条件

  • 局域网的服务器能够访问Internet
  • 网关的外网地址有正确的DNS解析记录
  • Linux网关开启IP路由转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 	

sysctl -p 		

DNAT转换①[发布内网的Web服务]

把从ens33进来的要访问web服务的数据包目的地址转换为

iptables -t nat -A PREROUTING -i ens33 -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.1.10

iptables -t nat -A PREROUTING -i ens33 -d 10.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.1.10-192.168.1.20

DNAT转换②[发布时修改目标端口 ]

发布局域网内部的OpenSSH服务器,外网主机需使用8080端口进行连接

iptables -t nat -A PREROUTING -i ens33 -d 10.0.0.1 -p tcp --dport 8080 -j DNAT --to 192.168.1.10:20

在外网环境中使用SSH测试

ssh -p 8080 [email protected]

小知识扩展
主机型防火墙 主要使用 INPUTOUTPUT 链,设置规则时一般要详细的指定到端口
网络型防火墙 主要使用 FORWARD 链,设置规则时很少去指定到端口,一般指定到IP地址或者到网段即可

防火墙规则的备份和还原
导出(备份)所有表的规则

iptables-save > /opt/ipt.txt

导入(还原)规则

iptables-restore < /opt/ipt.txt

iptables规则文件保存在 /etc/sysconfig/iptables 中,iptables服务启动时会自动还原规则

iptables-save > /etc/sysconfig/iptables
systemctl restart iptables	

猜你喜欢

转载自blog.csdn.net/qq_42427971/article/details/114941827