[root@localhost ~]# dnf instally gcc make pcre-devel zlib-developenssl-devel perl-ExtUtils-MakeMaker git wget tar
[root@localhost~] # useradd -M-s /sbin/nologin nginx
[root@localhost~]# mkdir -p /var/log/nginx
[root@localhost~]# chown-R nginx:nginx /var/log/nginx
[root@localhost~]# tar zxf nginx-l.26.3.tar.gz
[root@localhost~ ]# cd nginx-l.26.3
[root@localhost nginx-l.26.3]#./configure\
--prefix=/usr/local/nginx\
--user=nginx\
--group=nginx\
--with-http ssl module\
--with-http v2 module\
--with-http realip module\
--with-http stub status module \ #状态统计模块--withhttp gzip static module\
--with-pcre\
--with-stream
[root@localhost nginx-l.26.3]# make && make install
为主程序 nginx 创建链接文件
[root@localhost nginx-l.26.3]# In -s /usr/local/nginx/sbin/nginx/usr/local/sbin/
[root@localhost ~]# vi /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy serverAfter=network.target
[Service]
Type=forking
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/ki11-S QUIT $MAINPID
TimeoutStopSec=5
KillMode=processPrivateTmp=true
User=root
Group=root
[Install]
WantedBy=multi-user.target
[root@localhost~]#systemctl daemon-reload[root@localhost~]# systemctl start nginx
[root@localhost~]# systemctl enable nginx
避免攻击者通过版本号获取已知漏洞信息,减少攻击面。
/etc/nginx/nginx.conf
或 /usr/local/nginx/conf/nginx.conf
): sudo vi /etc/nginx/nginx.conf
http
块或 server
块中添加: server_tokens off; # 关闭版本号显示
http://你的域名
,查看响应头(如通过浏览器开发者工具或 curl -I http://你的域名
),Server
字段会显示为 nginx
而非 nginx/1.23.4
。禁用 Web 服务器中不必要的 HTTP 请求方法(如 PUT
、DELETE
、OPTIONS
等),防止恶意文件上传或资源删除。
server
或 location
块中添加以下规则,禁止危险方法: location / {
# 允许的方法(按需调整,通常保留 GET、HEAD、POST)
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 405; # 返回 Method Not Allowed 状态码
}
# 额外:限制 OPTIONS 方法(用于跨域预检),按需保留
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header Access-Control-Max-Age 1728000;
add_header Content-Type 'text/plain; charset=utf-8';
add_header Content-Length 0;
return 204; # 允许 OPTIONS,但返回空内容
}
}
sudo nginx -s reload
CC 攻击(Challenge Collapsar 攻击)是一种常见的网络攻击方式,通过大量合法或伪造的小流量请求来耗尽服务器资源,导致正常用户无法访问网站。要在 Nginx 中有效防止 CC 攻击,可以采用多种策略和方法。
CC攻击,也称为连接数攻击或请求速率限制攻击,通过模拟大量用户访问来消耗服务器资源,从而使得正常用户无法正常访问网站。为了防止此类攻击,可以使用 Nginx 提供的模块来限制请求速率和并发连接数
编辑配置文件
[root@localhost ~]#vim /usr/local/nginx/conf/nginx. conf
http {
#定义限制区(10MB 内存/每秒 10 请求)
limit_req_zone $binary_remote_addr zone=reg limit:l0m rate=10r/s,
#其他全局配置...
server i
location /{
root html;index index.html index. php;
limit reg zone=reg limit burst=20 nodelay;
}
......
}
}
关键参数说明:
安装 ab 测试工具
ApacheBench(简称 ab)是 Apache HTTP 服务器自带的一个轻量级、易用的HTTP 服务器性能测试工具。它主要用于评估服务器在并发访问下的性能表现,包括响应时间、吞吐量等关键指标。
[root@localhost~]#dnf install httpd-tools -y
防盗链是一种重要的安全设置,旨在防止未经授权的用户盗用网站(静态)资源。盗链行为不仅侵犯了内容创作者的版权,还可能导致原网站带宽和资源的过度消耗,影响正常用户的访问速度和体验。
一般来说,用户浏览一个完整的页面并不是一次性全部传送到客户端的。如果所请求的页面带有图片或其他信息,那么第一个 HTTP 请求传送的是这个页面的文本,然后通过客户端的浏览器对这段文本进行解释执行。如果发现其中还有图片,那么客户端的浏览器会再次发送一条HTTP请求,当这个请求被处理后这个图片文件才会被传送到客户端,最后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面要经过多次发送 HTTP 请求才能够被完整的显示。基于这样的机制,就会产生盗链问题:如果一个网站中没有其页面中所说图片信息,那么它完全可以链接到其他网站的图片信息上。这样,没有任何资源的网站利用了其他网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。
资源清单
本实验需要两台主机
操作系统 | 域名 | IP | 服务 |
opereuler | www.aaa.com | 192.168.10.202 | 源主机 |
opereuler | www.bbb.com | 192.168.10.101 | 盗链主机 |
192.168.10.202 www. aaa. com
192.168.10.201 www. bbb.com
192.168.10.202 www. aaa.com
192.168.10.201 www.bbb. com
[root@localhost ~]#ls /usr/local/nginx/htm1
[root@localhost~]#vim /usr/local/nginx/html/index.html
aaa It work!
//网页中显示图片的代码
[root@localhost~]#vim /usr/local/nginx/html/index.html
bbb It work!
[root@localhost ~]#vim /usr/local/nginx/conf/nginx.conf
location~ *\.(gif jpgljpeg pnglbmplswf|flv|mp4 webp ico)${
root html;
valid referers aaa.com *.aaa.com;
if ($invalid referer) {
return 403;
}
}
[root@localhost ~]#nginx -t
[root@localhost ~]#nginx-s reload
动态黑名单是 Nginx中一种实时拦截恶意请求的安全机制,它允许在不重启服务的情况下,动态更新需要封禁的 IP地址或网段。相比静态配置的 allow/deny指令,动态黑名单更灵活高效,适用于高并发、多变的攻击防护场景。
[root@localhost ~]# vim /usr/local/nginx/conf/blockips.conf
192.168.1.0/24 1;#封禁整个网段
192.168.10.201 1;#封禁 ip
IP 地址后的数字含义:
0 ""; # 允许
1 403; # 完全封禁
2 444; #静默断开
3 503; #服务不可用
在 Nginx 的主配置文件(通常是 nginx.conf
或者在 sites - available
目录下的站点配置文件)里引入黑名单配置文件,示例如下:
server {
listen 80;
server_name example.com;
# 引入黑名单配置文件
include /path/to/blacklist.conf;
location / {
# 其他配置
root /var/www/html;
index index.html;
}
}
配置完成后,重新加载 Nginx 配置:
sudo nginx -s reload
使用被封禁的 IP 地址尝试访问网站,若看到 “403 Forbidden” 页面,就表明封禁配置生效了。
可以借助脚本实现自动添加 IP 到黑名单。以下是一个简单的 Python 脚本示例,它会将访问失败次数过多的 IP 添加到黑名单:
import subprocess
# 假设这里有一个函数可以获取需要封禁的IP列表
def get_ips_to_block():
# 这里可以实现获取IP列表的逻辑,例如从日志文件中统计
return ['192.168.1.102', '192.168.1.103']
ips = get_ips_to_block()
for ip in ips:
# 将IP添加到黑名单配置文件
with open('blacklist.conf', 'a') as f:
f.write(f'deny {ip};\n')
# 重新加载Nginx配置
subprocess.run(['sudo', 'nginx', '-s', 'reload'])
HTTP 是明文传输协议,数据在传输过程中容易被窃听、篡改和伪造。例如,攻击者可以在网络中截获 HTTP 请求和响应,获取用户的敏感信息,像用户名、密码、信用卡号等。
HTTPS 是在 HTTP 的基础上加入了 SSL/TLS 协议,其通信过程如下:
可以使用以下命令生成自签名的 SSL 证书和私钥:
# 生成私钥
sudo openssl genrsa -out /etc/ssl/private/nginx-selfsigned.key 2048
# 生成证书签名请求(CSR)
sudo openssl req -new -key /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.csr
# 生成自签名证书
sudo openssl x509 -req -days 365 -in /etc/ssl/certs/nginx-selfsigned.csr -signkey /etc/ssl/private
在 Nginx 主配置文件中添加 HTTPS 配置,示例如下:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
location / {
root /var/www/html;
index index.html;
}
}
# 将HTTP请求重定向到HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
配置完成后,重新加载 Nginx 配置:
sudo nginx -s reload
这样,Nginx 就开启了 HTTPS 服务。需要注意的是,自签名证书在浏览器中会显示不安全提示,若要在生产环境使用,建议从权威的证书颁发机构(CA)获取 SSL 证书