Nginx白名单IP,否则使用证书
Nginx Whitelist IP, use certificate otherwise
我正在为我的大学设置一个服务器,该服务器必须只能从他们的网络内部访问。
我可以使用 nginx 轻松做到这一点。不幸的是,有些人无法访问此 network/IP 范围。我可以使用 Basic Authentication With Source IP Whitelisting,但我更愿意使用证书。
有没有办法先检查访问是否来自允许的 IP 范围内,如果不要求证书?
我试过类似的方法:
server {
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/test.de/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/test.de/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
# server_name _;
server_name test.de;
ssl_client_certificate /etc/nginx/client_certs/ca.crt;
ssl_verify_client optional;
error_log /var/log/nginx/errors.log debug;
location / {
satisfy any;
allow 123.0.0.0/16;
allow 456.0.0.0/16;
deny all;
if ($ssl_client_verify != SUCCESS) {
return 403;
}
try_files $uri $uri/ =403;
}
}
server {
if ($host = test.de) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 ;
listen [::]:80 ;
server_name test.de;
return 404; # managed by Certbot
}
这是行不通的。
我可以在检查 ssl_client_verify
like
之前检查 IP
if ($remote_addr = 1.2.3.4 )
{
proxy_pass http://10.10.10.1;
break;
}
if ($ssl_client_verify != "SUCCESS")
{ return 403; }
但这对每个 IP 地址都不可行。
我怎样才能有效地处理这个问题?
提前致谢
~法比安
您可以使用 geo
块代替 allow
/deny
语句并使用 $ssl_client_verify
作为默认值。
例如:
geo $verify {
123.0.0.0/16 "SUCCESS";
456.0.0.0/16 "SUCCESS";
default $ssl_client_verify;
}
server {
if ($verify != "SUCCESS") { return 403; }
...
}
详情见this document。
我正在为我的大学设置一个服务器,该服务器必须只能从他们的网络内部访问。 我可以使用 nginx 轻松做到这一点。不幸的是,有些人无法访问此 network/IP 范围。我可以使用 Basic Authentication With Source IP Whitelisting,但我更愿意使用证书。
有没有办法先检查访问是否来自允许的 IP 范围内,如果不要求证书?
我试过类似的方法:
server {
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/test.de/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/test.de/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
# server_name _;
server_name test.de;
ssl_client_certificate /etc/nginx/client_certs/ca.crt;
ssl_verify_client optional;
error_log /var/log/nginx/errors.log debug;
location / {
satisfy any;
allow 123.0.0.0/16;
allow 456.0.0.0/16;
deny all;
if ($ssl_client_verify != SUCCESS) {
return 403;
}
try_files $uri $uri/ =403;
}
}
server {
if ($host = test.de) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 ;
listen [::]:80 ;
server_name test.de;
return 404; # managed by Certbot
}
这是行不通的。
我可以在检查 ssl_client_verify
like
if ($remote_addr = 1.2.3.4 )
{
proxy_pass http://10.10.10.1;
break;
}
if ($ssl_client_verify != "SUCCESS")
{ return 403; }
但这对每个 IP 地址都不可行。
我怎样才能有效地处理这个问题?
提前致谢 ~法比安
您可以使用 geo
块代替 allow
/deny
语句并使用 $ssl_client_verify
作为默认值。
例如:
geo $verify {
123.0.0.0/16 "SUCCESS";
456.0.0.0/16 "SUCCESS";
default $ssl_client_verify;
}
server {
if ($verify != "SUCCESS") { return 403; }
...
}
详情见this document。