一、SELinux安全上下文
1、SELinux 简介
-
是什么? SELinux(Security-Enhanced Linux)是Linux内核的强制访问控制(MAC)安全子系统,提供更细粒度的权限控制,防止进程或用户越权操作。
-
核心思想
-
最小权限原则:进程/用户只能访问其明确需要的资源。
-
基于标签的访问控制:所有资源(文件、端口、进程)被赋予安全上下文(Security Context)。
-
-
工作模式
模式 描述 Enforcing 强制执行策略,拒绝非法操作并记录日志。 Permissive 仅记录违规操作,不阻止(用于调试)。 Disabled 完全关闭SELinux(需重启生效)。
2、基础操作命令
1. 查看SELinux状态
getenforce# 查看当前模式
sestatus# 详细状态(模式/策略类型)
2. 切换工作模式
setenforce 0# 切换到Permissive模式
setenforce 1# 切换到Enforcing模式
注意:setenforce仅临时生效,永久修改需编辑 /etc/selinux/config 文件,而且而且控制端口号一旦设置标签,只会运行默认端口(80)
例
[root@bogon ~]# setenforce 0
[root@bogon ~]# getenforce
Permissive
3、安全上下文(Security Context)
1. 查看上下文
ls -Z /var/www/html # 查看文件/目录的上下文
ps -Z -C httpd# 查看进程的上下文
例:
ls -z
root@bogon ~]# ls -Z
unconfined_u:object_r:admin_home_t:s0 公共
unconfined_u:object_r:admin_home_t:s0 模板
unconfined_u:object_r:admin_home_t:s0 视频
unconfined_u:object_r:admin_home_t:s0 图片
ps -z
[root@bogon ~]# ps -Z LABEL PID TTY TIME CMD unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 104091 pts/0 00:00:00 unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 168173 pts/0 00:00:00
2. 修改上下文
chcon命令
选项 | 说明 | 示例消息 |
---|---|---|
-t, --type TYPE | 设置安全上下文的类型部分 | 已将 file.txt 的类型更改为 httpd_sys_content_t |
-u, --user USER | 设置安全上下文的用户部分 | 已将 file.txt 的用户更改为 system_u |
-r, --role ROLE | 设置安全上下文的角色部分 | 已将 file.txt 的角色更改为 object_r |
--reference=FILE | 使用指定文件的安全上下文 | 已从 ref_file 复制上下文到 target_file |
-R, --recursive | 递归处理文件和目录 | 已递归更改 dir/ 及其内容的上下文 |
-h, --help | 显示帮助信息 | 显示帮助菜单 |
-v, --verbose | 显示操作详情 | 正在更改 file.txt 的安全上下文 |
--version | 显示版本信息 | chcon (GNU coreutils) 8.32 |
选项使用案例
-
设置文件类型 将 /var/www/html/index.html 的上下文类型设为 httpd_sys_content_t:
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
-
设置用户部分 将 /etc/nginx/nginx.conf 的用户部分设为 system_u:
sudo chcon -u system_u /etc/nginx/nginx.conf
-
设置角色部分 将 /home/user/file.txt 的角色部分设为 object_r:
sudo chcon -r object_r /home/user/file.txt
-
参照文件上下文 将 file2 的上下文设置为与 file1 一致:
sudo chcon --reference=file1 file2
-
递归操作目录 递归修改 /var/www/html/ 目录下所有文件的上下文类型:
sudo chcon -R -t httpd_sys_content_t /var/www/html/
-
显示帮助信息
chcon --help
-
显示版本信息
chcon --version
-
详细模式操作 启用详细输出,修改 ~/.ssh/config 的上下文类型:
sudo chcon -v -t ssh_home_t ~/.ssh/config
说明:
-
实际执行时,若未添加 -v 参数,chcon 默认不输出成功信息,仅在出错时显示错误。
-
使用 -v 参数可查看操作详情(如上述表格中的“示例消息”)。
chcon -t httpd_sys_content_t /var/www/html/index.html # 临时修改文件类型
restorecon -v /var/www/html/index.html # 恢复默认上下文
semanage 命令
子命令/选项 | 用途说明 | 常用选项 | 示例消息/操作 |
---|---|---|---|
semanage login | 管理SELinux用户与Linux账户的映射关系 | -a (添加)、-d (删除)、-m (修改) | 将用户 user1 映射到 SELinux 用户 staff_u |
semanage user | 管理SELinux用户及其角色和权限 | -a、-d、-R (角色)、-L (限制) | 创建新SELinux用户 web_user 并分配角色 httpd_role |
semanage port | 管理网络端口与SELinux类型的绑定关系 | -a、-d、-t (类型)、-p (协议) | 将TCP端口 8080 绑定到 http_port_t 类型 |
semanage interface | 管理网络接口与SELinux类型的绑定关系 | -a、-d、-t | 将接口 eth1 绑定到 netif_t 类型 |
semanage module | 管理SELinux策略模块(启用/禁用) | -a、-d、-e (启用)、-D (禁用) | 启用策略模块 my_custom_module |
semanage fcontext | 管理文件/目录的默认SELinux上下文规则 | -a、-d、-t、-s (范围) | 添加规则:/webapps(/.*)? 的上下文类型为 httpd_sys_content_t |
semanage boolean | 管理SELinux布尔值(开关策略功能) | -1 (查看)、--on、--off | 启用布尔值 httpd_can_network_connect |
semanage dontaudit | 管理dontaudit规则(是否记录特定访问拒绝事件) | --on、--off | 关闭对 sshd 的 dontaudit 规则 |
-h / --help | 显示帮助信息 | - | 显示子命令的帮助菜单 |
-v / --verbose | 显示详细操作信息 | - | 显示添加端口 8080 的详细过程 |
-n / --noheading | 输出时隐藏列标题 | - | 仅显示端口列表数据,无标题行 |
选项使用案例
-
管理端口绑定
将TCP端口 8080 标记为HTTP服务端口:
sudo semanage port -a -t http_port_t -p tcp 8080
说明:允许Apache等HTTP服务使用8080端口。
-
管理文件上下文规则
为自定义Web目录 /opt/webapps 设置默认上下文:
sudo semanage fcontext -a -t httpd_sys_content_t "/opt/webapps(/.*)?"
sudo restorecon -Rv /opt/webapps
说明:添加规则后需运行 restorecon 立即生效。
-
管理SELinux用户映射
将Linux用户 dev_user 映射到SELinux用户 user_u:
sudo semanage login -a -s user_u dev_user
说明:限制用户 dev_user 的SELinux权限。
-
启用布尔值
允许HTTP服务访问网络:
sudo semanage boolean --on httpd_can_network_connect
说明:无需重启服务,立即生效。
-
管理策略模块
禁用自定义策略模块 mymodule:
sudo semanage module -D mymodule
说明:禁用后相关规则不再生效。
-
查看当前端口绑定
列出所有HTTP相关端口:
semanage port -l | grep http_port_t
输出示例:
http_port_t tcp 80, 443, 8080
-
删除文件上下文规则
移除对 /tmp/custom_dir 的上下文规则:
sudo semanage fcontext -d "/tmp/custom_dir(/.*)?"
注意事项
-
权限要求:大多数操作需 sudo 或 root 权限。
-
持久化存储:semanage 修改的规则会保存到策略库(默认路径 /etc/selinux/targeted),重启后仍有效。
-
结合工具使用:修改文件上下文后,需运行 restorecon 或重启服务使更改生效。
4、SELinux布尔值(Booleans)
SELinux策略通过布尔值动态调整权限控制(例如允许Apache访问用户家目录)。
getsebool -a | grep httpd# 查看所有与Apache相关的布尔值
setsebool -P httpd_enable_homedirs=on # 启用布尔值(-P永久生效)
5、日志分析与故障排除
1. 查看SELinux日志
tail -f /var/log/audit/audit.log # 直接查看原始日志 ausearch -m AVC -ts recent# 使用工具过滤日志
2. 生成解决方案建议
grep "avc: denied" /var/log/audit/audit.log | audit2allow -M mypolicy
semodule -i mypolicy.pp# 编译并加载自定义策略
6、常见问题与解决方案
场景1:Web服务器无法访问文件
-
现象:Apache返回403错误,但文件权限正常。
-
解决:
-
检查文件上下文:ls -Z /var/www/html
-
修复上下文:restorecon -Rv /var/www/html
-
场景2:服务无法绑定非标准端口
-
现象:Nginx无法监听8080端口。
-
解决:
semanage port -a -t http_port_t -p tcp 8080# 添加端口到SELinux策略
7、注意事项
-
不要随意禁用SELinux:优先使用Permissive模式调试。
-
谨慎使用chcon:错误修改上下文可能导致系统不稳定。
-
备份策略:修改策略前备份 /etc/selinux 目录。
二、Linux防火墙-Firewalld
1、 概述
按表现形式划分:
软件防火墙: 集成在系统内部,Linux系统: iptables、firewalld、ufw; windows系统下: windows defender
硬件防火墙: 华为防火墙、思科防火墙、奇安信防火墙、深信服防火墙等
按技术划分:
包过滤防火墙: 检查数据包的源IP、目的IP、源端口、目的端口、TCP的syn控制位
七层防火墙:除了上述检查外,还会检查数据内容
防火墙的作用:
阻止来自网络外部的攻击、进行流量控制
2、 Linux防火墙
防火墙结构
用户态:
iptables: 使用iptables命令对防火墙规则进行管理,必须深度理解网络技术和四表五链,对于初学者或者网络技术不达标的人员不友好
firewalld:使用firewall-cmd命令对防火墙进行管理,采用的是区域划分的形式。不需要连接底层的四表五链,对于初学者比较友好
ufw: 使用ufw命令对防火墙进行管理,命令简单易懂。
内核态:
四表: 从内核->用户的顺序: raw -> mangle -> nat -> filter
五链: input、output、forward、prerouting、postrouting
firewalld防火墙
区域分类
九大区域: block、dmz、drop、external、home、internal、public、trusted、work
区域功能
public:公共区域,默认区域
home: 家庭区域
work: 工作区域
trusted: 完全信任区域
internal: 内部区域 (连接内部网络)
external: 外部区域 (连接外部网络,例如: internet网络)
dmz: 非军事化管理区域(内部的服务器放于该区域)
drop: 丢弃区域(丢弃一切流量,不给出任何回应)
block: 阻塞区域 (拒绝任何流量,但给出回应)
三、Linux防火墙-Iptables
1、 Iptables概述
Iptables 是一个用户空间程序,可以用于设置和管理 Linux 操作系统的内核级防火墙。它通过表、链和规则组成,可以灵活地根据不同的需求进行配置。
iptables 具有以下特点:
-
Iptables 作为内核级别的防火墙,具有高效、稳定、安全等优点。
-
Iptables 的表、链、规则结构非常灵活,可适应各种不同的网络环境和应用场景。
-
Iptables 相对于其他防火墙工具而言比较容易学习和掌握,并且拓展性非常强。
2、 Iptables 组成
Iptables 的核心是由表(table)、链(chain)和规则(rule)三部分组成的。
表(Table)
在 iptables 中,表是一个规则的集合,每个表都包含若干个链和一些相关的规则。常用的五种 table 如下:
-
raw表:确定是否对该数据包进行状态跟踪。包含两个规则链,OUTPUT、PREROUTING。
-
mangle表:修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
-
nat表:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING。
-
filter表:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、FORWARD、OUTPUT。
链表之间的优先级
数据包到达防火墙时,规则表之间的优先顺序 raw > mangle > nat > filter
链(Chain)
在 iptables 中,链是一个规则的集合,每个链都包含一些相关联的规则。
-
INPUT链: 当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
-
OUTPUT链: 当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
-
FORWARD链: 当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
-
PREROUTING链: 在对数据包作路由选择之前,应用此链中的规则,用来修改目的地址,如DNAT。
-
POSTROUTING链: 在对数据包作路由选择之后,应用此链中的规则,用来修改源地址,如SNAT。
链表对应关系
数据包过滤的匹配流程
-
入站
入站数据包从A网络发到B网络,首先发到防火墙,先后顺序经过有PREROUTING链的三个表(raw、mangle、nat),如果都是放通状态的会经过路由选择,然后根据目的地址一层一层往上送,经过有INPUT的两个表(mangle、filter),一直送到应用程序。
-
转发
目的地不是本机,数据包先从A网络过滤,经过PREROUTING链,看是否是自己的目的地址,如果是外网到内网需要用nat转换成内网IP,找到内网用户,经过FORWARD链进行过滤,允许放通的到达POSTROUING链,再把内网地址转换成公网,这样数据包才能回去;如果是内网往外网发顺序就是反过来。
-
出站
从本机的应用程序发出来, 经过路由选择,让路由知道从哪里发,先后顺序经过有OUTPUT链的四个表(raw、mangle、nat、filter),都放通后到达POSTROUING链的两个表(mangle、nat),如果没有什么转换地址,就出站。
-
总结
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
如果数据包是进入本机的,数据包就会沿着图向上移动,到达INPUT链。数据包到达INPUT链后, 任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后发送出去。
如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
规则匹配策略
自上而下进行顺序匹配,匹配到即停止,不会再去查看下面的规则,然后根据允许或者丢弃或者拒绝等规则进行数据包的处理!!!
3、 Iptables防火墙配置
-
iptables命令
语法 iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
注意:链名必须大写;控制类型必须大写
选项 | 作用 |
---|---|
-t | 指定表名(raw、mangle、nat、filter) |
-j | 指定控制类型 |
常用管理选项
选项 | 作用 |
---|---|
-A (--append) | 在指定链的末尾追加一条新的规则 |
-I (--insert) | 在指定链的开头插入一条新的规则;未指定序号时默认作为第一条规则 |
-R (--replace) | 修改、替换指定链中的某一条规则,可指定规则序号或具体内容 |
-P (--policy) | 设置指定链的默认策略 |
-D (--delete) | 删除指定链中的某一条规则,可指定规则序号或具体内容 |
-F (--flush) | 清空指定链中的所有规则;若未指定链名,则清空表中的所有链 |
-L (--list) | 列出指定链中所有的规则;若未指定链名,则列出表中的所有链 |
-n (--numeric) | (搭配-L使用)使用数字形式显示输出结果,如显示IP地址而不是主机名 |
-v | (搭配-L使用)显示详细信息,包括每条规则的匹配包数量和匹配字节数 |
--line-numbers | (搭配-L使用)查看规则时,显示规则的序号 |
常用控制类型
控制类型 | 作用 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 直接丢弃数据包,不给出任何回应消息 |
REJECT | 拒绝数据包通过,会给数据发送端一个响应信息 |
SNAT | 修改数据包的源地址 |
DNAT | 修改数据包的目的地址 |
MASQUERADE | 伪装成—个非固定公网IP地址 |
LOG | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。(没有真正处理数据包) |
匹配条件
匹配条件 | 说明 |
---|---|
-p | 指定要匹配的数据包的协议类型 |
-s | 指定要匹配的数据包的源IP地址 |
-d | 指定要匹配的数据包的目的IP地址 |
-i | 指定数据包进入本机的网络接口 |
-o | 指定数据包离开本机做使用的网络接口 |
--sport | 指定源端口号 |
--dport | 指定目的端口号 |
案例
-nL
[root@bogon ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
-t
[root@bogon ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
控制类型
[root@bogon ~]# iptables -t filter -A INPUT -p icmp -j DROP
[root@bogon ~]# iptables -nL -t filter
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP 1 -- 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
命令操作
添加新的规则
##-A 在filter表的INPUT链末行添加拒绝icmp的规则
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT
##-I 不指定行,是在指定链首行插入规则(允许tcp 22端口)
[root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
##-I 指定行,是在指定链的指定行上插入规则
[root@localhost ~]# iptables -t filter -I INPUT 2 -p tcp --dport 22 -j ACCEPT
查看规则
##查看指定表的规则(不加链名显示所有链的所有规则)
[root@localhost ~]# iptables -t filter -L
##-nL 以数字形式显示
[root@localhost ~]# iptables -t filter -nL
##-nvL 以数字形式显示,并显示详细信息
[root@localhost ~]# iptables -t filter -nvL
##--line-numbers 显示规则序号(指定链名,就显示指定链的规则)
[root@localhost ~]# iptables -t filter -nvL INPUT --line-numbers
编号 包数量 大小 规则 协议选项 入站网卡 出站网卡源地址 目的地址 条件
num pkts bytes target prot opt in out source destination
12 168 ACCEPT icmp --** 192.168.1.2500.0.0.0/0
29 844 REJECT icmp --** 0.0.0.0/00.0.0.0/0reject-with icmp-port-unreachable
392041 ACCEPT tcp--** 192.168.1.2500.0.0.0/0tcp dpt:22
4346 24461 ACCEPT tcp--** 192.168.1.2520.0.0.0/0tcp dpt:22
5 312548 REJECT tcp--** 0.0.0.0/00.0.0.0/0tcp dpt:22 reject-with icmp-port-unreachable
删除规则
注意
若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错 按内容匹配删数时,确保规则存在,否则报错
##根据规则序号删
[root@localhost ~]# iptables -D INPUT 3
##根据规则内容删(相当于操作一遍创建指定规则的步骤加上-D选项删除)
[root@localhost ~]#iptables -D INPUT -p icmp -j REJECT
##有相同的规则会删除第一个
[root@localhost ~]#iptables -nL
[root@localhost ~]#iptables -D INPUT -p tcp --dport 22 -j ACCEPT
清空规则
注意
-F仅仅是清空链中的规则,并不影响-Р设置的默认规则,默认规则需要手动进行修改
-P设置了默认规则为DROP后,使用-F一定要小心,因为iptables的修改是立刻生效的! 防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决
如果不写表名和链名,默认清空filter表中所有链里的所有规则
##清空指定链中所有规则
[root@localhost ~]# iptables -F OUTPUT
##不指定链名默认清空所有规则
[root@localhost ~]# iptables -F
修改规则
##-R 修改已有的规则
[root@localhost ~]# iptables -t filter -R INPUT 1 -p icmp -j ACCEPT
##-P 修改默认策略(修改为丢弃转发数据包)
[root@localhost ~]# iptables -P FORWARD DROP
4、 规则的匹配
1、通用匹配
可直接使用,不依赖其他条件或扩展包括网络协议、IP地址、网络接口等条件。
类型 | 选项 |
---|---|
协议匹配 | -p 协议名 |
地址匹配 | -s 源地址 -d 目的地址(可以是IP、网段、域名、空(代表任何地址)) |
接口匹配 | -i 入站网卡 -o 出站网卡 |
##(使用!取反)不是icmp协议的其他数据包全部接受
##虽然不是icmp包都接受,但是没有指定icmp包的规则,所以icmp包默认还是接受的
[root@localhost ~]# iptables -A INPUT ! -p icmp -j ACCEPT
##将指定主机192.168.116.20的数据包丢弃
[root@localhost ~]# iptables -A INPUT -s 192.168.116.20 -j DROP
##拒绝指定网段的数据包从ens33网卡进入
[root@localhost ~]# iptables -I INPUT -i ens33 -s 192.168.110.0/24 -j REJECT
2、隐含匹配
某些条件,如端口、TCP标记、ICMP类型,隐含要求以特定的协议匹配作为前提。
-
协议端口匹配
--sport 和 --dsport 必须配合 -p 指定协议使用!!!
详细用法
类型 | 作用 |
---|---|
--sport 1000 | 匹配源端口是1000的数据包 |
--sport 1000:3000 | 匹配源端口是1000-3000的数据包 |
--dport :3000 | 匹配目标端口是3000及以下的数据包 |
--dport 1000: | 匹配目标端口是1000及以上的数据包 |
##允许tcp的20和21端口通过(即允许ftp数据包)
[root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
##丢弃192.168.11.0网段转发的tcp 24000到24500 端口的数据包
[root@localhost ~]# iptables -I FORWARD -d 192.168.11.0/24 -p tcp --dport 24000:24500 -j DROP
-
tcp标记匹配 [了解]
--tcp-flags 配合 -p tcp 使用,指定tcp标记(SYN、ACK、RST、URG、PSH、FIN)
##丢弃SYN请求包,允许其他指定的数据包
[root@localhost ~]# iptables -A INPUT -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
##SYN,RST,ACK SYN前面指定包范围,空格后再指定
##表明前面指定的里面,除了这空格后面的SYN,其他都放行
##tcp三次握手第一次接受SYN,拒绝其他,第二次发送SYN和ACK
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSHSYN -j REJECT
[root@localhost ~]# iptables -I OUTPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
-
ICMP类型匹配
--icmp-type 配合 -p icmp 使用,指定icmp类型(字符串或数字代码)
icmp类型可用iptables -p icmp -h 查看帮助信息
类型 | 含义 |
---|---|
Echo-Request(代码为8) | 请求 |
Echo-Reply (代码为0) | 回显 |
Destination-Unreachable(代码为3) | 目标不可达 |
##丢弃icmp请求包(使别人不能ping通本机,但本机默认情况可以ping通别人)
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
##丢弃icmp回显包(本机发送ping请求,但是别人回显的包被本机丢弃,默认情况下本机不能ping通别人)
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j DROP
##当ping不通时,允许显示目标不可达
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
3、显式匹配
要求以 -m (扩展模块)的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。
-
多端口匹配
-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
##允许tcp的20,21,22,53端口
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,22,53 -j ACCEPT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp--0.0.0.0/00.0.0.0/0multiport dports 20,21,22,53
##允许udp的53,67,68端口
[root@localhost ~]# iptables -A INPUT -p udp -m multiport --dport 53,67,68 -j ACCEPT
-
ip范围匹配
-m iprange --src-range 源IP范围
-m iprange --dst-range 目的IP范围
##禁止转发源ip范围是192.168.10.100-192.168.10.200的udp数据包
[root@localhost ~]# iptables -A FORWARD -p udp -m iprange --src-range 192.168.10.100-192.168.10.200 -j DROP
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP udp--0.0.0.0/00.0.0.0/0source IP range 192.168.1.1-192.168.1.10
##禁止发送目的ip范围是192.168.10.100-192.168.10.200的udp数据包
[root@localhost ~]# iptables -A INPUT -p udp -m iprange --dst-range 192.168.10.100-192.168.10.200 -j DROP
-
mac地址匹配【了解】
-m mac --mac-source 源MAC地址
-
状态匹配【了解】
-m state --state 连接状态
常见的连接状态
状态 | 含义 |
---|---|
NEW | 本机要连接目标主机,在目标主机上看到的第一个想要连接的包 |
ESTABLISHED | 本机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态 |
RELATED | 本机已与目标主机进行通信,目标主机发起新的链接方式,一般与ESTABLISHED配合使用 |
INVALID | 无效的封包,例如数据破损的封包状态 |
##第一个包我只看22端口的包(-p tcp是隐含匹配,可以省略-m tcp)
[root@localhost ~]# iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
##允许放通tcp和udp的这些端口号
[root@localhost ~]# iptables -A INPUT -p tcp -m multiport --dport 443,80,22,21,20,53 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
##使已建立连接的包以及该链接相关的包允许通过
[root@localhost ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
##默认策略设为drop,以上所有配置就成了一个tcp相关包的白名单,通过第一步的检测后允许相关包通过
[root@localhost ~]# iptables -P INPUT DROP
5、Iptables配置NAT地址转换
1、 配置SNAT
应用场景
局域网主机共享转换的公网ip接入internet公网(内 --> 外)
模拟实验环境
私网客户端一台、网关服务器一台(设置iptables防火墙)、外网web服务端(有httpd服务)
三台都需要关闭默认防火墙firewalld和selinux
准备私网客户端:设置网卡网段为192.168.1.0/24;ip设为192.168.1.1;网关设为192.168.1.254。
准备网关服务器:一个网卡设为192.168.1.0/24网段,并设置ip为192.168.1.254;另一个网卡设为10.0.0.0/8网段,并设置ip为10.0.0.100;添加路由转发功能;下载 iptables-services 并开始iptables之后做防护墙策略。
准备外网web服务端:设置网卡网段为10.0.0.0/8;ip设为10.0.0.1;下载并开启httpd服务。
转换为固定公网ip
iptables -t nat -A POSTROUTING -s 源网段 -o 出站网卡 -j SNAT --to 转换的公网地址
iptables -t nat -A POSTROUTING -s 源网段 -o 出站网卡 -j SNAT --to-source 转换的公网地址范围(如10.0.0.1-10.0.0.10)
注:每一个做转换的公网ip,一般可以支持内网100~200台主机。
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to 10.0.0.100
[root@localhost ~]# 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
转换为非固定的公网ip(动态)
iptables -t nat -A POSTROUTING -s 源网段 -o 出站网卡 -j MASQUERADE
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
2、配置DNAT
应用场景
在internet公网中发布位于企业局域网的服务器(外 --> 内)
模拟实验环境
私网客户端一台(有httpd服务)、网关服务器一台(设置iptables防火墙)、外网web服务端
三台都需要关闭默认防火墙firewalld和selinux
可参考上个模拟场景,再为私网主机增设httpd服务使之成为私网web服务端,将原来的外网主机当做客户端。
为私网主机添加httpd服务并启用
转换为私网ip
iptables -t nat -A PREROUTING -i 连接外部网络的接口名称 -d 外部接口IP地址 -p tcp --dport 发布的端口号 -j DNAT --to-destination 服务器内部网络地址:服务实际端口号
[root@localhost ~]# iptables -t nat -A PREROUTING -i ens33 -d 10.0.0.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2
6、iptables防火墙策略的备份和恢复
iptables的配置存放在/etc/sysconfig/iptables 文件中,我们对iptables所做的策略修改,虽然会立刻生效,但是并没有保存下来,当我们重启iptables防火墙时,会读取配置文件中设置的策略,我们之前修改过的策略便失效了。所以需要对修改的iptables策略进行备份和恢复。
iptables-save > 备份文件 将修改的iptables策略导入到备份文件中
iptables-restore < /opt/iptables.bak 将备份文件中的策略还原到配置文件中
systemctl restart iptables.service 重启服务生效
##查看配置文件中的默认策略
[root@localhost opt]#cat /etc/sysconfig/iptables-config
##使用iptables -nL查看修改过的策略
[root@localhost opt]#iptables -nL
##对自定义的iptables策略做备份(将命令导入一个备份文件iptables.bak)
[root@localhost opt]# iptables-save > /opt/iptables.bak
[root@localhost opt]# cd /opt
[root@localhost opt]# cat iptables.bak
##重启服务(用作模拟未保留修改的策略),再查看发现策略又恢复成了配置文件中的默认策略
[root@localhost opt]# systemctl restart iptables.service
[root@localhost opt]# iptables -nL
##将备份文件中的策略恢复到配置文件中,再重启服务就还原成功了
[root@localhost opt]# iptables-restore < /opt/iptables.bak
[root@localhost opt]# systemctl restart iptables.service
[root@localhost opt]# iptables -nL
7、 案例实验
网络规划
-
内部PC1位于内网区域,地址段为: 192.168.1.0/24,pc1地址为:192.168.1.1/24,网关地址为:192.168.1.254/24
-
服务器S1位于服务器区域,地址段为: 192.168.2.0/24,pc1地址为:192.168.2.1/24,网关地址为:192.168.2.254/24
-
PC2位于互联网区域,模拟外部互联网,地址段为:10.0.0.0/8,pc2地址为:10.0.0.1/8
-
Linux防火墙的三块网卡为别连接不同的网络区域,地址分别为 :ens33 192.168.1.254/24;ens34 10.0.0.100/8;ens35 192.168.2.254/24
实验要求
-
内部网络中的pc1采用SNAT访问外部互联网,但是无法ping到内部网关。
-
内部网络服务器s1通过DNAT发布服务到互联网。
-
互联网主机pc2能够访问DMZ区域的服务器,但是不能够进行ping和ssh连接。
准备操作
1.配置网卡
首先在防火墙上添加两块网卡,分别在自定义里选择VMnet1,2,3,同时在右上方编辑里点击虚拟网络编辑器里将3个网卡的使用本地DHCP分配地址前的勾去掉,同时pc2,pc1和服务器的网卡也要注意根据IP
2.关闭防火墙和其它影响要素
例:
[root@PC1 ~]# systemctl stop firewalld.service
[root@PC1 ~]# iptables -F
[root@PC1 ~]# setenforce 0
3.安装nginx
实战
-
内部网络中的pc1采用SNAT访问外部互联网,但是无法ping到内部网关。
[root@iptables ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens192 -j SNAT --to-source 10.0.0.100 [root@iptables ~]# iptables -nL -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 192.168.1.0/24 0.0.0.0/0 to:10.0.0.100 Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain LIBVIRT_PRT (0 references) target prot opt source destination [root@iptables ~]#
[root@iptables ~]# iptables -A INPUT -i ens160 -s 192.168.1.1 -p icmp --icmp-type echo-request -j DROP [root@iptables ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination LIBVIRT_INP all -- 0.0.0.0/0 0.0.0.0/0 DROP icmp -- 192.168.1.1 0.0.0.0/0 icmptype 8 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination LIBVIRT_OUT all -- 0.0.0.0/0 0.0.0.0/0 Chain LIBVIRT_INP (1 references) 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 Chain LIBVIRT_OUT (1 references) 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:68 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:68 Chain LIBVIRT_FWO (0 references) target prot opt source destination ACCEPT all -- 192.168.122.0/24 0.0.0.0/0 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain LIBVIRT_FWI (0 references) target prot opt source destination ACCEPT all -- 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain LIBVIRT_FWX (0 references) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
[root@PC1 network-scripts]# ping 10.0.0.1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=63 time=14.3 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=63 time=4.61 ms 64 bytes from 10.0.0.1: icmp_seq=3 ttl=63 time=13.7 ms 64 bytes from 10.0.0.1: icmp_seq=4 ttl=63 time=4.07 ms ^C --- 10.0.0.1 ping statistics --- 6 packets transmitted, 4 received, 33.3333% packet loss, time 5045ms rtt min/avg/max/mdev = 4.069/9.165/14.279/4.835 ms [root@PC1 network-scripts]# ping 192.168.1.254 PING 192.168.1.254 (192.168.1.254) 56(84) bytes of data. ^C --- 192.168.1.254 ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 4121ms
-
内部网络服务器s1通过DNAT发布服务到互联网。
[root@iptables ~]# iptables -t nat -A PREROUTING -i ens192 -d 10.0.0.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.1:80 [root@iptables ~]# iptables -nL -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- 0.0.0.0/0 10.0.0.100 tcp dpt:80 to:192.168.2.1:80 Chain INPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 192.168.1.0/24 0.0.0.0/0 to:10.0.0.100 Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain LIBVIRT_PRT (0 references) target prot opt source destination
[root@S1 ~]# ping 10.0.0.100 PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data. 64 bytes from 10.0.0.100: icmp_seq=1 ttl=64 time=8.94 ms 64 bytes from 10.0.0.100: icmp_seq=2 ttl=64 time=1.78 ms 64 bytes from 10.0.0.100: icmp_seq=3 ttl=64 time=4.02 ms 64 bytes from 10.0.0.100: icmp_seq=4 ttl=64 time=0.690 ms 64 bytes from 10.0.0.100: icmp_seq=5 ttl=64 time=0.792 ms 64 bytes from 10.0.0.100: icmp_seq=6 ttl=64 time=3.69 ms 64 bytes from 10.0.0.100: icmp_seq=7 ttl=64 time=0.793 ms 64 bytes from 10.0.0.100: icmp_seq=8 ttl=64 time=3.03 ms 64 bytes from 10.0.0.100: icmp_seq=9 ttl=64 time=5.46 ms ^C64 bytes from 10.0.0.100: icmp_seq=10 ttl=64 time=10.2 ms 64 bytes from 10.0.0.100: icmp_seq=11 ttl=64 time=1.81 ms ^C --- 10.0.0.100 ping statistics --- 11 packets transmitted, 11 received, 0% packet loss, time 10082ms rtt min/avg/max/mdev = 0.690/3.746/10.202/3.113 ms [root@S1 ~]# curl 10.0.0.100
-
互联网主机pc2能够访问DMZ区域的服务器,但是不能够进行ping和ssh连接。
root@iptables ~]# iptables -A FORWARD -i ens192 -o ens224 -p icmp --icmp-type echo-request -d 192.168.2.1 -j DROP
[root@iptables ~]# iptables -A FORWARD -i ens192 -o ens224 -p tcp --dport 22 -d 192.168.2.1 -j DROP
root@PC2 ~]# curl 10.0.0.100
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Test Page for the Nginx HTTP Server on Rocky Linux</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
/*<![CDATA[*/