Intel AMI 搭配 TeamSpeak 3 实现远程办公

公司发的电脑因为会有各种限制,所以不能通过任何软件层面/RDP来远程,然而内部资源只能通过这台电脑访问,本来想着买一个 PiKVM ,但穷,且 PiKVM 目前不支持声音的转发,于是花了一周时间发现 Intel AMI 可以被利用并成功组合起来,实现用自己的电脑远程办公。
由于不方便截图,以下内容尽量以文字形式来描述

事前警告:此行为本身很可能会违反雇主对雇员的行为限制,基本上有一定能力的 IT 部门只要想就能发现在利用 AMI ,且一旦 wg/AMI 出现安全漏洞则可能会直接威胁到企业内安全,还请自行斟酌是否构筑,并自行承担带来的风险

先说准备部分,需要的东西有以下:
(1). 被远程的电脑支持 Intel AMI (带有vPro功能,且组织本身没有在利用)
(2). 准备额外一台电脑处理音频,并且安装 TeamViewer、Anydesk 等远程软件,不可用RDP
(3). 准备一个 VPN/Tun 来远程进来
(4). Teamspeak 3 Server(自己搭建即可,可以和 VPN 放到一个机器上)
(5). 一些3.5mm音频线
(6). VoiceMeeter Banana
(7). Dummy HDMI(情况不同有些电脑可能不需要)

  1. 配置带外管理,来实现画面的转发和键鼠的操作

    进入 UEFI ,将 AMI 开启,第一次设置的时候默认密码是 admin ,然后需要自行设置一个安全的密码进去,设置完成后以防万一,将允许挂载磁盘和串口功能关掉,并将访问远程时的认证改为不需要密码。
    (这个功能在后面远程的时候也可以被开启,这里关掉单纯只是为了防止手贱不小心挂上东西然后被监控软件监测到)

    设置的时候发现没有配置 IP 的选项,学习了一番后了解到:必须要有 Intel 的有线网卡才可以,由于我的电脑属于轻薄本,只有无线网卡,所以接下来网络配置需要进入系统内配置。

    进入系统后,去安装 Intel Management Engine Components ,可以从各厂家的网站上找到,这个软件之后用来查看带外管理的 IP 地址用。
    然后去 Intel 官网上去下载 Intel Setup and Configuration Software,解压缩后安装 ACUWizard ,这个软件是用来配置带外管理用。

    接下来通过 ACUWizard 来配置网络,这一块由于不方便截图,可以参考这个教程
    https://zhuanlan.zhihu.com/p/105326863
    有几个注意点:
    (1). WiFi 的 Data Encryption 里,不应按照此教程的设置,而是分别设置为 RSN 和 CCMP,否则系统关闭后会连不上
    (2). 证明书不用开启,因为 Intel AMI 不支持自签证书,必须要去购买,这意味着自建环境只能走 http (这点很重要,请各位骚操作的时候要切记流量是明文的)

    配置完成后,就可以去刚才安装过的 Intel Management Engine Components 里查看带外管理的 IP 地址了,这种方式配置好的 IP 会和你系统内的 IP 是一样的,且查看端口会发现 8006 端口有暴露出去,但实际上流量不会进入系统内而是直接进入 Intel AMI 里。

    之后为了防止 IP 出现变动,在路由器内设置了 IP MAC 绑定,然后可以从别的电脑里用浏览器尝试访问一下来检查是否已经可用,地址是 http://<IP>:8006 ,账号密码分别是 admin 和你最开始设置的密码,能登录进去则说明配通了。

    但这个页面并不自带KVM功能,所以需要搭配使用软件来访问。
    Windows 的话 可以使用 Intel 自家的 Intel Manageability Commander
    mac/Linux的话则可以尝试使用开源的 meshcommander

    连接上后,被远程的机器的屏幕上会有一圈红黄相间的警示框,这个框无法隐藏,但截图或者共享桌面的时候不会被发现,这个框是从显卡上直接输出的。

  2. 解决完了远程,开始解决音频的双向传输

    这一块相比 AMI 其实要更复杂一些,但逻辑上来讲就是通过虚拟声卡和 TeamSpeak 来实现声音的转发。
    总之先搭建一个 TeamSpeak 3 服务器,这一块比较简单就不描述了,搭建好了能访问即可。
    然后需要准备一些音频用的线,具体情况需要具体分析,但一般可以简单分为 耳机+麦克风 2合1插孔 和 耳机/麦克风 2个插孔 两种形式。
    由于我的两个笔记本电脑都是2合1的插孔,这种情况下需要准备如下材料:
    一根 4芯(3个塑料圈)的公对公 的连接线
    一根 4芯公头转耳机/麦克风2个母口 的转接线
    一根 4芯母头转耳机/麦克风2个公头 的转接线

    然后在音频转发的电脑里安装如下软件:
    TeamSpeak 3 Client 用作音频的收发
    Voicemeet Banana 虚拟声卡&音频的路由调整 (另外就是我给他们家捐款过,他家的这些软件需求符合的情况下还挺好使的)

    接下来是接线环节,这里先说怎么接,然后再说坑
    (1). 把4芯跳线插到被远程的电脑的音频口,确认音频设置里能同时识别到耳机和麦克风均已插入
    (2). 把 4芯公头转耳机/麦克风母头 的线插入到音频转发的电脑上,一样需要确认下耳机和麦克风均以识别到
    (3). 都识别到后,将4芯跳线插入 4芯母头转耳机/麦克风2个公头 上,然后分出来的2个头反转着插入音频转发上接着的母头上(耳机插麦克风,麦克风插耳机)

    这样接线的部分就完成了,然后关于坑,提前说一下比较好:
    (1). 如果带着线重启,或者关机后再开机的话,进入系统后会发现找不到麦克风,且可能存在不管有没有开机,都会听到送出去的声音被送了回来的情况,推测是 Realtek 音频芯片的问题,不更换双口声卡的话没有解决办法,只能是开机后重新插线,或者是不关机来解决此问题(出远门的话建议买双口的 USB 声卡替换掉单口插槽)
    (2). 开头写道要准备 TeamViewer/Anydesk 等远程软件而不要用 RDP 的原因是, RDP 连接上后会变成只有一个远程声卡的状态,物理声卡会在音频设置里消失不见,Voicemeeter 也抓不到
    (3). 用 TeamViewer/Anydesk 的话,有些电脑合上盖子后显卡输出会停止,这种情况下需要准备一个 Dummy HDMI 让显卡保持工作,没有这个问题的话就不需要

    接下来是音频上的软件设置:
    (1). 收进来的音频进入 VoiceMeeter Banana ,打开mono(混合成单声道),并转发到 B1 (虚拟声卡的麦克风)
    (2). TeamSpeak 3 的麦克风硬件设置为虚拟声卡的麦克风
    (3). TeamSpeak 3 的音频输出设置为虚拟声卡的输出
    (4). VoiceMeeter Banana 里面,将虚拟声卡的输出转发到 A1,这样就会送到被远程电脑的物理声卡-麦克风里
    (5). 把被远程电脑的音频输出音量调整低(我的电脑是设置成了30%左右),不调整的话底噪太大没法听

    这样设置好了后就可以直接使用了,自己的电脑上装一个 TeamSpeak 3 然后进入同一个房间后即可通讯,之前用监听麦克风功能然后数秒,测得一来一回的延迟在 1s 左右,推算单方向延迟大约在 0.5s 左右

    另外,一个小坑:TeamSpeak 3 的 macOS 版可能是年久失修,一连接房间就崩溃,而 iOS 版本可以安装上但无法识别音频设备(耳机和麦克风均无法工作)
    可能是 Apple Silicon 的问题,也可能是 macOS 13 的问题,手头没有其他机器所以不太好判断。


    3. VPN/Tun

    因为流量全都走了 http ,出门用的话着实不安全,所以AMI侧选择不开启 IPv6 ,且 v4 的端口也不暴露出去,这里我选择了 Wireguard 来打一个隧道。

    服务端的配置如下:
    [Intelface]
    Address = 10.0.1.1/24
    PrivateKey = <私钥,自己生成>
    ListenPort = 50000
    PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward
    PostUp = iptables -A FORWARD -i %i -j ACCEPT
    PostUp = iptables -t nat -A POSTROUTING -o <此服务器的物理网卡> -j MASQUERADE
    PostDown = iptables -D FORWARD -i %i -j ACCEPT
    PostDown = iptables -t nat -D POSTROUTING -o <此服务器的物理网卡> -j MASQUERADE

    [peer]
    PublicKey = <隧道另一头的公钥>
    AllowedIPs = <打算分配给另一头的IP,不需要CIDR>

    客户端的配置如下:
    [Interface]
    PrivateKey = <私钥>
    Address = <这一头的IP,需要CIDR>

    [Peer]
    PublicKey = <对方的公钥>
    AllowedIPs = <这一头的网段>, <对端物理网卡所在的网段>
    Endpoint = <对端的IP:端口>

    这样服务端和客户端分别起来后,试着ping一下应该就通了

    接下来就是一些细节上的配置和收尾,例如:
    · 给 TeamSpeak 3 房间设置权限&密码,防止被人随意访问进来
    · TeamSpeak 3的提示音关掉(主要是声音的中转侧),否则房间进出的提示音会传到被远程的电脑里
    · 通话测试(像是 Microsoft Teams 就自带这个功能)
    · 两边的电源都设置成屏幕常亮、合盖不睡眠等,可以尝试一下 PowerToys 的 Awake 功能,但此功能绕不过 GPO 的限制
    · 或者,写个 vbs 脚本来模拟键盘按下,不会写的可以让 ChatGPT 帮你写一个,间隔10秒循环,这样不需要的时候也有足够的时间开 Taskmgr 杀掉 wscript 进程来结束循环

    参考资料:
    https://www.intel.com/content/dam/www/public/us/en/documents/guides/amt-configuration-utility-user-guide.pdf
    https://zhuanlan.zhihu.com/p/105326863
    https://zhuanlan.zhihu.com/p/105525209
    https://zhuanlan.zhihu.com/p/106000423
    https://github.com/Ylianst/MeshCommander
    https://new.negoces.top/posts/2fcbf547/

