Walt 发布的文章

背景

疫情期间,五一、中秋、国庆等假期回家,一直担心被封在家里。所以每次回家都会把宿舍电脑开机,并且记住公网IP,以便能随时远程自己电脑办公。
这种方式虽然也能满足要求,但有如下弊端:

  1. 宿舍宽带虽然有公网IP,但是每次重启路由器、断网或者时间一长会自动更换IP。一旦IP更换,将无法进行远程连接。而且,很多朋友的宽带其实是没有公网IP的。
  2. 必须要保证电脑处于开机状态才能远程。虽然电脑设置了远程开机,但因局域网限制,路由器可能没有端口映射功能,或无权设置,只能在同一网络下远程开机,无法公网远程开机。

解决过程

为了一劳永逸的解决这些问题,我确定了以下方案。

  1. 购买域名,并使用dnspod解析。dnspod上获取API_Token。
  2. 路由器添加脚本,自动获取公网IP,并更新到dnspod上。
  3. 路由器添加端口映射,将路由器管理端口、办公电脑远程端口映射出去。

具体过程可参考:https://hnbc.info/index.php/archives/63/

这样,基本解决了我的需求。
但是,我发现,可能是我路由器太老旧或者配置不高的原因,经常会出现IP更新失败的情况。而,一旦脚本执行不成功,IP未能及时更新,将导致我无法连接宿舍网络。太不保险了,我觉得添加备选方案。于是我又在路由器上安装了frp服务,连接到我限制的一台阿里云服务器上。因为阿里云服务器是小水管,带宽只有3M,平时都是用dnspod解析的域名访问,一旦脚本执行失败,IP未解析到,就使用阿里云服务器地址,通过frp内网穿透的端口访问路由器进行手动更新域名解析。

这么一来,双重保险,基本算是万无一失了。但是这样也有了一些弊端:

  1. 虽然大部分情况没问题,但是一旦脚本执行错误,Ip未能及时更新,手动操作太过繁琐。
  2. 我家里后来又添了黑群晖、等其他设备,想要远程访问或者群晖上安装了新的应用,都得在路由器上配置端口转发,虽然不复杂。但是考虑到以后家里每次添加设备,有应用想要外网访问,都得进行一次端口映射。群晖的管理界面端口、ssh端口、路由器的管理界面端口、路由器ssh端口、办公电脑远程端口、电脑的远程开机端口、群晖上pt服务、图片服务、视频服务等等一堆端口要转发,时间一长,又没有可视化友好的管理界面,简直爆炸。
  3. 很多端口都转发到公网了,安全性得不到保障。

最终方案

一次偶然的机会,我看到了NPS项目,研究了下后,发现非常适合我的要求。于是折腾了起来。
因为,我已经有了一台低配的阿里云服务器,在这台有公网IP的服务器上配置了NPS的服务端。考虑到我的黑群晖是用的蜗牛星际,稳定性一般,且大部分时间只用来做pt下载了,并不是一直开机的,所以想将nps客户端安装在路由器上。
一番折腾后,发现k2p路由器可用的存储空间只有12M,虽然各自折腾后,安装nps客户端并运行起来了,但是两天后就停止了。这时候我发现角落里的玩客云了,这玩意已经吃灰好多年了,但是如今看来颜值也可以,而且跑起来完全静音,又不费电、8G的ROM,拿来做nps客户端使用绰绰有余。

玩客云刷Armbian步骤

准备

  • 金属镊子,短接用,其他工具也可。
  • 双头USB线。
  • 电脑

刷机步骤

  1. 安装并打开 USB Burning Tool,导入 Armbian_5.67_Aml-s805_Debian_stretch_default EMMC直刷.img 镜像,勾选 擦除flash擦除bootloader 并点击 “开始”。
  2. 一边短接如果所示焊点,一边接通电源。玩客云有两个版本,短接方式不一样,该步骤适用于V1.3的玩客云设备,可查看自己玩客云主板上的标识。

图片

  1. 回到电脑,能看到 烧录软件出现了进度,耐心等待烧入完成,然后点击“停止”并关闭软件。
  2. 完成,拔掉USB线,重新接通电源和网线。路由器查看设备,找到OneCloud,确定IP地址。
  3. 默认账户为root,密码为1234。第一次进入需要修改密码。

安装nps客户端

玩客云的架构为:ARM V7,我们需要前往https://github.com/ehang-io/nps/releases下载对应的客户端(linux_arm_v7_client.tar.gz)。
具体安装步骤,参考链接中的3. 安装客户端*小节

背景

  1. 家里宽带有公网IP,可以在外访问家里电脑、群晖等服务。
  2. 但是家里公网IP不是固定的,每次重启路由器会自动更换。
  3. 家里服务太多、且IP不好记,需要通过域名访问。

解决方案

