liu 发布的文章

Let's Encrypt支持通配符证书了,也就是说你只需要为你的网站申请*.example.com这样一个证书,所有的子域名都可以支持,下面介绍下申请方法:

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书。

  • 安装 acme.sh

  • 生成证书

安装 acme.sh

首先需要获取acme.sh

$ curl https://get.acme.sh | sh

复制

普通用户和 root 用户都可以安装使用。

会安装在 ~/.acme.sh/ 目录下,以后生成的证书也会在这里面,按照域名为文件夹安置。

理论上会自动添加一个 acme.sh 别名,但有时候并不会生成,需要手动执行以下命令:

$ source ~/.bashrc

复制

生成证书

acme.sh支持自动配置DNS,这样需要在域名控制后台获取AppKey和AppSecret.常见的阿里,Dnspod等都支持,这里有更详细的介绍:传送门

下面我们已CloudXNS为例,CloudXNS API需要到 https://www.cloudxns.net/AccountManage/apimanage.html 这里获取API KEYSECRET KEY

服务商名称

服务商简称

所需API参数

获取API参数地址

cloudxns

cx

export CX_Key="123456"
export CX_Secret="abcdef"

点击访问

dnspod (cn大陆版)

dp

export DP_Id="123456"
export DP_Key="abcdef"

点击访问

aliyun

ali

export Ali_Key="123456"
export Ali_Secret="abcdef"

点击访问

cloudflare

cf

export CF_Key="123456"
export CF_Email="abc@example.com"

点击访问

linode

linode

export LINODE_API_KEY="123456"

点击访问

he

he

export HE_Username="username"
export HE_Password="password"

he的用户名密码

digitalocean

dgon

export DO_API_KEY="123456"

点击访问

namesilo

namesilo

export Namesilo_Key="123456"

点击访问

aws

aws

export AWS_ACCESS_KEY_ID=123456
export AWS_SECRET_ACCESS_KEY=abcdef

点击访问

namecom

namecom

export Namecom_Username="username"
export Namecom_Token="123456"

点击访问

freedns

freedns

export FREEDNS_User="username"
export FREEDNS_Password="password"

freedns的用户名密码

godaddy

gd

export GD_Key="123456"
export GD_Secret="abcdef"

点击访问

yandex

yandex

export PDD_Token="abcdef"

点击访问

通过表格可以知道,cloudxns的简称为cx,我们也通过CloudXNS网站获取到了API KEY和SECRTET KEY,下面需要在终端里将API操作所需的参数输出供程序使用

# 替换成从cloudxns后台获取的密钥export CX_Key="CX_Key"export CX_Secret="CX_Secret"# 换成自己的域名
acme.sh --issue --dns dns_cx -d fkomm.cn -d *.fkomm.cn

复制

这里是通过休眠120秒等待DNS生效的方式,所以至少需要等待两分钟,如果看到了验证成功的输出,则说明已经申请成功了。这种方式成功之后,会记录下App_Key跟App_Secret,并且生成一个定时任务,每天凌晨0:00自动检测过期域名并且自动续期。


目前路由器做了端口映射,外网访问路由器及ESXI的web client都需要输入端口号,但是强迫症总是看着不舒服

既然实现了顶级域名的动态解析,是否可用反向代理的方式来代替端口映射呢,于是测了下443端口,好,没有被block,然后就是用nginx进行反向代理了,之前的极路由内置的就是nginx,极路由基于openwrt,所以路由器上运行nginx可行,那么有没有梅林可用的nginx呢?找了半天终于找到了,而nginx反向代理https需要ssl证书,虽说自建的ssl证书也可行但既然有免费的为什么不用呢,沃通证书不考虑,Let’s Encrypt证书比较新奇就用这个吧,使用DNS验证更是相当方便。

以下是步骤:

1、挂载U盘。

Enware-ng推荐安装在扩展设备上,内置存储虽然也可但毕竟寸土寸金,而且扩展看设备空间大不怕折腾

1
mkdir /mnt/sda1 && mount /dev/sda /mnt/sda1

2、梅林固件安装Enware-ng,按照说明进行安装,然后执行

1
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)。

1
2
3
4
5
6
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

1
2
3
4
5
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

1
./le-cloudxns.sh cloudxns.conf

如果是一般linux环境下,直接执行不会有任何问题,但是在梅林固件下,会因为缺少一些命令而导致执行失败,所以在执行le-cloudxns.sh前需进行以下两步:

①安装缺少的相关命令

1
opkg install bash coreutils-mktemp

②由于bash是额外安装的,路径不再是不再是默认的/bin/bash,所以脚本的解释行要修改以下,查看当前目录下的所有*.sh文件的第一行,如果为

1
#!/bin/bash

则修改为

1
#!/usr/bin/env bash

5、修改nginx配置文件nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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

1
nginx

补充:
到这里就可以运行了,但是在我的是设备上(RV 6300 V2)重启就出现问题了。
问题出现在U盘挂载目录上,Enware-ng默认认为U盘挂载到/mnt/sda1上,但实际上是挂载到了/mnt/sda上,所以要修改一下:

修改/jffs/scripts/post-mount文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/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加入定时任务