解决提示Please check that your locale settings的问题

RT,有时候改了区域或者终端配置不合适的时候都可能会遇到这个问题
大致显示这些内容:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE =
etc...

有一个比较简单的办法即可解决:

在~/.bashrc里加一行设置

vim ~/.bashrc

export LC_ALL=C

保存退出后重新进入终端即可

解决debian9下vim内鼠标右键不能粘贴的问题

RT debian9开始,vim右键会变成— (insert) VISUAL —的状态,没法粘贴很不方便。

解决办法:

vim /usr/share/vim/vim80/defaults.vim

查找 set mouse
if has('mouse')
  set mouse=a
endif

将值从"a"改成"r"
if has('mouse')
  set mouse=r
endif

然后保存退出即可,下次启动vim即生效

记一次业务整体迁移

RT 东西比较杂 算是随笔记录一下,参考资料蛮多的
大致的情况是:
操作系统均为debian 8.6 x64
服务器A(物理机),有一个普通的http业务,一个java业务,一个mysql业务,一个FTP业务
服务器B(套在A里面且没有公网ip的虚拟机)一个dz论坛,一个mysql业务
服务器C(目标机器,新系统,而且还有个还没挂载的硬盘)
A和C不在一个地点,需要公网传输,且A和B上面的业务都要整合在C上面,另:A上面的mysql可舍弃(不要问我为啥不要数据了,设定就是如此)
 
