梅林固件安装nginx,获取lets-encrypt 证书并反向代理内网https

目前路由器做了端口映射,外网访问路由器及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

发表评论

电子邮件地址不会被公开。 必填项已用*标注