1
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端口

1
iptables -I INPUT 7 -p tcp --dport 443 -j ACCEPT

但是随便设置一条端口转发规则都会使443失效,要解决这个问题可以建立一个定时脚本,检测443端口

1
2
3
4
5
6
7
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


这篇文章主要介绍了VMware-ovftool命令行部署与导出镜像方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

目录

宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

ESXI6.0之后管理为WEB,OVF导出/部署是个渣渣,如果虚拟机文件过大,一般会报网络异常中断而失败,可使用官方ovftool工具解决,快而方便,支持linux和Mac OSX,可脚本操作,批量处理等。

在windows如已经安装vmware workstation,有个OVFTool目录直接可使用。

如Workstation版本较老,那还是建议安装新版本的独立工具包,README.txt中能看到版本号。

下载地址(需注册登录)https://my.vmware.com/group/vmware/downloads/details?downloadGroup=OVFTOOL440&productId=974

安装VMware-ovftool-4.4.0-15722219-win.x86_64.msi默认C:\Program Files\VMware\VMware OVF Tool当前目录下运行CMD窗口。

OVF导出

1
ovftool.exe  vi://root:@192.168.222.8/CentOS7.4  D:\OVF\CentOS7.4-out.ovf

  • 如导出.ovf目标为目录不带文件名,那出来是一个vm原名的文件夹。

  • 也可以导出为.ova单文件,ovftool也有格式互转功能。

  • 如vm带了光驱文件,那iso也会下来,先剔除吧。

  • 导出过程不可带密码运行,这不如linux版的便利。

部署OVF

1
ovftool.exe -ds=SSDmx500 -dm=thin -n=CentOS7.4new  "D:\OVF\CentOS7.4-out.ovf"  vi://root:@192.168.222.8

1. -ds为目标存储名,按你的实际填写

2. 使用ovftool.exe部署由vSphere Client出来的ovf成品也相同方式,没毛病!

vSphere Client部署该成品

直接部署会出现SHA256校验错误,删除.mf文件重来一次即可。

如部署为该成品的.ova单文件,先解压即可是ovf目录格式,删除.mf文件即可。

linux版本的安装及使用

1
2
3
chmod  +x  VMware-ovftool-4.4.1-16812187-lin.x86_64.bundle
  
sh  VMware-ovftool-4.4.1-16812187-lin.x86_64.bundle

在大空间存储下创建OVF导出位置

  • mkdir /opt/OVF

  • cd /opt/OVF

导出

1
ovftool vi://root@192.168.222.8/CentOS7.4   ./CentOS7.4.ovf

可直接带密码操作

1
ovftool  vi://root:'PassWd#9'@192.168.222.8/CentOS7.4   ./CentOS7.4.ovf

带多功能参数的导出

1
ovftool --powerOffSource -o --X:logFile=./ovf.log   vi://root:'PassWd#9'@192.168.222.8/CentOS7.4  ./CentOS7.4`date +%Y%m%d`.ova
  • --powerOffSource 先切断电源关机

  • -o 同名覆盖(导出导入)

  • --X:logFile 输入详细日志

带多功能参数的部署

1
ovftool --powerOn -ds=SSDmx500 -dm=thin --network='vlan-253' -n=CentOS7.4-new  "CentOS7.4.ovf"  vi://root:'PassWd#9'@192.168.222.8
  • --powerOn 部署完毕自动开机

  • -dm=thin 还可以选择Thick(厚置备延迟置零---省略值) eagerZeroedThick(厚置备置零)

  • --network 部署选择网卡标签

使用proxy代理

1
ovftool  --proxy=http://192.168.253.99:8118  vi://root@192.168.222.8/CentOS7.4   ./CentOS7.4proxy.ovf

批量部署

(有多个ova文件,加个for循环用shell脚本自动部署)

1
2
3
4
5
6
7
8
#!/bin/bash
filename=` find  /opt/ovf/  -name *.ova`
# find all ova template
for  ova  in  $filename
do
/usr/bin/ovftool --X:logFile=./ovflog-`date +%Y%m%d`  -ds=SSDmx500 -dm=thin `echo $ova`  'vi://root:'PassWd#9'@192.168.222.8'
continue
done

与vcenter的格式

1
'vi://username:password@pod01-vcenter/POD01(TEST-POD)/host/POD01-CLU01/pod01-clu01-h001.cdscloud.local'
  • pod01-vcenter 是vcenter的名称;

  • POD01(TEST-POD) 是数据中心的名称;

host后面接模板部署目标host位置,CLU01代表集群,pod1-clu01-h001.jx.local是集群下的一台宿主机;

需要注意的是,这里的dns要设置好,或者也可用ip地址代替,比如:

1
vi://username:password@192.168.1.1/?ip=192.168.100.1'

192.168.1.1是vcenter的地址,192.168.100.1是目标宿主机的ip地址;

这里跟vcenter的连接也可以用http的形式,具体详见官方文档。

注意:

以上全文验证账户与导出/入过程都使用443目标端口。

镜像格式转换ovftool CentOS7.4.ovf CentOS7.4.ova (可互转)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。