CentOS7 运维 - iptables防火墙
一、概述
工作在网络层的IP
信息包过滤系统,由netfilter
和iptables
组成,对数据包内IP
地址和端口等信息的处理
netfilter
属于内核的防火墙功能体系,由一些数据包过滤表组成,用于控制数据包过滤处理
iptables
属于用户的刚获取管理体系,用于管理Linux防火墙的命令工具
二、规则表
netfilter/iptables
后期简称为iptabes
,是基于内核的防火墙,其中内置了raw
、mangle
、nat
和filter
表里有链,链里有规则
① 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
►规则链之间的匹配顺序
- 主机型防火墙
- 入站数据
prerouting -> input -> 本机的应用程序
- 出站数据
本机的应用程序 -> output -> postrouting
- 网络型防火墙
- 转发数据
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]
小知识扩展
主机型防火墙 主要使用 INPUT
、OUTPUT
链,设置规则时一般要详细的指定到端口
网络型防火墙 主要使用 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