家庭网络一般是需要一个公网ip ,但是家庭的网络ip 一般是会变的,需要一个ddns 服务器来
可以看我这篇【docker 设置 阿里云域名解析ddns】
前提是你需要准备一个域名
通过这边后,域名解析就可以了,就可以通过你自己的域名和端口来访问你的服务了
但是这时 一般是http 请求。http 请求一般是在以明文的形式传输的,会产生不安全因素,
https 是在http 的基础上加了ssl 证书认证,访问是安全的,本篇文章介绍,如果通过nginx 来设置家庭网络的安全访问
本人的路由器是Padavan ,之前也是查询网上资料,一般是让自己的域名在阿里云解析,或者直接在阿里云买的域名都可以,然后申请免费的ssl 证书,然后再Padavan 路由器的
这边设置https , 然后阿里云下载的ssl 文件,导入到
我这边也进行了操作,可能是我设置的流程或者步骤不对,最终请求的还是不安全的链接显示。
当天晚上查找相关资料,看到可以通过nginx 来进行代理转发。正好我家庭网络里有一个设备,安装了docker ,通过docker 安装nginx ,在nginx 里面配置ssl 文件。
在这边我申请的ssl 证书是通过 freessl 免费申请的,
输入自己的域名,选择【通过浏览器生成】
然后下载相关 的证书既可,
最后的一步是设置nginx 的nginx.conf 配置 和路由器的端口转发
端口范围是 外网访问的端口地址,
内网ip 是安装nginx 的家庭内部局域网的ip ,
本地端口是设置的nginx 可以访问的端口(防火墙需要打开端口)
----nginx 端口设置
我这边的nginx服务是docker创建的,所以在 portainer 设置nginx 的端口
左边host 的端口是宿主机可以访问的端口,即路由器那边设置的局域网的端口
右边的container 的端口是容器内的端口,下面的 nginx.conf 设置里面需要访问的端口信息(不熟悉的话,最好设置端口一样)
docker 安装nginx
sudo mkdir -p /opt/app/nginx/www
sudo mkdir -p /opt/app/nginx/conf
sudo mkdir -p /opt/app/nginx/logs
sudo mkdir -p /opt/app/nginx/ssl
把下载的证书放到 /opt/app/nginx/ssl 目录下
网上下载一个nginx.conf 模板到/opt/app/nginx/conf目录下面
nginx 容器运行
sudo docker run --restart=always -d --privileged=true -p 8080:80 --name mynginx -v /opt/app/nginx/www:/usr/share/nginx/www -v /opt/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/app/nginx/ssl:/usr/share/nginx/ssl -v /opt/app/nginx/logs:/var/log/nginx nginx:latest
上面的-p 可以设置多个端口,按照自己需要访问的服务端口来配置
nginx.conf 模板
events {
worker_connections 1024;
}
http {
#client_max_body_size 1024m;
include /etc/nginx/mime.types;
default_type application/octet-stream;
client_max_body_size 1024m;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_min_length 1k;
gzip_comp_level 9;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
server {
listen 8080 ssl;
server_name 域名;
charset utf-8;
ssl_certificate /usr/share/nginx/ssl/域名.crt; # 证书路径根据上面生成的来定
ssl_certificate_key /usr/share/nginx/ssl/域名.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers 'xxxxxxxxxxxxxxxx自己的ssl_ciphers';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
error_page 500 502 503 504 /50x.html;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://局域网提供服务的ip:服务端口/;
}
}
}
这样,可以通过https:ip:端口,来访问对应的服务,如果需要多个服务,可以设置多个server
本人通过freessl 下载的证书里面只有2个文件,【.pem 和 .key 文件】,但是我看nginx里面配置的是需要的 .crt 文件, 然后将 .pem 文件重命名为 .crt 文件就可以了。
基本思路是域名解析后访问路由器,路由器进行端口转发,转发到内网的 nginx 的ip , 然后通过nginx 的代理转发到 局域网内的 各个服务 。