前言

在2018年8月,我第一次自己接触KMS服务,当时介绍了秋水逸冰的KMS一键脚本。

最近给虚拟机里的windows 11激活用的都是改版梅林软件中心能安装的系统工具,很方便实用.

如果只是想激活系统和Office,使用现成的路由器插件或kms服务器地址即可,我做好的是kms.j000e.co

所以我想做一个长期运行的公用kms服务器,放在自己博客首页左侧边栏里.

本文遇到的主要难点在于如何用systemd为vlmscd开机启动,和如何拥有一个能监控服务器是否正常工作的页面.

准备vlmcsd

首先什么是vlmcsd?

vlmcsd is

  • a replacement for Microsoft's KMS server It contains vlmcs a KMS test client, mainly for debugging purposes, that also can "charge" a genuine KMS server designed to run on an always-on or often-on device,e.g. router, NAS Box, ... intended to help people who lost activation of their legally-owned licenses, e.g. due to a change of hardware (motherboard, CPU, ...)

vlmcsd is not

  • a one-click activation or crack tool intended to activate illegal copies of software (Windows, Office, Project, Visio)

目前GitHub上有两个vlmcsd开源项目,我们选择Wind4的版本.

Wind4/vlmcsd - GitHub

kkkgo/vlmcsd - GitHub

下载最新的release并解压

wget https://github.com/Wind4/vlmcsd/releases/download/svn1113/binaries.tar.gz
tar -zxvf binaries.tar.gz

进入对应系统的目录并运行

cd binaries/Linux/intel/static/
./vlmcsd-x64-musl-static -L 0.0.0.0:xxxx
# 如果不带-L,则默认端口1688
# 举例:./vlmcsd-x64-musl-static -L 0.0.0.0:6666

测试一下服务是否正常运行

./vlmcs-x64-musl-static
#运行得到如下输出则正常
Connecting to 0.0.0.0:1688 ... successful
Sending activation request (KMS V6) 1 of 1  -> 03612-00206-566-464396-03-1103-14393.0000-2672021 (3A1C049600B60076)
#如下输出表示服务异常
Connecting to xx.xx.xx.xx:1688 ... successful

Fatal: Did not receive a response from server
Warning: Could not bind RPC
Fatal: Could not connect to any KMS server

也可以在windows系统上下载并解压binaries.tar.gz后,进入到\binaries\Windows\intel,在这个目录打开cmd并运行

vlmcs-Windows-x86.exe [IP or domain]:[Port]
#输出结果同上

创建systemd服务

关于systemd的一切详情,可以参考上一篇文章

首先放上我的配置文件kms.service

[Unit]
Description=vlmcsd
Wants=network.target
After=syslog.target

[Service]
Type=forking
PIDFile=/var/run/vlmcsd.pid
ExecStart=/home/KMS/binaries/Linux/intel/static/vlmcsd-x64-musl-static -l /var/log/vlmcsd.log -p /var/run/vlmcsd.pid
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=on-failure
RestartSec=30s
PrivateTmp=true

[Install]
WantedBy=multi-user.target

首先任意地方先新建一个kms.service文件,然后粘贴上面配置进去,其中ExecStart参数路径必须是绝对路径,容易写错.然后将该文件复制到/etc/systemd/system/,即创建了一个新的服务,

vi kms.service
# 复制粘贴
cp kms.service /etc/systemd/system/

然后刷新一下systemctl配置,就可以使用systemd控制vlmcsd了

# 刷新配置
systemctl daemon-reload

# 开机自启
systemctl enable kms

# 启动
systemctl start kms

# 停止
systemctl stop kms

# 状态
systemctl status kms

通过之前的测试方法,重启,手动开关指令都生效了.

运行状态输出如下

