对于家中宽带有公网IP的用户,有时我们需要将路由器内部网络的某些web服务通过端口转发暴露到外网(例如NAS远程访问),但HTTP是明文传输,有被监听的风险;如果在NAS上使用自签名证书,再端口转发,会被Chrome浏览器认为是风险连接拒绝访问(笔者使用80.0.3987版本,命令行参数启动、系统添加证书信任法均不能通过);使用某些NAS自带的Let's Encrypt插件申请到的证书,也只能为NAS单独一个服务添加HTTPS。本文将介绍如何在路由器上安装NGINX并部署SSL,反向代理内网中的多个HTTP服务。

要求

一个域名,无须备案;路由器有公网IP,路由器为Pandorabox固件(理论上基于openwrt的固件都可以);软件源已更至最新。

截至2020.03,可用的Pandorabox软件源地址为http://downloads.pangubox.com:6380/pandorabox

比如我的路由器为newifiD1,配置信息则为

src/gz 18.10_base http://downloads.pangubox.com:6380/pandorabox/18.10/packages/mipsel_1004kc_dsp/base
src/gz 18.10_lafite http://downloads.pangubox.com:6380/pandorabox/18.10/packages/mipsel_1004kc_dsp/lafite
src/gz 18.10_luci http://downloads.pangubox.com:6380/pandorabox/18.10/packages/mipsel_1004kc_dsp/luci
src/gz 18.10_mtkdrv http://downloads.pangubox.com:6380/pandorabox/18.10/packages/mipsel_1004kc_dsp/mtkdrv
src/gz 18.10_newifi http://downloads.pangubox.com:6380/pandorabox/18.10/packages/mipsel_1004kc_dsp/newifi
src/gz 18.10_packages http://downloads.pangubox.com:6380/pandorabox/18.10/packages/mipsel_1004kc_dsp/packages

安装Nginx和acme

nginx在pandorabox的web管理界面或命令行opkg install nginx 安装均可,acme按照官方说明安装、运行,但之前还需再安装几个包:curl wget ca-certificates openssl-util ca-bundle socat

ca-bundle是一堆打包的CA根证书,pandorabox默认不包含任何CA根证书,所以无法建立任何SSL连接。socat在acme的部分功能里会用到,最好安装。

安装过程还有几个地方需要注意:

1. 安装nginx后会报启动失败,端口被占用,这是正常的,因为80端口已经被路由器Web管理界面(uhttpd服务)占用了,之后我们会改nginx配置文件。

2. 使用http验证,注意uhttp的默认网站根目录是/www,并需在防火墙中打开80端口,如果运营商屏蔽了80端口,那http根目录验证无法使用,但可以用standalone模式指定其他端口验证。比如使用88端口,先在防火墙中打开88端口,然后验证命令为:

acme.sh --issue -d example.com --standalone --httpport 

如果使用nginx自动验证,要确保nginx已经正确运行,这需要配置uhttpd端口与nginx不冲突,以及防火墙,不建议使用。

3. 使用dns验证,无需在路由器上做任何配置,建议使用acme的自动txt记录添加功能

4. 拷贝证书可以用acme的拷贝命令,但需做修改如下

acme.sh --installcert -d example.com \
--key-file /etc/nginx/key.pem \
--fullchain-file /etc/nginx/cert.pem
# --reloadcmd "service nginx force-reload" 不要添加这句

配置Nginx

至此证书已经获取完毕,接下来在nginx中配置。假设我们内网的两个web服务地址分别为http://192.168.0.100, http://192.168.0.102/test

user nobody nogroup;
worker_processes ; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections ;
} http {
include mime.types;
#default_type application/octet-stream; #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 logs/access.log main; sendfile on;
#tcp_nopush on; #keepalive_timeout ;
client_body_timeout ;
client_header_timeout ;
keepalive_timeout ;
send_timeout ; gzip on; server {
listen ssl; #不方便使用443端口可更换其他端口
server_name example.com; charset utf-;
ssl_certificate cert.pem; #注意这里两个文件不要写反了
ssl_certificate_key key.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
#access_log logs/host.access.log main; #error_page /.html;
proxy_connect_timeout ;
proxy_send_timeout ;
proxy_read_timeout ;
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr; location /servertest {
proxy_pass http://192.168.0.102/test;
proxy_redirect default; #nginx服务器不做缓存,所有请求都转发到目标服务器进行处理
proxy_buffering off;
}
location /server1 {
proxy_pass http://192.168.0.100;
# 不做配置,nginx会对内容进行缓存,速度有些许提升,但可能遭遇超时问题
} location ~ //.ht {
deny all;
} #error_page /50x.html;
#location = /50x.html {
# root html;
#} }
}

Nginx配置文件

重启nginx服务:/etc/init.d/nginx restart

如果没有错误信息输出,防火墙的相应端口已经打开,则访问https://example.com/server1和https://example.com/servertest(如果指定非443端口需加上端口号),发现服务已经运行在ssl之上了。更多服务只需设置更多子目录转发即可。

注意