第一步:先部署一下新机器的环境
大致需要的有:tengine php5-fpm mysql-server openjdk vsftpd db5.3-util
以及有个没格式化也没挂载的硬盘

mkfs.xfs /dev/sdb -f (反正我是用xfs,以及这个不需要分区,直接把盘挂上去好了)
mount /dev/sdb /var/hdd

重启后保持挂载:
blkid 查看下这块硬盘的uuid

vim /etc/fstab

最下面直接按照这个格式写一下

UUID=12345678-1234-1234-1234-123456789012       /var/hdd      xfs     defaults        0       0

保存退出即可
其他的没啥事情 按照需求创建一些文件夹 以及mysql记得先设置个密码
 
第二步:先把最简单的搞起来(java/http/ftp)
这个应该最简单了
java装好openjdk即可
没有dz论坛,纯http也只是需要配置下tengine的配置即可,可参考以前的博文:http://blog.bilicloud.com/?p=133
ftp依旧:http://blog.bilicloud.com/?p=25
搞起来后文件通过tar打包,scp发送过去,再到指定的文件夹解包即可
文件太大/太杂/需要保持文件夹结构的话可以参考下偷懒的方法:http://blog.bilicloud.com/?p=172
 
第三步:迁移数据库
开头说明了一下,服务器A的数据库里的数据可以舍弃,所以这样就简单得多了~我们只需要把服务器B的数据库迁移即可
先确认一下版本,发现服务器B的版本要比C的版本老一点,用apt-get升级一下,升级后确认两边版本一致,然后stop掉mysql的服务
之后查看了一下数据库所在位置,cat /etc/mysql/my.cnf 找到路径 进去,tar打包一下,然后scp直接发到服务器C,解包,放到指定位置,然后检查一下文件夹和里面的文件的权限,如果不是mysql的话需要chown mysql:mysql -R 来设置一下权限
完事后mysql -uroot -p 登陆一下 然后show DATABASES; 查看下数据库是否存在,也可以use一下后show一下 看看能否正常读取之类的。总之我的迁移是顺利的完成了。
 
