目录
SELinux:
SELinux工作原理:
常用的SELinux的几种文件类型:
1、文件类型(file type):用于限制文件的访问。
2、进程类型(process type):用于限制进程的行为。常见的类型包括:
3、端口类型(port type):用于限制网络端口的访问。常见的类型包括:
SELinux的三种模式:
修改安全上下文:
1、chcon命令
例子:使用nginx服务演示安全上下文值的设定
2、semanage 命令
例子:使用nginx服务端口的改变来演示端口的设定
iptables防火墙:
iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:
注意:
iptables 链规则:
实验
实验一:搭建web服务,设置任何人能够通过80端口访问。
实验二:禁止所有人ssh远程登录该服务器
实验三:禁止某个主机地址ssh远程登录该服务器,允许该主机访问服务器的web服务。服务器地址为
Firewalld防火墙
Firewalld和iptables 不同之处
firewalld配置模式
实验
实验一:禁止ssh默认的22端口
实验二:设置其他主机禁止ping本机
富规则
实验三:将8080端口转发到本机的http80端口
SELinux:
SELinux是Security-Enhanced Linux的缩写,意思是安全强化的linux。
SELinux工作原理:
SELinux是通过MAC的方式来控制管理进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源。
常用的SELinux的几种文件类型:
1、文件类型(file type):用于限制文件的访问。
- all files:适用于所有文件。
- httpd_sys_content_t:用于 HTTP 服务内容。
- user_home_t:用于用户主目录。
2、进程类型(process type):用于限制进程的行为。常见的类型包括:
- init_t:用于系统的 init 进程,它会在系统启动时启动。
- httpd_t:用于 Apache HTTP 服务器进程,控制其与系统的交互行为。
- ssh_t:用于 SSH 进程,限制它能否与网络或其他进程进行通信。
3、端口类型(port type):用于限制网络端口的访问。常见的类型包括:
- http_port_t:用于 Web 服务的 HTTP 端口。
- smtp_port_t:用于邮件服务的 SMTP 端口。
- dns_port_t:用于 DNS 服务的 UDP 和 TCP 端口。
SELinux的三种模式:
- enforcing:强制模式,代表SELinux正在运行中,开始限制domain/type。
- permissive:宽容模式,代表SELinux正在运行中,不过仅会有警告信息并不会实际限制domain/type的访问。
- disabled:关闭,SELinux并没有实际运行
修改安全上下文:
1、chcon命令
chcon [-R] [-t type] [-u user] [-r role] 文件
-R:连同该目录下的子目录也同时修改;
-t:后面接安全上下文的类型字段;
-u:后面接身份识别;
-r:后面接角色
例子:使用nginx服务演示安全上下文值的设定
[root@server ~]# vim /etc/nginx/conf.d/vhost2.conf #写一个nginx配置文件
server {listen 192.168.182.100:80;server_name _;root /web/selinux;location / {}
}
[root@server ~]# mkdir -pv /web/selinux
mkdir: 已创建目录 '/web'
mkdir: 已创建目录 '/web/selinux'
[root@server ~]# echo this is selinux > /web/selinux/index.html
以上搭建了一个web服务[root@server ~]# ll -Z /web/
总用量 0
drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 24 7月 26 23:21 selinux
[root@server ~]# chcon -R -t httpd_sys_content_t /web/ #修改web目录下所有文件的类型
[root@server ~]# ll -Z /web/
总用量 0
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_sys_content_t:s0 24 7月 26 23:21 selinux
[root@server ~]# ll -Z /web/selinux/
总用量 4
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 16 7月 26 23:21 index.html
[root@server ~]# systemctl restart nginx.service #修改后启动nginx成功
[root@server ~]# curl 192.168.182.100 #访问到内容
this is selinux
2、semanage 命令
{login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
- -l为查询;
- -a:增加一些目录的默认安全上下文的设置;
- -m:修改;
- -d:删除。
- -t 是一个选项,用于指定对象的类型
- -p 指定端口和协议
例子:使用nginx服务端口的改变来演示端口的设定
[root@server ~]# vim /etc/nginx/conf.d/vhost2.conf
server {listen 192.168.182.100:80;server_name _;root /web/selinux;location / {}
}
#添加了一个端口为1000的一个server模块
server {listen 192.168.182.100:1000;server_name _;root /web/port;location / {}
}
[root@server ~]# semanage port -l | grep -w 80 #HTTP端口类型中没有1000端口的服务
http_port_t tcp 10000, 80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@server ~]# semanage port -a -t http_port_t -p tcp 1000 #添加HTTP1000端口的服务
[root@server ~]# semanage port -l | grep -w 1000
http_port_t tcp 1000, 10000, 80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@server ~]# mkdir -pv /web/port
mkdir: 已创建目录 '/web/port'
[root@server ~]# echo this is 1000 port > /web/port/index.html
[root@server ~]# systemctl restart nginx.service #重启
[root@server ~]# curl 192.168.182.100:1000 #可访问到内容
this is 1000 port
[root@server ~]#通过添加端口服务来实现nginx服务的启动
iptables防火墙:
iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:
- 在进行路由选择前处理数据包,用于目标地址转换(PREROUTING);
- 处理流入的数据包(INPUT);
- 处理流出的数据包(OUTPUT);
- 处理转发的数据包(FORWARD);
- 在进行路由选择后处理数据包,用于源地址转换(POSTROUTING)。
注意:
- 防火墙规则的顺序默认为从前到后依次执行,遇到匹配的规则就不在继续向下查,如果遇到不匹配的规则则会继续向下进行。
- 重点:匹配上了拒绝规则也是匹配。因此,不在继续向下进行。
- 例如:同时执行以下规则
[root@server ~]# iptables -A INPUT -p tcp --dport 3306 -j DROP
-A:添加到链路规则中的末尾
-p:指定端口协议
-j:指定后面的动作
--dport:表示目标端口
DROP:拒绝
ACCEPT:接受
[root@server ~]# iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
此时,第一条规则匹配,检查3306端口是不通的。
iptables 链规则:
- INPUT 链规则:用于处理传入的数据包。
- OUTPUT 链规则:用于处理传出的数据包。
- FORWARD 链规则:用于处理转发的数据包,即网络中通过 Linux 系统进行的数据包转发。
- PREROUTING 链规则:在数据包进入路由之前进行处理,常用于对数据包进行 NAT 转换。
- POSTROUTING 链规则:在数据包离开路由之后进行处理,同样常用于对数据包进行 NAT 转换。
- NAT 链规则:用于处理网络地址转换 (NAT) 相关的规则,包括源地址转换 (SNAT) 和目标地址转换 (DNAT) 等。
实验
实验一:搭建web服务,设置任何人能够通过80端口访问。
[root@server ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
[root@server ~]# iptables -L --line-numbers
[root@server ~]# iptables -D INPUT 1
-I:指定加入规则链并插入在首行
实验二:禁止所有人ssh远程登录该服务器
[root@server ~]# iptables -I INPUT -p tcp --dport 22 -j REJECT
#删除设置的拒绝ssh连接:
[root@server Desktop]# iptables -D INPUT 1
实验三:禁止某个主机地址ssh远程登录该服务器,允许该主机访问服务器的web服务。服务器地址为
拒绝172.24.8.129通过ssh远程连接服务器:
[root@server ~]# iptables -I INPUT -p tcp -s 172.24.8.129 --dport 22 -j
REJECT
允许172.24.8.129访问服务器的web服务:
[root@server ~]# iptables -I INPUT -p tcp -s 172.24.8.129 --dport 80 -j
ACCEPT
Firewalld防火墙
Firewalld和iptables 不同之处
-
- iptables service 在 /etc/sysconfig/iptables 中储存配置,而 firewalld将配置储存在/usr/lib/firewalld/ 和/etc/firewalld/ 中的各种XML文件里.
- 使用 iptables service每一个单独更改意味着清除所有旧有的规则和从/etc/sysconfig/iptables里读取所有新的规则,然而使用 firewalld却不会再创建任何新的规则;仅仅运行规则中的不同之处。因此,firewalld可以在运行时间内,改变设置而不丢失现行连接。
- iptables通过控制端口来控制服务,而firewalld则是通过控制协议来控制端口
firewalld配置模式
运行时模式:表示当前内存中运行的防火墙配置,在系统或firewalld服务重启、停止时将失效;
永久模式:表示重启防火墙或重新加载防火墙时的规则配置,是永久存储在配置文件中的。
- firewall-cmd命令工具与配置模式相关的选项有三个:
- --reload:重新加载防火墙规则并保持状态信息,即将永久配置应用为运行时配置;
- --permanent:带有此选项的命令用于设置永久性规则这些规则只有在重新启动或重新加载防火墙规则时才会生效;若不带此项,表示用于设置运行时规则。
- --runtime-to-permanent:将当前运行时的配置写入规则配置文件中,使当前内存中的规则称为永久性配置
实验
实验一:禁止ssh默认的22端口
执行此命令后,终端无法ssh连接,需要先放行本地的ssh连接,先添加下面命令
[root@server ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#放行已经建立连接的和ESTABLISHED,RELATED有关联的放行
[root@server ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT #-A INPUT:将规则添加到 INPUT 链,即输入流量链。
-p tcp:指定协议为 TCP。
--dport 22:匹配目标端口为 22,也就是 SSH 默认端口。
-j REJECT:使用 REJECT 动作,拒绝匹配的数据包并发送拒绝响应给源地址。[root@server ~]# iptables -L -n #查看默认规则,必须按顺序写,先放行在写策略
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
#0.0.0.0/0:匹配任何源 IP 地址。 0.0.0.0/0:匹配任何目标 IP 地址。state RELATED,ESTABLISHED:匹配与已建立或相关的 TCP 连接相关的数据包。比如,如果你已经 与目标主机建立了 SSH 连接,那么后续的数据包可以通过这条规则。REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
#0.0.0.0/0:匹配任何源 IP 地址。0.0.0.0/0:匹配任何目标 IP 地址。tcp dpt:22:匹配目标端口是 22 的 TCP 数据包,也就是 SSH 默认端口。reject-with icmp-port-unreachable:使用 ICMP unreachable 响应拒绝匹配的数据包。
[root@server ~]# iptables -D INPUT 2 #删除INPUT 2规则链
[root@server ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
[root@server ~]# iptables -I INPUT 2 -p tcp --dport 22 -s 192.168.110.0/24 -j ACCEPT
#允许本网段访问,-I是在INPUT 2 规则前插入
[root@server ~]# iptables -n -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT tcp -- 192.168.110.0/24 0.0.0.0/0 tcp dpt:22
3 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
实验二:设置其他主机禁止ping本机
限制192.168.182.151这台主机ping本机,--icmp-type 8为icmp为请求,0为回复
[root@server ~]# iptables -I INPUT -p icmp --icmp-type 8 -s 192.168.182.151 -j DROP
!为取反,意思为允许192.168.182.151这台主机ping本机
[root@server ~]# iptables -I INPUT -p icmp --icmp-type 8 ! -s 192.168.182.100 -j DROP
[root@server ~]# iptables -n -L --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP icmp -- !192.168.182.151 0.0.0.0/0 icmptype 8
2 ACCEPT tcp -- 192.168.182.0/24 0.0.0.0/0 tcp dpt:22
3 REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 reject-with icmp-port-unreachable
实验三:添加、删除服务;基于端口号规则添加端口号
[root@server ~]# firewall-cmd --permanent --zone=public --add-service=http #放行http服务
success
[root@server ~]# firewall-cmd --permanent --zone=public --remove-service=http
#移除http服务
success[root@server ~]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
success
#连续的端口可以写81-85
富规则
富规则(rich rules)是针对 firewalld 防火墙软件的一种高级配置方式,允许用户定义更复杂的防火墙规则。它可以使用更为灵活的匹配条件,如 IP 段、端口范围等,并支持高级的动作(如重定向、源地址 NAT 等)。
实验三:将8080端口转发到本机的http80端口
[root@server ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.182.151/32" forward-port port=8080 to-port=80 protocol=tcp to-addr="192.168.182.100"' #目标端口为 8080 的 TCP 流量转发到端口号为 80 的服务上。
successforward-port:指定转发端口的规则
port=80 to-port=8080:转发规则将源端口80的数据包转发到目标端口8080
protocol=tcp:端口转发规则的协议为 TCP
to-addr:指定是由哪个IP来转发[root@server ~]# firewall-cmd --reload #重新加载配置
success[root@server ~]# firewall-cmd --list-rich-rules #查看富规则内容
rule family="ipv4" source address="192.168.110.134/32" forward-port port="80" protocol="tcp" to-port="8080"[root@client ~]# curl 192.168.182.100:8080 #客户端可以访问但访问的8080端口会转到80端口
欢迎来到梁浩东的站点