群晖NAS使用nps获取到真实访问IP
背景
由于使用黑群晖,自己使用nps搭建的内网穿透,由于经常有莫名的访问日志,又看不到访问者IP,未配置前,如果:
能够看到所有访问的ip都是127.0.0.1,日志也无任何参考意义。
思路
收到一片博客启发,自己动手搭建试了试然后成功了。 原文地址:http://k.sina.com.cn/article_1823348853_6cae187502001b77i.html
- nps穿透前面加一层haproxy代理。
- nps内网穿透
- nginx代理携带真实ip,代理到nas的访问地址
外网服务器安装haproxy
对于ubuntu/debian用下面的命令安装
apt update && apt upgrade && apt install haproxy
对于centos用下面的命令安装
yum install epel-release -ysudo yum update -y && yum install haproxy -y
编辑haproyx的配置文件
vim /etc/haproxy/haproxy.cfg
按“i”键进入编辑模式,在文件的最后面插入下面的内容,要根据的自己的实际情况更改。
listen web
bind 0.0.0.0:5001
mode tcp
option forwardfor
# haproxy转发给nps监听的5043端口
server web1 127.0.0.1:5043 send-proxy check inter 3000 fall 3 rise 5
注意缩进,linux下全部使用空格缩进不要使用tab,养成良好习惯。
修改完成后按ESC,输入:wq,保存并退出。
执行 haproxy -f /path/to/haproxy.cfg
检查文件格式是否正确。
如果无错误,则说明没有问题。
执行命令启动服务:
systemctl start haproxy
中间如果修改配置文件,修改完成后则使用下列命令重启:
systemctl start haproxy
下列命令查看服务是否启动成功
systemctl status haproxy
配置Nas上的nginx
cd /etc/nginx/conf.d/
vim http.ip.conf
贴入以下内容:
server {
# 监听IPv4,并开启Proxy Protocol协议
listen 5501 ssl proxy_protocol;
# 监听IPv6,并开启Proxy Protocol协议
listen [::]:5501 ssl proxy_protocol;
# 监听的域名,你解析给云服务器的域名
server_name [你内网穿透服务器对应的域名];
# 排除Cloudflare CDN的IP
# 如果你有使用到CDN的服务的话,一般NAS不会使用到此类IP
# 仅供参考
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
# 排除本地IP,请根据你的具体情况配置
set_real_ip_from 192.168.3.0/16;
set_real_ip_from 172.0.0.0/8;
# 排除服务器IP
set_real_ip_from 42.194.245.33/32;
# 真实IP使用proxy_protocol协议
real_ip_header proxy_protocol;
# 开启排除IP功能
real_ip_recursive on;
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
# 反向代理
location / {
# 目标地址,群晖默认HTTPS地址为5001,请根据实际情况调整
proxy_pass https://localhost:5001;
# 兼容http
# proxy_set_header Upgrade-Insecure-Requests 1;
# 告诉后端使用ssl
proxy_ssl_server_name on;
# 客户端使用的http协议
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Scheme $scheme;
# 客户端host
proxy_set_header Host $host;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-Host $http_host;
# 完整URI
proxy_set_header X-Original-URI $request_uri;
# 客户端使用的端口
proxy_set_header X-Real-Port $proxy_protocol_port;
# 多层代理IP
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
# 客户端IP,群晖默认会通过X-Real-IP获取用户IP
proxy_set_header X-Real-IP $proxy_protocol_addr;
# 支持Websocket
# 如果你使用诸如Docker bash此类的功能,则需要开启Websocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection Upgrade;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 12s
}
}
按ESC键,输入:wq保存并退出
重启nginx
cd /usr/bin/
nginx -s reload
注意
这里就已经完成了,但是有以下事项要注意:
- 公网服务器的haproxy绑定了5001端口,就不能再有5001的内网穿透映射了。需要在nps管理控制台删除掉。
- 访问nas还是和以前内网穿透一样 ,公网ip或域名+5001(https)。
- 其他的使用nginx代理的web station门户也是同样配置 ,自己可以根据本教程举一反三。
- 本教程针对于有一定基础的人群。
License:
CC BY 4.0