2025年1月8日更新
今天在另一台服务器上用下述方法,结果出现如下警告:
nginx: [warn] protocol options redefined for 0.0.0.0:443 in /etc/nginx/conf.d/xxx.conf:4
这个xxx.conf的头几行是这样的:
server {
listen 80;
listen [::}:80;
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
……
因为使用下文中的方法,导致监听同一个端口443却使用了不同的配置(一个带ssl,一个不带ssl),因此将默认配置修改为:
server {
listen 80 default_server;
listen [::}:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
http2 on;
server_tokens off;
server_name _;
return 444;
ssl_certificate /etc/nginx/ssl/default.crt;
ssl_certificate_key /etc/nginx/ssl/default.key;
……
上面的default.crt和default.key是通过openssl命令生成的自签名SSL证书和密钥。制作方法如下:
首先,安装openssl程序
apt update
apt install openssl
生成自签名证书和密钥:
mkdir /etc/nginx/ssl/
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/ssl/default.key -out /etc/nginx/ssl/default.crt
重新加载nginx配置,警告消失。
打开浏览器,输入ip地址:
已经无法显示正常页面了。
点击证书详情,显示如下:
参考资料:
https://chenhaotian.top/linux/nginx-deny-ip-access/index.html
2025年1月7日原文
之前有个问题一直没有留意,直到最近服务器动不动崩溃才意识到,似乎我一直没有禁止对服务器IP的直接访问。这次趁着更换操作系统并升级MediaWiki的时候就一起进行考虑了。
Nginx提供了多种方法来防止通过IP地址直接访问网站。
一、修改Nginx配置文件
要实现Nginx禁止通过IP访问,可以通过修改Nginx的配置文件(nginx.conf)来实现,以下是具体的配置步骤:
步骤1: 打开Nginx的配置文件nginx.conf。
步骤2: 在http块中添加一个新的server段,用于处理默认虚拟主机,关键配置在于listen 80 default;这行代码,它表示这个server块将作为默认虚拟主机。
步骤3: 在这个server块中,可以设置返回403(禁止访问)或者是444(关闭连接却不返回信息),或者进行其他自定义操作,如跳转到指定页面。
server {
listen 80 default;
server_name _;
return 403;
}
在上述配置中,当用户通过IP地址或未设置的域名访问时,将返回403禁止访问的错误。
二、使用正则表达式限制域名访问
除了简单地禁止IP访问外,还可以通过正则表达式来限制只有特定的域名才能访问网站,以下是一个示例配置:
server {
listen 80;
server_name ~^(www.)?yourdomain.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
if ($host !~* ^(www.)?yourdomain.com$ ) {
return 403;
}
}
在这个配置中,server_name ~^(www.)?yourdomain.com;使用了正则表达式来匹配指定的域名,而if ($host !~* ^(www.)?yourdomain.com$ )则用于检查请求的Host头是否与正则表达式匹配,如果不匹配则返回403错误。
三、防盗链设置
为了防止资源被盗用,可以在Nginx中设置防盗链,这通常涉及到检查请求的Referer头部,以确保请求是从合法的页面发起的,以下是一个简单的防盗链配置示例:
server {
listen 80;
server_name yourdomain.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
valid_referers none blocked *.yourdomain.org www.yourdomain.com;
if ($invalid_referer) {
return 403;
}
}
}
在这个配置中,valid_referers指令用于指定合法的Referer头部值,如果请求的Referer头部不合法,则返回403错误。
四、注意事项
在进行以上配置时,请确保已经备份了原始的Nginx配置文件,以便在需要时可以恢复。
修改完配置文件后,需要重新加载或重启Nginx服务使配置生效,可以使用以下命令重新加载Nginx配置:
sudo nginx -s reload
如果服务器上有多个站点,并且只想禁止其中一个站点的IP访问,而不影响其他站点,那么需要在对应的server块中进行配置,而不是在全局的http块中。
对于复杂的需求,可能需要结合多种方法来实现完全的访问控制,可以先使用地理位置限制来允许或拒绝特定地区的访问,然后再在server块中进行更细粒度的控制。
通过以上配置,可以有效地防止通过IP地址直接访问Nginx服务器,同时提高服务器的安全性和稳定性。
存在的问题
这两天按网上搜来的如下配置,结果发现无法上传文件到OSS上了。
erver {
listen 80 default;
listen 443 default_server; #使用https/443时启用
ssl_certificate xxx.pem; #使用https/443时启用,输入任意站点的有效SSL证书路径即可
ssl_certificate_key xxx.pem; #使用https/443时启用,输入任意站点的有效SSL证书路径即可
server_name _;
return 444;
}
注释掉443和SSL的内容就恢复正常了。