● kms.service - vlmcsd
     Loaded: loaded (/etc/systemd/system/kms.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-10-03 03:01:41 CST; 1s ago
    Process: 1715 ExecStart=/home/KMS/binaries/Linux/intel/static/vlmcsd-x64-musl-static -l /var/log/vlmcsd.log -p /var/run/vlmcsd.pid (code=ex>
   Main PID: 1717 (vlmcsd-x64-musl)
      Tasks: 1 (limit: 1035)
     Memory: 144.0K
     CGroup: /system.slice/kms.service
             └─1717 /home/KMS/binaries/Linux/intel/static/vlmcsd-x64-musl-static -l /var/log/vlmcsd.log -p /var/run/vlmcsd.pid

Oct 03 03:01:41 iZt4na5bkc7wj3hsqzikamZ systemd[1]: Starting vlmcsd...
Oct 03 03:01:41 iZt4na5bkc7wj3hsqzikamZ systemd[1]: Started vlmcsd.

至此,systemctl对于自建的kms服务的各项操作功能都是有效的。

别人的配置文件

这里我记两个GitHub上看到的别人的配置

Scripts-Collection/files/vlmcsd/vlmcsd.service

[Unit]
Description=vlmcsd
Documentation=https://forums.mydigitallife.net/threads/emulated-kms-servers-on-non-windows-platforms.50234/
Wants=network.target
After=syslog.target

[Service]
Type=forking
PIDFile=/var/run/vlmcsd.pid
ExecStart=/usr/local/vlmcsd/vlmcsd -l /var/log/vlmcsd.log -p /var/run/vlmcsd.pid
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=on-failure
RestartSec=30s
PrivateTmp=true

[Install]
WantedBy=multi-user.target

FalconIA/vlmcsd.service

[Unit]
Description=vlmcsd
Wants=network.target
After=syslog.target

[Service]
Type=forking
PIDFile=/var/run/vlmcsd.pid
ExecStart=/usr/local/vlmcsd/vlmcsd -l /var/log/vlmcsd.log -p /var/run/vlmcsd.pid

[Install]
WantedBy=multi-user.target

配置Nginx反代本地端口

这里我们通过lnmp新建个vhost,再编辑nginx的conf的配置,来实现带SSL的域名访问+端口转发

lnmp vhost add
# 不需要开数据库,各种选项都不用开,网站目录默认空的就行,用自己的域名和SSL证书,
updatedb
# 更新系统索引
locate kms.j000e.co.conf
# 找到刚新建的网站的nginx配置文件位置,复制下来,然后用vi或者在sftp里直接编辑
vi /usr/local/nginx/conf/vhost/kms.j000e.co.conf

下面是我的配置文件:

server
    {
        listen 80;
        #listen [::]:80;
        server_name kms.j000e.co ;
        index index.html index.htm index.php default.html default.htm default.php;
        location / {
            proxy_pass  http://127.0.0.1:1688; 
            proxy_set_header Host $proxy_host; 
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         }  
    }

server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name kms.j000e.co ;
        index index.html index.htm index.php default.html default.htm default.php;
        location / {
            proxy_pass  http://127.0.0.1:1688; 
            proxy_set_header Host $proxy_host; 
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

这里放记几个nginx的模板

将域名转发到本地端口

server{
  listen 80;
  server_name  xxx.com;
  index  index.php index.html index.htm;

  location / {
    proxy_pass  http://127.0.0.1:8080; # 转发规则
    proxy_set_header Host $proxy_host; # 修改转发请求头,让8080端口的应用可以受到真实的请求
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

这样访问xxx.com 时就会转发到本地的 8080 端口

本地一个端口转发到另一个端口或另一个域名

server{
  listen 80;
  server_name 127.0.0.1; # 公网ip
  index  index.php index.html index.htm;

  location / {
    proxy_pass  http://127.0.0.1:8080; # 或 http://www.baidu.com
    proxy_set_header Host $proxy_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

这样访问 http://127.0.0.1时就会转发到本地的 8080 端口或 http://www.baidu.com

加 / 与不加 /

在配置proxy_pass代理转发时,如果后面的url加/,表示绝对根路径;如果没有/,表示相对路径

例如

  1. 加 /
server_name xxx.com
location /data/ {
    proxy_pass http://127.0.0.1/;
}

访问 http://xxx.com/data/index.html 会转发到 http://127.0.0.1/index.html

  1. 不加 /
server_name xxx.com
location /data/ {
    proxy_pass http://127.0.0.1;
}

访问 http://xxx.com/data/index.html 会转发到 http://127.0.0.1/data/index.html

激活指令

KMS服务是否在线?访问我的服务状态查看。

Windows

Windows找到需要的版本密钥

slmgr /ipk NRG8B-VKK3Q-CXVCJ-9G2XF-6Q84J
# 设置产品密钥(Win10/11 专业工作站版)

slmgr /skms kms.j000e.co
# 设定KMS服务器

slmgr /ato
# 激活

slmgr /upk
# 取消激活

Office

Office找到需要的版本密钥

cd C:\Program Files\Microsoft Office\Office16
# 进入Office目录

cscript ospp.vbs /inpkey:YC7DK-G2NP3-2QQC3-J6H88-GVGXT
# 安装密钥

cscript ospp.vbs /sethst:kms.j000e.co
# 如果用其他端口,单独设置ip和端口
# cscript ospp.vbs /sethst:[IP]
# cscript ospp.vbs /setprt:[Port]

cscript ospp.vbs /act
# 激活

cscript ospp.vbs /dstatus
# 查看激活信息

PS:Office的安装建议使用蓝点网的Office Tools

参考文章:
Setup your own KMS server

Last modification:October 5, 2022