注册购买一个域名、或使用免费域名。将家里的公网IP解析到该域名下。通过域名进行访问家里电脑、群晖图片和视频服务等。每次路由器重启、断网等原因导致Ip更换后,将新IP更新到域名解析中。
为了保证每次宽带IP更换后,及时更新解析到域名。需要在路由器上添加一个脚本去自动更新。我们将脚本设置为每分钟执行一次(根据自己需要设置),如果IP地址有变化,就将新IP解析到域名。为了方便更新,dns服务商支持api更新时必须的,而DNSPod完美支持,还免费,就选择使用它了。关于如何将域名使用dnspod解析请自行百度。

步骤

理论可行,下面进入实施阶段。

DNSPod配置

DNSPod上查看API_ID,并申请API_Token。具体过程很简单,自行百度即可。

编辑并上传脚本

将脚本中的API_IDAPI_Token替换为你自己在dnspod上申请的值,将domain替换为你的域名,host替换为你要解析的二级域名即可。脚本如下:

#!/bin/sh
#CONF START
API_ID=110000
API_Token=0dcfxxxxxxxxx6b6
domain=abc.com
host=k2p
CHECKURL="http://ip.03k.org"
#OUT="pppoe"
#CONF END
. /etc/profile
date
if (echo $CHECKURL |grep -q "://");then
IPREX='([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
URLIP=$(curl -4 -k $(if [ -n "$OUT" ]; then echo "--interface $OUT"; fi) -s $CHECKURL|grep -Eo "$IPREX"|tail -n1)
if (echo $URLIP |grep -qEvo "$IPREX");then
URLIP="Get $DOMAIN URLIP Failed."
fi
echo "[URL IP]:$URLIP"
dnscmd="nslookup";type nslookup >/dev/null 2>&1||dnscmd="ping -c1"
DNSTEST=$($dnscmd $host.$domain)
if [ "$?" != 0 ]&&[ "$dnscmd" == "nslookup" ]||(echo $DNSTEST |grep -qEvo "$IPREX");then
DNSIP="Get $host.$domain DNS Failed."
else DNSIP=$(echo $DNSTEST|grep -Eo "$IPREX"|tail -n1)
fi
echo "[DNS IP]:$DNSIP"
if [ "$DNSIP" == "$URLIP" ];then
echo "IP SAME IN DNS,SKIP UPDATE."
exit
fi
fi
token="login_token=${API_ID},${API_Token}&format=json&lang=en&error_on_empty=yes&domain=${domain}&sub_domain=${host}"
Record="$(curl -4 -k $(if [ -n "$OUT" ]; then echo "--interface $OUT"; fi) -s -X POST https://dnsapi.cn/Record.List -d "${token}")"
iferr="$(echo ${Record#*code}|cut -d'"' -f3)"
if [ "$iferr" == "1" ];then
record_ip=$(echo ${Record#*value}|cut -d'"' -f3)
echo "[API IP]:$record_ip"
if [ "$record_ip" == "$URLIP" ];then
echo "IP SAME IN API,SKIP UPDATE."
exit
fi
record_id=$(echo ${Record#*\"records\"\:\[\{\"id\"}|cut -d'"' -f2)
record_line_id=$(echo ${Record#*line_id}|cut -d'"' -f3)
echo Start DDNS update...
ddns="$(curl -4 -k $(if [ -n "$OUT" ]; then echo "--interface $OUT"; fi) -s -X POST https://dnsapi.cn/Record.Ddns -d "${token}&record_id=${record_id}&record_line_id=${record_line_id}")"
ddns_result="$(echo ${ddns#*message\"}|cut -d'"' -f2)"
echo -n "DDNS upadte result:$ddns_result "
echo $ddns|grep -Eo "$IPREX"|tail -n1
else echo -n Get $host.$domain error :
echo $(echo ${Record#*message\"})|cut -d'"' -f2
fi

编辑完成后,将脚本上传路由器。每个路由器不同,自行查阅如何开启ssh以及其默认密码后自行上传。

配置定时任务

路由器一般都有定时任务功能。在定时任务功能下添加新任务。以K2p为例,在功能设置-高级设置中,设置计划任务(定时任务),因我将执行脚本上传到了root目录下,每分钟进行一次监测,所以定时任务脚本为:

*/1 * * * * /root/dnspod_ddns.sh &> /dev/null

图片

保存后,等待一会,查看dnspod管理后台中,域名解析是否已经自动更新。

配置端口转发

这样域名已经解析到了你的带宽公网IP,想要访问电脑、内网服务等,再进行一次端口转发设置,就可以通过域名愉快的访问自己的电脑或其他服务了。

图片

背景

个人习惯,经常使用shift进行中英切换,有时候切换太快了就成了双击shift了,而Idea中双击shift会弹出全局搜索框,非常影响体验。

过程

网上搜索出来的大部分结果都是,通过registry,找到ide.suppress.double.click.handler,取消勾选的方式。
但是2021.2及之后版本是没有这一项的。

解决

  1. File-Settings 打开设置窗口。
  2. 点击左侧最下面的Advanced Settings选项卡
  3. 下拉找到User Interface栏,勾选最后一项Disable double modifier key shortcuts
  4. 应用保存即可。

背景

疫情期间需要远程办公,远程连接公司电脑便成了必须要求。然而,公司电脑也不可能时刻处于开机状态,有时候会出现关机的情况。这时候,远程开机便显得尤为重要。

设置步骤

BIOS设置

为了使用远程开机功能,您必须在系统 BIOS 中设置一些设置。

  1. 重新启动系统并按F2键,为了防止错过,可多次频繁点击F2,直到进入设置界面。
  2. 在BIOS选项中选择Power Management,进入电影管理。
  3. 展开该选项后,选择Wake on LAN/WLAN选项,根据自己的情况选择合适的方式。如果你使用vpn连接公司网络进行远程桌面,其实就是Lan方式,如果你可以在家通过公网IP直连电脑,可以选择Wan方式。不确定,选择Lan/Wan。
  4. 选择Deep Sleep Control ,禁用该选项。
  5. 应用,退出即完成BIOS设置。

网卡设置

  1. 开机进入系统,按Win+X键,选择设备管理器
  2. 在网络适配器中,找到网卡,右键选择属性。(如果你有多张网卡或者安装了虚拟机,请注意找到你的真实使用的网卡)
  3. 选择电源管理,将下面三个选项全部勾选。
    网卡电源设置
  4. 切换到高级选项卡,将等待链接唤醒模式匹配唤醒魔包链接唤醒设置都设置为启动状态。
  5. 继续在高级选项卡中,找到节能以太网(英文为:Energy-Efficient Ethernet),将其设置为禁用状态。
  6. 点击确定,完成网卡设置。
    网卡高级设置

系统设置

  1. Win+X键,选择电源选项
  2. 若是高版本的win10,进入后还需在右侧点击 其他电源设置
  3. 点击左侧,“选择电源按钮的功能”。
  4. 点击“更改当前不可用的设置”,把“启用快速启动”勾选去掉,点击保存修改。

防火墙设置

如果你的电脑开启了防火墙(默认就是开启状态),需要配置先端口确保唤醒端口被允许可以进入电脑。

  1. 邮件桌面右下角的网络图标,选择打开网络和Internet设置
  2. 下拉找到Windows防火墙。点击进入防火墙设置。
  3. 下拉找到高级设置
  4. 新开的窗口中,在左侧选择入站规则,右侧选择新建规则
  5. 弹出的窗口中,选择端口,下一步。
  6. 选择UDP,选择特定本地端口,端口号填写9
  7. 下一步,选择允许连接,下一步。
  8. 默认选择即可,最后填写规则名称,随意写一个即可

至此,所有在电脑上的设置都已经完成。

远程启动

最后要进行远程启动、唤醒的操作了。如果你权限访问路由器,很多路由器上都带有远程唤醒的工具,可以直接使用。但是如果是公司电脑,基本没有这个权限的。我们下面介绍通过手机App:WolOn来唤醒的操作步骤。

获取电脑Ip地址和Mac地址

在电脑上按Win+R,输入cmd回车,打开命令提示符窗口,输入ipconfig /all回车。找到我们网卡下的ip地址和mac地址。

添加WolOn配置

apk地址: https://apk-dl.com/wolon-wake-on-lan-widgets/com.bitklog.wolon
下载安装好WolOn软件后,打开软件,点击左下角的加号(部分版本需要再次选择局域网图标),添加一个唤醒配置。填写内容,其中:
Device name :表示名称,自己随意填写即可。
MAC Address :上一步获取的Mac地址
Broadcast Address :上一步获取的IP地址。
Select port:选择9。
其他项默认不填写即可,点击Save保存即可。
WolOn App配置

关机测试

WolOnApp上,直接点击刚刚创建的项,即可唤醒电脑。
先测试和电脑同一网络下是否可以正常唤醒。之后测试使用手机移动网络,连接公司vpn后,是否可以正常唤醒。
之后就可以愉快的在家办公,或随时随地开机了。

背景

公司部门内,配置了内网使用的域名。服务器部署完成后,nginx配置时,使用了该域名。请求后发现抛出了502 Bad Gateway

原因

查看nginx日志,发现了如下信息

2022/03/14 09:04:19 [error] 27#27: *41 no resolver defined to resolve ***.***.com, client: 10.10.60.155, server: ***.***.com, request: "POST /demo/captcha/anon/getLoginCaptcha HTTP/1.1", host: "***.***.com", referrer: "http://***.***.com/login/login"

很明显,是因为nginx无法解析该域名导致了。我们只需要让nginx能识别该域名即可。

解决方案

解决方法很简单,只需要在nginx全局配置(nginx.conf)的http项内,添加对应的dns解析即可resolver dns服务器地址;。如下所示:

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    resolver 10.10.10.1; #配置dns地址
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}