第四步:迁移dz论坛
这一步我们大致跟着官方文档走,官方文档地址见参考资料里的链接~
先将论坛全部tar打包,然后依旧scp发过去,解包,放到指定位置,确认权限
然后写一下tengine的配置文件,具体可参考http://blog.bilicloud.com/?p=133
之后修改以下文件,改一下数据库的账号密码(这里我创建了一个新的用户名和对应的密码 数据库上要做一下授权,然后再从这边改一下密码)

./config/config_global.php
./config/config_ucenter.php
./uc_server/data/config.inc.php

改完后 重启tengine 然后。。。嗯?502?
看了一下log 发现是fastcgi 连接被拒绝,然后ss -nat发现。。。根本就没有fastcgi的端口,检查了一下php-fpm.conf发现 原来我忘记写listen了。。。果断补一下

vim /etc/php5/fpm/php-fpm.conf

直接跳到结尾,粘贴上:

listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
listen.backlog = -1

:wq保存退出 然后重启一下php5-fpm服务,然后浏览器刷新下页面。。。起来了~
之后做了一下登陆 发帖 删帖测试 都一切正常,迁移任务完美结束=w=
 
参考资料:
DZ资料库-论坛迁移:http://faq.comsenz.com/library/bbsapp/movesite/movesite_index.htm

MySQL 重设密码

某MC服把服务器上mysql的root密码居然给忘了。。。
于是。。。搜了一番,找到了这样的一个教程:
https://segmentfault.com/a/1190000000412194
一、适合ubuntu/debian的方式
这个方法只能用于ubuntu/debian 系统上,不过好处在于不需要停掉mysql的服务

cat /etc/mysql/debian.cnf

显示的内容是:

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = PASSWORD
socket = /var/run/mysqld/mysqld.sock
basedir = /usr

我们记下来其中的user和password
然后直接

mysql -udebian-sys-maint -p

回车后输入password里面的密码,成功进入~
然后直接:

use mysql;
update user set password=PASSWORD("newpassword") where User='root';
flush privileges;

全部执行完后就OK了~
二、比较通用的办法
这个办法需要停mysql,不过像是centos之类的可以用这个方法

service mysql stop

以安全模式启动mysql

mysqld_safe --skip-grant-tables --skip-networking &

然后直接登陆,不需要添加-p

mysql -uroot

成功登陆,然后改密码~

Linux的快捷方式和文件的镜像状态的创建

