version: "3"
services:
# nginx proxy manager反向代理管理
npm:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
container_name: npm
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "password"
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./nginx-proxy-manager/data:/data
- ./nginx-proxy-manager/letsencrypt:/etc/letsencrypt
depends_on:
- db
networks:
- public_access
- database_only
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
container_name: npm-db
environment:
MYSQL_ROOT_PASSWORD: 'root-password'
MYSQL_DATABASE: 'npm'
MYSQL_USER: 'npm'
MYSQL_PASSWORD: 'password'
volumes:
- ./nginx-proxy-manager/data/mysql:/var/lib/mysql
networks:
- database_only
#-------------------------------------------------------------------------------
#内网穿透 nps
nps:
image: ffdfgdfg/nps
container_name: nps
expose:
- '8044'# NPS管理界面的端口
ports:
- '8024:8024' # NPS通讯端口
- '7001:7001' # 远程桌面RDP端口
volumes:
- './nps/conf:/conf'
networks:
- public_access
networks:
public_access: # 自定义外部网络,默认bridge
database_only: # Provide the communication between ttrss and database only
internal: true
先拷贝NPS官网配置conf文件夹全部内容将其放在服务器的nps/conf文件夹里面,再修改其中的nps.conf 的这几项
web_host=自己设置的二级域名
web_username=admin
web_password=password
auth_crypt_key =16位的密码用于加密
public_vkey= #留空,表示关闭客户端配置文件连接模式
再用 sudo docker-compose up -d 运行该docker-compose文件
ps:必须有的配置文件如下
同时,在Lighthouse中防火墙放行相对应的端口,此处放行所有的port端口,即80,81,443,8024,7001端口
用公网IP:81登录Nginx-Proxy-Manager的管理界面,进行如下的设置:
在DNSPod控制台 中 创建DNSPod Token密钥,获取得到 ID 和Token
在Nginx-Proxy-Manager的SSL申请中,假设域名为abc.com,则先在Domain Names 填入 *.abc.com
再填入DNSPod控制台得到的 ID和 Token
以Nginx-Proxy-Manager为例,由前面可知,docker-compose中Nginx-Proxy-Manager的容器名为npm,管理端口号为81
测试一下域名npm.abc.com能否访问Nginx-Proxy-Manager的管理界面,可以的话,以同样的步骤继续设置nps的反向代理
PS:域名能够访问的话,为了安全起见,此时,可以将防火墙的端口启用限制IP来源为服务器的公网IP,这样就不能直接通过公网IP:端口,只能通过域名访问了。
以81端口为例子:
外网机器不能直接连接内网机器,但是内网机器可以上网访问服务器,因此,外网机器可以通过服务器连接上内网机器。
在客户端管理中点击+新增一个客户端,再点击生成客户端的加号获取客户端命令
ID为客户端的唯一标识码,后面还会用到
选择TCP隧道,填写以下三项:
客户端ID、服务端端口、目标端口(Window RDP一般为3389)
建立隧道后,可以通过公网IP:服务端端口 访问内网机器了
配置成系统服务的出发点 如果你的 Windows 程序需要在后台长期运行,而且你希望它在开机后用户登录之前就自动运行、且在用户注销之后也不停止,那么你需要将程序注册为一个系统服务。
在客户端管理 中点击 客户端 左边的加号可以获取客户端启动的命令,使用nps中的npc.exe
Window系统中的启动命令行如下:
npc -server=[二级域名]:[nps配置文件里面的bridge_port] -vkey=[系统自动生成的唯一验证密钥]
nps自带可以注册到系统服务(开机启动、守护进程)
可以注册运行npc的批处理如下:
:: 开始获取管理员权限——先尝试在系统目录下临时新建一个文件夹,若已获取管理员权限或是运行在XP等不需要管理员权限的老系统时,是可以新建成功的,此时只需删除这个临时新建的文件夹就好了,否则通过创建一个临时vbs脚本获取管理员权限,然后再删除这个临时vbs脚本文件。
setlocal
set uac=~uac_permission_tmp_%random%
md "%SystemRoot%\system32\%uac%" 2>nul
if %errorlevel%==0 ( rd "%SystemRoot%\system32\%uac%" >nul 2>nul ) else (
echo set uac = CreateObject^("Shell.Application"^)>"%temp%\%uac%.vbs"
echo uac.ShellExecute "%~s0","","","runas",1 >>"%temp%\%uac%.vbs"
echo WScript.Quit >>"%temp%\%uac%.vbs"
"%temp%\%uac%.vbs" /f
del /f /q "%temp%\%uac%.vbs" & exit )
endlocal
:: 完成获取,下面可以开始写你自己的代码了
:: 跳到bat所在的文件夹
cd /d %~dp0
:: 注意&&与&不同
cmd /k "npc.exe install -server=[公网IP或者二级域名]:[nps配置文件里面的bridge_port] -vkey=[系统自动生成的唯一验证密钥] -type=tcp & npc.exe start"
实现远程控制的安全访问大概有两种方式: 1. 限制访问源,牺牲便捷;例如:需要在访问者和被访问者设备上都需要配置穿透软件 2. 二次认证:本地密码+动态口令(推荐)
Window系统可以利用multiOTP Credential Provider动态口令
2.解压软件包,并运行(可能提示需要运行环境——https://aka.ms/vs/16/release/vc_redist.x64.exe)
#创建一个OTP账户(windows系统中必须有你创建的账户)
./multiotp.exe -fastcreatenopin <用户名>
#建立administrator对应的二维码图片(用手机扫码绑定,获取OPT动态码)
./multiotp.exe -qrcode <用户名> <二维码图片名称.png>
4.打开二维码图片,并使用手机上的动态口令APP扫描添加动态口令令牌。动态口令APP可以使用Aegis Authenticator
ps:添加动态口令令牌以后就可以删除二维码图片,也可以不删除
选择二级域名:端口号,连接后需要内网机器的登录账号和密码,登录成功后,还需要输入手机的动态口令方可进行远程操作操作
linux的动态口令可以参考How to set up two-factor authentication in Linux
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。