目前路由器做了端口映射,外网访问路由器及ESXI的web client都需要输入端口号,但是强迫症总是看着不舒服
既然实现了顶级域名的动态解析,是否可用反向代理的方式来代替端口映射呢,于是测了下443端口,好,没有被block,然后就是用nginx进行反向代理了,之前的极路由内置的就是nginx,极路由基于openwrt,所以路由器上运行nginx可行,那么有没有梅林可用的nginx呢?找了半天终于找到了,而nginx反向代理https需要ssl证书,虽说自建的ssl证书也可行但既然有免费的为什么不用呢,沃通证书不考虑,Let’s Encrypt证书比较新奇就用这个吧,使用DNS验证更是相当方便。
以下是步骤:
1、挂载U盘。
Enware-ng推荐安装在扩展设备上,内置存储虽然也可但毕竟寸土寸金,而且扩展看设备空间大不怕折腾
mkdir /mnt/sda1 && mount /dev/sda /mnt/sda1
2、梅林固件安装Enware-ng,按照说明进行安装,然后执行
opkg install nginx
3、获得Let’s Encrypt证书,DNS方式验证,github地址:https://github.com/xdtianyu/scripts/tree/master/le-dns,此脚本依赖另一个脚本letsencrypt.sh,须先下载letsencrypt.sh并进入letsencrypt.sh才可调用letsencrypt.sh脚本(目录名和脚本名都是letsencrypt.sh)。
mkdir -p /opt/usr/ssl/ && cd /opt/usr/ssl/ git clone https://github.com/lukas2511/letsencrypt.sh.git cd letsencrypt.sh wget https://github.com/xdtianyu/scripts/raw/master/le-dns/le-cloudxns.sh wget https://github.com/xdtianyu/scripts/raw/master/le-dns/cloudxns.conf chmod +x le-cloudxns.sh
修改cloudxns.conf
API_KEY="YOUR_API_KEY" SECRET_KEY="YOUR_SECRET_KEY" DOMAIN="example.com" CERT_DOMAINS="example.com www.example.com im.example.com" #ECC=TRUE
修改其中的 API_KEY 及 SECRET_KEY 为您的 cloudxns api key ,修改 DOMAIN 为你的根域名,修改 CERT_DOMAINS 为您要签的域名列表,需要 ECC 证书时请取消 #ECC=TRUE 的注释。
4、执行le-cloudxns.sh
./le-cloudxns.sh cloudxns.conf
如果是一般linux环境下,直接执行不会有任何问题,但是在梅林固件下,会因为缺少一些命令而导致执行失败,所以在执行le-cloudxns.sh前需进行以下两步:
①安装缺少的相关命令
opkg install bash coreutils-mktemp
②由于bash是额外安装的,路径不再是不再是默认的/bin/bash,所以脚本的解释行要修改以下,查看当前目录下的所有*.sh文件的第一行,如果为
#!/bin/bash
则修改为
#!/usr/bin/env bash
5、修改nginx配置文件nginx.conf
user nobody; worker_processes 2; events { use epoll; worker_connections 64; } http { include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; keepalive_timeout 65; server { listen 443; server_name domain; ssl on; ssl_certificate /opt/usr/ssl/letsencrypt.sh/certs/fullchain.pem; ssl_certificate_key /opt/usr/ssl/letsencrypt.sh/certs/privkey.pem; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; location / { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass https://192.168.199.1:7520/; } } server { listen 443; server_name domain; ssl on; ssl_certificate /opt/usr/ssl/letsencrypt.sh/certs/fullchain.pem; ssl_certificate_key /opt/usr/ssl/letsencrypt.sh/certs/privkey.pem; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forward-For $remote_addr; proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; proxy_pass https://192.168.199.200/; } } }
6、启动nginx
nginx
补充:
到这里就可以运行了,但是在我的是设备上(RV 6300 V2)重启就出现问题了。
问题出现在U盘挂载目录上,Enware-ng默认认为U盘挂载到/mnt/sda1上,但实际上是挂载到了/mnt/sda上,所以要修改一下:
修改/jffs/scripts/post-mount文件
#!/bin/sh if [ "$1" = "/tmp/mnt/sda1" ] ; then #将sda1改为sda ln -nsf $1/entware-ng.arm /tmp/opt fi sleep 2 if [ -f /opt/swap ] then echo -e "Mounting swap file..." swapon /opt/swap else echo -e "Swap file not found or /opt is not mounted..." fi
重启然后查看存在nginx进程,问题解决
最后在/jffs/scripts/services-start加入定时任务
cru a sslupdate "42 4 10/25 * * /opt/usr/ssl/letsencrypt.sh/le-dnspod.sh /opt/usr/ssl/letsencrypt.sh/dnspod.conf >> /opt/var/log/le-dnspod.log 2>&1"
梅林固件默认不打开443端口,而且在管理界面也不允许设置443端口,所以使用iptables命令打开443端口
iptables -I INPUT 7 -p tcp --dport 443 -j ACCEPT
但是随便设置一条端口转发规则都会使443失效,要解决这个问题可以建立一个定时脚本,检测443端口
vim open443.sh #!/bin/sh path=`iptables -nvL | grep 443 | awk '{print $1}'` if [ ! -n "$path" ] then iptables -I INPUT 7 -p tcp --dport 443 -j ACCEPT fi
一致好评~