这一块我之前真没接触过,毕竟都是实际操作随用随学的。。。
接触这个是因为有一个很大的文件,打算从本机拉到/var/www下面,方便另外一台服务器通过wget直接下载,复制还是需要一定时间的,直接超链接还是挺方便的
使用方法也很简单:
在需要创建的目录上输入

ln -s <文件绝对路径>

回车即可
不需要的时候直接在当前文件夹rm掉,即可rm掉这个快捷方式
不加-s的话是镜像的模式,会复制一份过来,然后其中一份变动的时候另外一份会跟着变动,至于删除了其中一份,另一份会怎样。。。我还真没试过。。。~

多MAC下通过统一私钥来达到1个key即可让所有电脑无密码SSH登陆

因为有两个MAC,然后之前一直是傻傻的各自生成一个KEY然后导入到服务器上的,直到。。。需要导入自己的公钥到工作用的堡垒机上的时候,被我们的老大吐槽了。。。
这次完全是靠MB点拨然后自行摸索到的技巧=W=并没有参照其他地方,算是原创吧~
按照MB的指点,生成的key跟你的电脑本身没有任何关系,只是“生成”了后在每次访问的时候自动会读取一下那个指定的文件而已。所以只需要保证你的每个MAC(LINUX亦是如此)的个人账户下的.ssh文件夹内的id_rsa文件(也就是私钥)一致即可,而公钥中的“计算机名”则也无所谓一直不一致,那个只是类似于标识生成的计算机名和用户名而已。
同步完成后,由于是从另一个计算机上过来的,所以这时候这个文件还不属于你自己,这个时候只需要chmod一下即可:

chmod 0600 id_rsa

然后就可以用啦~
感谢老大MB的指点=w=
另附:mac下无密码直接通过SSH登陆服务器

mac下无密码直接通过SSH登陆服务器

仍然是从网上搜的教程,参考链接:http://www.cnblogs.com/dudu/archive/2012/12/11/linux-ssh-without-password.html
先说一下,mac下无需root权限
理论上大概就是:生成本机的KEY-上传到服务器上-导入一下-完成
1、创建本机的key

cd ~/.ssh/ #进入到你的.ssh目录下
ssh-keygen -t rsa -b 4096 #创建一个 4096bit 的 key

回车后分别会让你输入:
1、输出文件名(不输入任何东西的话默认就是id_rsa)
2、输入一个加密密码(可以不输入)
3、再输入一次密码(不需要密码的继续直接不输入来回车)
然后就会提示公钥和私钥的路径。生成完毕
2、上传到服务器上

scp id_rsa.pub 账号@服务器:~/.ssh/id_rsa.pub #上传公钥文件到这个服务器的~/.ssh/id_rsa.pub这个路径

回车后会提示让你输入服务器密码,输入后回车,文件很小所以上传起来很快
3、导入公钥到服务器上

ssh 账号@服务器 #登陆到你的服务器上

这一次会提示让你输入账号的密码。输入后进入服务器

cd ~/.ssh/ #进入到.ssh文件夹内
cat id_rsa.pub >> authorized_keys #把上传的公钥里面的内容导入到系统内

然后就搞定了,可以退出登录测试一下
依旧是ssh 账号@服务器
如果一切正常的话回车后即可直接进入服务器而无需密码
另附:多MAC下通过统一私钥来达到1个key即可让所有电脑无密码SSH登陆

Debian下ll命令的设置方法

之前一直用centos所以比起ls更习惯用ll,比ls能看到更多有用的信息,然而自己对linux并不是很了解,一直以为ll和htop类似属于三方程序,然后在debian上输入ll一直提示command not found,直到刚才谷歌了一下才明白原来ll就是ls -l。。。并且找到了设置方法(查到的地方是:http://bbs.chinaunix.net/thread-2108040-1-1.html),以下正文
1、需要的程序

alias

这个应该是不自带的样子(吧。。。因为我之前apt-get过这个程序所以并不知道是不是自带的)

apt-get install alien

2、设置ll命令

alias ll='ls -l' #还是挺好理解的,就是告诉程序ll等于ls -l 注意引号是单引号不是双引号

然后就可以直接用ll了=w=