1. 理论上到nginx配置之前都可以在内网主机上进行,最终只要手动拷贝生成的两个证书文件到路由器/etc/nginx目录即可,但在证书验证环节就需要端口转发,或者用dns验证。

2. 即使路由器不支持安装nginx,也可以在内网主机上安装nginx,然后把此主机设为DMZ或者用端口映射的方式暴露出来,效果是一样的,具体步骤不再赘述。

3. SSL对路由器性能开销不小,笔者的newifiD1在测试大文件下载时速度要比HTTP降低一半左右,且路由器负载跑满,有条件应使用高配路由器。

Pandorabox固件路由器上申请Let's Encrypt证书,为内网里的多个web服务提供SSL支持的更多相关文章

  1. 申请Let’s Encrypt通配符HTTPS证书(certbot ACME v2版)

    1.获取certbot-auto# 下载 # 下载 wget https://dl.eff.org/certbot-auto # 设为可执行权限 chmod a+x certbot-auto 2.开始 ...

  2. Linux下使用acme.sh申请和管理Let’s Encrypt证书

    关于Let's Encrypt 免费SSL证书 Let's Encrypt 作为一个公共且免费 SSL 的项目逐渐被广大用户传播和使用,是由 Mozilla.Cisco.Akamai.IdenTrus ...

  3. 在Windows Server 2008上部署免费的https证书

    背景 后web时代,https加密的重要性不言而喻.主流浏览器均对http站点标记不安全,敦促web服务提供商尽快升级至https. 原先的https证书多由各大域名服务商提供,动辄成千上万的部署证书 ...

  4. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  5. Tp-link路由器怎么设置端口映射 内网端口映射听语音

    https://jingyan.baidu.com/article/ca00d56c710ef9e99eebcf85.html 只有一台能上网的电脑就可以自己免费搭建服务器,本经验简单介绍家用tp-l ...

  6. 〖Network〗宿舍配置两路由器,同时访问校园内网和校园外网

    环境: 校园宿舍, 10.x.x.x 和 172.16.x.x~172.31.x.x是校园内网,本科教务系统什么的都在上边 路由器: 路由器1(校园内网):水星MR807 路由器2(拨号上网):TP ...

  7. 设置openwrt路由器的防火墙_允许从外网访问内网的ipv6服务

    设置openwrt路由器的防火墙_允许从外网访问内网的ipv6服务 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-11-02. 参考文章: IPv6"内网"设备 ...

  8. Openwrt路由器上安装python

    在路由器安装python之前,还是经过了一番折腾的.淘宝上买了个已经刷好系统的小米迷你路由器,但里面安装的不是预期的Pandorbox,而是LEDE. 这个固件已经带了大量自带的软件,128的内存实在 ...

  9. 打破常规——大胆尝试在路由器上搭建SVN服务器

    注册博客园挺久了,一直比较懒,虽然有几次想写点文章,但是一直没有行动,今天给大家带来一篇比较有意思的文章,不涉及技术上的,希望大家轻拍.本文的文字和图片全部为原创,尊重作者转载请注明出处! 说起路由器 ...

随机推荐

  1. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:数据集基本使用方法

    import tempfile import tensorflow as tf # 1. 从数组创建数据集. input_data = [1, 2, 3, 5, 8] dataset = tf.dat ...

  2. DNA methylation|Transcription factors|PTM|Chromosome conformation|表观遗传学测序技术

    生物医疗大数据-DNA element functions and identification Genetic vs epigenetic GENETICS  遗传学 DNA Code: 64 tr ...

  3. 900B. Position in Fraction#分数位置(模拟)

    题目出处:http://codeforces.com/problemset/problem/900/B 题目大意:找到一个数字在小数部分中第一次出现的位置 #include<iostream&g ...

  4. Wanna go back home

    题目描述 Snuke lives on an infinite two-dimensional plane. He is going on an N-day trip. At the beginnin ...

  5. Zabbix - 修改默认的 Web 访问URL

    背景 CentOS 7 64 Zabbix 4 LTS 使用RPM在线方式安装 修改过程 # 修改默认的访问路径:http://x.x.x.x/zabbix 修改为 http://x.x.x.x/ v ...

  6. JAVA专业术语面试100问

    前言:面试技巧另外开篇再说,先上面试干货吧.Redis.消息队列.SQL不要走开,关注后更精彩! 1.面向对象的特点有哪些? 抽象.继承.封装.多态. 2.接口和抽象类有什么联系和区别? 3.重载和重 ...

  7. STL:map中的lower_bound和upper_bound

    今天在做leetcode的Longest Increasing Subsequence题目时,需要用到二分查找,于是翻看了<STL源码剖析>这本书,发现map里面有lower_bound和 ...

  8. Linux查看后台任务,关闭后台任务

    jobs查看后台任务, kill %num关闭相应的后台任务

  9. 使用jQuery的".css()"和".attr()"方法设置元素"left"属性的注意点

    今天在使用jQuery方法".css()"设置"ajax-loader.gif"的位置时出了点小状况,关键代码如下(为了简化,这里假定要给"ajax- ...

  10. Java IO: Reader And Writer

    原文链接 作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) Java IO的Reader和Writer除了基于字符之外,其他方面都与InputStre ...