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/

利用nginx的stream模块做转发

背景
minecraft服务器的海外中转节点需要把流量转发回服务器,之前用过socat来解决这个需求,但是感觉不是很文明,查了一下资料发现stream模块是可以直接实现的。

环境
由于直接通过包管理器安装的nginx不自带stream模块,所以需要编译安装

git clone https://github.com/nginx/nginx #nginx 
cd nginx ./auto/configure --prefix=/usr/local/nginx --with-stream
make
make install

配置文件

stream{
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    upstream minecraft {
        server 10.10.0.1:25565;
        server 10.10.0.2:25565 backup;
}
server {
    listen 25565;
    proxy_pass minecraft;
    }
}

利用PowerDNS架设自己的解析服务器

之前白嫖的DNS服务器因为种种原因不能再继续利用了(虽然解析还在)
考虑到要用GeoIP+低于5分钟的缓存,又不想花钱买服务,那么就只有自建了

另外:PowerDNS不支持CNAMEX,对此有需求的人需要考虑别的解决方案(之前白嫖的DNS服务是支持的,CNAMEX可以在DNS层通过调整比例的方式,变相的来实现负载均衡,这在给一个地区部署多台CDN,或者利用多个CDN商家的服务时相当方便,可以从带宽、性能、流量价格的角度来直接调整比例)

GUI选择了PowerDNS-Admin,主要是因为好看,没别的理由

使用的环境和所需的各种:
Debian 10
MariaDB
GeoIP
PowerDNS
pdns-backend-mysql
pdns-backend-geoip
PowerDNS-Admin GUI
Nginx
Git

参考资料:官方文档 官方文档-Backend支持列表 久しぶりにPowerDNSをさわる PowerDNS-Admin GitHub PowerDNS-Admin – Roll Your Own Network

1、安装pdns+配置数据库

apt-get install mariadb-server pdns-server pdns-backend-geoip pdns-backend-mysql

已经安装过mariadb的话从里面删掉mariadb即可
然后做一下数据库的安全设置、建表和创建一个用户给pdns用

mysql_secure_installation

Change the root password? [Y/n] y
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

mysql -u root -p

create database pdns character set utf8 collate utf8_bin;
grant all privileges on pdns.* to pdns@localhost identified by 'YOURPASSWORD';
FLUSH PRIVILEGES;
quit;

安全设置上,大致就是修改root账户密码,删除匿名用户,禁用root远程登录,删除测试库,重新加载表等,详细的解释会在每条确认的上面有输出。

测试一下登陆,顺便把表建立一下。
PS:务必去从官方文档复制,版本更新后有可能所需要的表也会更新

mysql -u pdns -p

use pdns;

CREATE TABLE domains (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255) NOT NULL,
  master                VARCHAR(128) DEFAULT NULL,
  last_check            INT DEFAULT NULL,
  type                  VARCHAR(6) NOT NULL,
  notified_serial       INT DEFAULT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
  id                    BIGINT AUTO_INCREMENT,
  domain_id             INT DEFAULT NULL,
  name                  VARCHAR(255) DEFAULT NULL,
  type                  VARCHAR(10) DEFAULT NULL,
  content               VARCHAR(64000) DEFAULT NULL,
  ttl                   INT DEFAULT NULL,
  prio                  INT DEFAULT NULL,
  change_date           INT DEFAULT NULL,
  disabled              TINYINT(1) DEFAULT 0,
  ordername             VARCHAR(255) BINARY DEFAULT NULL,
  auth                  TINYINT(1) DEFAULT 1,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

CREATE INDEX nametype_index ON records(name,type);

CREATE INDEX domain_id ON records(domain_id);

CREATE INDEX ordername ON records (ordername);

CREATE TABLE supermasters (
  ip                    VARCHAR(64) NOT NULL,
  nameserver            VARCHAR(255) NOT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
  PRIMARY KEY (ip, nameserver)
) Engine=InnoDB CHARACTER SET 'latin1';

CREATE TABLE comments (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  name                  VARCHAR(255) NOT NULL,
  type                  VARCHAR(10) NOT NULL,
  modified_at           INT NOT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
  comment               TEXT CHARACTER SET 'utf8' NOT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

CREATE INDEX comments_name_type_idx ON comments (name, type);

CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);

CREATE TABLE domainmetadata (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  kind                  VARCHAR(32),
  content               TEXT,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);

CREATE TABLE cryptokeys (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  flags                 INT NOT NULL,
  active                BOOL,
  content               TEXT,
  PRIMARY KEY(id)
) Engine=InnoDB CHARACTER SET 'latin1';

CREATE INDEX domainidindex ON cryptokeys(domain_id);

CREATE TABLE tsigkeys (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255),
  algorithm             VARCHAR(50),
  secret                VARCHAR(255),
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

quit;

然后改配置文件,把数据库相关的内容写进去

vim /etc/powerdns/pdns.conf

launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=pdns
gmysql-dbname=pdns
gmysql-password=YOURPASSWORD
gmysql-dnssec=yes

保存退出后,执行一次pdns来初始化一下,在这之前需要先把pdns关闭(装好后会默认以服务的形式启动了)

systemctl stop pdns.service

pdns_server

只要没有报错的话Ctrl+C退出即可,然后再启动服务即可

2、安装并配置PowerDNS-Admin

PowerDNS-Admin目前为止只支持Python 2,根据公开的资料来看有支持Python 3的计划。
以及PowerDNS-Admin使用API和PDNS通讯,所以两边都需要配置一番。
另外,他还需要单独用数据库,所以也需要给他配置一个账号和表。

先把PowerDNS-Admin拉下来

git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /opt/web/powerdns-admin

准备一个api来给pdns-admin用

vim /etc/powerdns/pdns.conf

api=yes
api=key=YOURAPIKEY
webserver=yes

systemctl restart pdns.service

curl -v -H 'X-API-Key: YOURAPIKEY' http://127.0.0.1:8081/api/v1/servers/localhost | jq .

准备一个数据库的用户
在参考其他教程的时候发现有一部分有提及需要自己建表,然而参照和测试后确认目前的版本只需要写好数据库账号密码到配置文件里,之后执行一下即可自动初始化,所以这里只需要配置用户和库。

mysql -u root -p

CREATE DATABASE pdnsadmin character set utf8 collate utf8_bin;
GRANT ALL PRIVILEGES ON pdnsadmin.* TO 'pdnsadmin'@'localhost' IDENTIFIED BY 'YOURPASSWORD';
FLUSH PRIVILEGES;
quit;

然后准备一下依赖
从debian9开始,libmysqlclient-dev变成了default-libmysqlclient-dev,这里也跟着改变

apt-get install python3-dev default-libmysqlclient-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential

curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install nodejs

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
apt-get update
apt-get install yarn

需要设置一下config,复制一下模版然后修改内容

cd /opt/web/powerdns-admin

cp config_template.py config.py

vim config.py

# BASIC APP CONFIG
SECRET_KEY = 'YOURSECRETKEY'

# DATABASE CONFIG
SQLA_DB_USER = 'pdnsadmin'
SQLA_DB_PASSWORD = 'YOURPASSWD'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_PORT = 3306
SQLA_DB_NAME = 'pdnsadmin'

# POWERDNS CONFIG
PDNS_STATS_URL = 'http://127.0.0.1:8081/'
PDNS_API_KEY = 'YOURAPIKEY'
PDNS_VERSION = 'YOURPDNSVER'

保存退出,然后继续

virtualenv -p python3 flask
source ./flask/bin/activate

这时候最左侧会多出来一个“(flask)”,继续操作

pip install -r requirements.txt
pip install python-dotenv

flask db upgrade
yarn install --pure-lockfile
flask assets build

./run.py

如果一切正常的话那么run之后就会自动启动pdns-admin,可以通过http://127.0.0.1:8081/来访问。
进入后需要手动创建一个账户,第一个账户默认为管理员,之后跟随者GUI的指示进行操作即可。

3、配置systemctl和nginx

官方文档在这啦,懒的人复制粘贴就可以了……(路径要和你实际放着的位置统一)
如果你懒得点开的话就复制下面的吧(我帮你复制到这里了)

vim /etc/systemd/system/powerdns-admin.service


[Unit]
Description=PowerDNS-Admin
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/opt/web/powerdns-admin
ExecStart=/opt/web/powerdns-admin/flask/bin/gunicorn --workers 2 --bind unix:/opt/web/powerdns-admin/powerdns-admin.sock app:app

[Install]
WantedBy=multi-user.target


systemctl daemon-reload
systemctl enable powerdns-admin
systemctl start powerdns-admin

nginx的官方文档部分(只复制了使用SSL证书的参考)
这里使用了sock,路径如果有变动的话要改的地方比较多,要注意

server {
        listen                  80 default_server;
        server_name             "";
        return 301 https://$http_host$request_uri;
}

server {
        listen                  443 ssl http2 default_server;
        server_name             _;
        index                   index.html index.htm;
        error_log               /var/log/nginx/error_powerdnsadmin.log error;
        access_log              off;

        ssl_certificate                 path_to_your_fullchain_or_cert;
        ssl_certificate_key             path_to_your_key;
        ssl_dhparam                     path_to_your_dhparam.pem;
        ssl_prefer_server_ciphers       on;
        ssl_ciphers                     'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
        ssl_session_cache               shared:SSL:10m;

        client_max_body_size            10m;
        client_body_buffer_size         128k;
        proxy_redirect                  off;
        proxy_connect_timeout           90;
        proxy_send_timeout              90;
        proxy_read_timeout              90;
        proxy_buffers                   32 4k;
        proxy_buffer_size               8k;
        proxy_set_header                Host $http_host;
        proxy_set_header                X-Scheme $scheme;
        proxy_set_header                X-Real-IP $remote_addr;
        proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_headers_hash_bucket_size  64;

        location ~ ^/static/  {
                include         mime.types;
                root            /opt/web/powerdns-admin/app;
                location        ~* \.(jpg|jpeg|png|gif)$ { expires 365d; }
                location        ~* ^.+.(css|js)$ { expires 7d; }
        }

        location ~ ^/upload/  {
                include         mime.types;
                root            /opt/web/powerdns-admin;
                location        ~* \.(jpg|jpeg|png|gif)$ { expires 365d; }
                location        ~* ^.+.(css|js)$ { expires 7d; }
        }

        location / {
                proxy_pass              http://unix:/opt/web/powerdns-admin/powerdns-admin.sock;
                proxy_read_timeout      120;
                proxy_connect_timeout   120;
                proxy_redirect          http:// $scheme://;
        }
}

4、安装并配置GeoIP(未写完,先挖个坑)

访问GeoIP2并下载免费版数据库

wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz

tar -xzvf GeoLite2-Country.tar.gz

mkdir -p /usr/share/GeoIP

mv GeoLite2-Country.mmdb /usr/share/GeoIP/

然后写一下配置文件

vim /etc/powerdns/pdns.d/geoip.conf

launch=geoip
geoip-database-files=/usr/share/GeoIP/GeoLite2-Country.mmdb
geoip-database-cache=memory
geoip-zones-file=/share/zone.yaml

Syncthing部署相关

1、下载和部署

这里推荐去官网下载而不是走apt-get,官网获取的版本可以开启自动更新,其他功能都一样

wget https://github.com/syncthing/syncthing/releases/download/v1.1.3/syncthing-linux-amd64-v1.1.3.tar.gz

tar -xzvf syncthing-linux-amd64-v1.1.3.tar.gz

mv syncthing-linux-amd64-v1.1.3/ /usr/local/bin

ln -s /usr/local/bin/syncthing/syncthing /usr/bin/syncthing

syncthing
#执行一下来创建配置文件

执行后可以直接关闭,然后对配置文件动手

vim ~/.config/syncthing/config.xml

#由于我是公网服务器上运行,所以寻找下面这一段

<address>127.0.0.1:8384</address>

#修改为

<address>0.0.0.0:8384</address>

#本机直接访问的不需要修改

启动后可以修改登陆密码等,页面支持中文所以GUI操作不再做说明

2、开机自动启动

syncthing的程序里提供了一个现成的模版,直接复制后启动即可使用

cp /usr/local/bin/syncthing/etc/linux-systemd/system/[email protected] /etc/systemd/system/

systemctl enable [email protected]

systemctl start [email protected]

#这里的myuser请设置为本机存在的账户,可以是root但官方不推荐

3、用nginx进行反代来访问

可以利用nginx反代来加证书、ip白名单等,下面的nginx配置供参考

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name syncthing.domain.com;

    ssl_certificate /var/www/cert/domain.com.crt;
    ssl_certificate_key /var/www/cert/domain.com.key;

    location / {
        proxy_pass http://127.0.0.1:8384;
    }
}

另外,设置好反代后,之前第2步中设置的监听全部端口的地方记得改回127.0.0.1然后重启服务。

利用tb-tun让OpenVZ使用he tunnel broker的IPv6

参考文章:
IPv6 tunnel on OpenVZ
OpenVZ 通过tb-tun 使用HE IPv6 tunnel

先决条件:
1、安装git和gcc
2、申请一个he-ipv6隧道
3、需要支持tun,可以用以下方式来确认

cat /dev/net/tun
cat: /dev/net/tun: File descriptor in bad state

如果显示No such device or address 或者是 Permission denied的话则为不支持,需要联系提供商开启,或者以下脚本“可能”有帮助

if ! [ -c /dev/net/tun ]; then
mkdir -p /dev/net
mknod -m 666 /dev/net/tun c 10 200
fi

保存为.sh后尝试执行一下再cat tun,如果正常则可以继续。

第一步:将tb-tun从git上拉下来然后编译

git clone https://github.com/acgrid/tb-tun
gcc tb_userspace.c -l pthread -o tb_userspace

第二步:配置&测试一下

setsid /root/tb-tun/tb_userspace he-ipv6 [Server IPv4 Address] [Client IPv4 Address] sit > /dev/null
ip link set he-ipv6 up
ip address add [Client IPv6 Address from HE-TunnelBroker like a:b:c:d::2/64] dev he-ipv6
ip link set dev he-ipv6 mtu 1480
ip -6 route add ::/0 dev he-ipv6
ip -6 route del default dev venet0
ip -f inet6 addr
ping6 ipv6.google.com
curl -6 ifconfig.co

只要ip配置上去并且通了就可以了。
这里有一个要注意的是:有些机器如果没有用vnet0:0方式把你的公网ip配置到你本地,而是只使用了venet0(也就是类似127.0.0.2的ip)的话,请把你的客户端ip修改为venet0的IP(也就是不写公网ip而是直接写类似127.0.0.2的ip)

第三步:上面的测试成功后配置一个自动启动

vim /etc/network/if-pre-up.d/ipv6tb

#参考文章当时使用的还是ifconfig方式,可以在系统启动的时候就被正常执行,而iproute2方式则需要放在这里,否则无法正常启动
#! /bin/sh
###BEGIN INIT INFO
# Provides:          ipv6
# Required-Start:    $local_fs $all
# Required-Stop:     $local_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the ipv6 tunnel
# Description:       ipv6 tunnel start-stop-daemon
### END INIT INFO
# /etc/init.d/ipv6tb
 touch /var/lock/ipv6tb
 case "$1" in
     start)
         echo "Starting ipv6tb with tb_userspace"
             setsid /root/tb-tun/tb_userspace he-ipv6 [Server IPv4 Address] [Client IPv4 Address] sit > /dev/null & sleep 3s #ugly, but doesn't seem to work at startup otherwise
             ip link set he-ipv6 up
             ip address add [Client IPv6 Address from HE-TunnelBroker like a:b:c:d::2/64] dev he-ipv6 #Add as many of these as you need from your routed /64 allocation
             ip link set dev he-ipv6 mtu 1480
             ip -6 route add ::/0 dev he-ipv6
             ip -6 route del default dev venet0
         ;;
     stop)
         echo "Stopping ipv6tb with tb_userspace"
             ip link set he-ipv6 down
             ip -6 route add ::/0 dev he-ipv6
             killall tb_userspace
         ;;
     *)
     echo "Usage: /etc/init.d/ipv6tb {start|stop}"
     exit 1
     ;;
 esac
 exit 0
chmod 755 /etc/network/if-pre-up.d/ipv6tb

/etc/network/if-pre-up.d/ipv6tb start

之后基本上就可以用了,可选配置一下ipv6的dns~

zabbix+nginx+php7.0+debian9的部署方法

RT 官方建议apache2,然而并不想用apache2
数据库保持使用MySql,量小暂时没有PostgreSQL的需求
依旧是root账号,所以不带sudo

1、安装基础
这里比较偷懒就直接apt装nginx了,有版本需求自行编译,apt装好的nginx config在/etc/nginx下面,请注意

apt-get update
apt-get install nginx php7.0-fpm php7.0-mysql mysql-server

装完先放着

2、安装zabbix-server和anget(可选)

wget http://repo.zabbix.com/zabbix/3.4/debian/pool/main/z/zabbix-release/zabbix-release_3.4-1%2Bstretch_all.deb
dpkg -i zabbix-release_3.4-1+stretch_all.deb
apt-get update
apt-get install zabbix-server-mysql zabbix-frontend-php zabbix-agent

安装完后可能会把apache2也给你装上了,删了删了

systemctl stop apache2.service
apt-get remove apache2
apt autoremove

然后继续放着

3、配置数据库

mysql -uroot -p
create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by '***YOURPASSWORD***';
quit;
cd /usr/share/doc/zabbix-server-mysql
zcat create.sql.gz | mysql -uzabbix -p zabbix

配置zabbix-server用的数据库,然后导入初始架构数据
mysql的root的密码默认跟随系统的root密码,而不再是安装的时候另外设置了

4、配置nginx和php-fpm

vim /etc/nginx/sites-enabled/zabbix.conf

server {
       listen 80;
        server_name  localhost;
        root   /usr/share/zabbix;


        location / {
                index  index.html index.htm index.php;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /usr/share/nginx/html;
        }
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                include        fastcgi_params;
        }
}

php-fpm在apt安装的情况下默认就用的sock,所以不用改动,如果是其他安装方法的话请自行检查和修改

vim /etc/php/7.0/fpm/php.ini

max_execution_time = 300
max_input_time = 600
post_max_size = 32M
date.timezone = Asia/Tokyo

以上4条请用搜索功能寻找并修改

5、配置zabbix-server和agent

vim /etc/zabbix/zabbix_server.conf

DBHost=
DBName=
DBPassword=

以上3条请自行搜索并修改

vim /etc/zabbix/zabbix_agentd.conf

Server=
Hostname=

以上2条请自行搜索并修改

6、开机自动启动和启动服务并访问

systemctl enable nginx
systemctl enable php7.0-fpm
systemctl enable mysql
systemctl enable zabbix-server
systemctl enable zabbix-agent
systemctl restart nginx
systemctl restart php7.0-fpm
systemctl restart mysql
systemctl restart zabbix-server
systemctl restart zabbix-agent

写的比较糙,有些可能是需要restart

然后打开浏览器,http://yourdomain/setup.php 进入zabbix的配置页面,剩下的跟着流程走一遍即可~

PS:初始账号密码是 Admin和zabbix(账号注意大小写)

参考资料:
从部署包安装 Zabbix Documentation 3.4
ubuntu16.04 + ZABBIX + nginx & php-fpm

使用bird配置bgp网络互连

RT 借了一个asn和一个c段后,在vultr上学着配置了bgp互连和广播相关

其中涉及一些非技术向的内容,需要有一些耐心,系统依旧是debian 9 + root账号

1、申请广播
给vultr客服发工单,告知你要用bgp功能,他们会给你开通这个功能在你的面板上

拿到入口的url后,选择“我拥有私有asn”和“我拥有私有ip段”并输入你的as号和你的ip段落,并设置一个互连密码,然后写一封LOA(letter of authorization),模版如下:

AUTHORIZATION LETTER

今天的日期

To whom it may concern,

This letter serves as authorization for Vultr with 你的AS号 to announce the following IP address blocks:

你的ip段 / 你的as号

As a representative of the company Aiyun Technology Co.,Ltd that is the owner of the subnet and/or ASN, I hereby declare that I'm authorized to represent and sign for this LOA.

Should you have questions about this request, email me at 你的邮箱, or call: 你的电话

From,

你的名字
你的公司名
你的职位
你的电话

*(这个模版是vultr给我的,其他几家的话请自行向服务商索要,或者问清楚公司名后将vultr修改为你的提供商给你的名字)
用txt保存后,上传到附件上然后提交等待审核即可。

审核通过后,会在页面上显示两个确认身份的url,点击后会让你选择在whois上查询到的这个ip和这个asn的邮箱,选择后送信,然后等待邮件到达后,点击确认的链接确认即可。

确认完成后这一步就完成了。

2、配置广播

一般需要等待24-48小时,或者你发一个工单让他们提醒你,等他们通知你可用后,就可以开始配置了。

首先进入服务器的详情页面,最后面会多出来一个bgp选项卡,里面提供了vu的互连ip等信息,下面有一个配置模版可以打开(因为里面就是写好的配置文件,其实你直接复制都是可以的)

登陆服务器,安装bird

apt-get install bird

安装完成后先关闭掉服务

systemctl stop bird.service
systemctl stop bird6.service

然后修改配置文件

vim /etc/bird/bird.conf
router id <Instance里的ip>;

protocol bgp vultr
{
	local as <你的as号>;
	source address <Instance里的ip>;
	import none;
	export all;
	graceful restart on;
	multihop 2;
	neighbor <Vultr里的ip> as <Vultr里的as号>;
	password "<Vultr里的密码>";
}

protocol static
{
	route <你计划用的ip段>/24 via <Instance里的ip>;
}

protocol device
{
	scan time 5;
}

多台服务器的时候一定要提前规划好自己的ip划分并做好文档记录,要不然等以后再改会比较麻烦,用多少ip只需要修改static部分即可。

保存退出,然后启动bird

systemctl start bird.service

之后可以检查一下是否正常工作

birdc show proto all vultr

BIRD 1.4.5 ready.
name     proto    table    state  since       info
vultr    BGP      master   up     14:11:36    Established
  Preference:     100
  Input filter:   REJECT
  Output filter:  (unnamed)
  Routes:         0 imported, 581634 filtered, 1 exported, 0 preferred
  Route change stats:     received   rejected   filtered    ignored   accepted
    Import updates:         581674          0     581674          0          0
    Import withdraws:            2          0        ---     581675          0
    Export updates:              1          0          0        ---          1
    Export withdraws:            0        ---        ---        ---          0
  BGP state:          Established
    Neighbor address: 169.254.169.254
    Neighbor AS:      64515
    Neighbor ID:      169.254.169.254
    Neighbor caps:    refresh restart-able AS4
    Session:          external multihop AS4
    Source address:   203.0.113.123
    Hold timer:       208/240
    Keepalive timer:  57/80

(输出信息参考了vultr的官方docs:Configuring BGP on Vultr)
重点查看info应该是Established状态

之后进行系统里ip的配置

ip addr add <你的ip>/24 dev <你的网卡名字>

然后可以查看一下是否生效:

ip addr

如果里面有你刚才添加过的地址即为生效

然后就可以从公网ping一下看一看,正常情况下就已经通了

为了方便我们也可以直接写一个永久的到interfaces里面

vim /etc/network/interfaces
auto <网卡名>:1
iface <网卡名>:1 inet static
        address <你的ip>
        netmask <子网掩码>

完成后保存退出即可,可以直接用ifup立刻启动起来

以上就是配置的全部教程~

解决提示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下部署OpenLDAP+slapd+phpLDAPadmin(nginx+php7环境)

RT 需要研究一下这个东西所以就装一下

1、改计算机名
debian下安装的时候默认会取机器名作为domain name,所以为了方便我们先改一下机器名称为所需的
在hosts里也可以添加一下机器名称,以及对应的外部ip地址到机器名称上

vim /etc/hostname

vim /etc/hosts

2、安装组件

apt-get install slapd ldap-utils

安装完成后去改一下配置文件,添加base和uri两个数值到文件的底部即可

vim /etc/ldap/ldap.conf

BASE     dc=domain,dc=com
URI     ldap://1.1.1.1:389

保存后我们再对slapd进行配置

dpkg-reconfigure slapd

依次问的问题是:
是否忽略OpenLDAP的设置
DNS Domain name (DN)
Organization name (ON)
管理员密码
重复密码
选择数据库
slapd被删除时是否要删除数据库
移走老数据库
(可能会有)是否兼容LDAPv2协议

全部配置完毕后可以输入slapcat查看一下输出信息来确认是否正确

3、安装nginx和php7.0
nginx可参照这里:编译安装带有RTMP模块的nginx
或者直接apt-get安装也可(如果没啥特殊需求的话)

apt-get install nginx

php就比较简单了,直接安装即可

apt-get install php7.0-fpm

4、安装phpLDAPadmin

查了一下本来是可以apt安装的,但是因为某些原因debian9的库里剔除了这个包,所以我们需要手动下载,这里先留一下apt的安装方式,然后下面跟着手动安装的方式

apt-get install phpldapadmin

访问http://ftp.jp.debian.org/debian/pool/main/p/phpldapadmin/来查看最新版本,目前是1.2.2-6.1
	
wget http://ftp.jp.debian.org/debian/pool/main/p/phpldapadmin/phpldapadmin_1.2.2-6.1_all.deb

dpkg -i phpldapadmin_1.2.2-6.1_all.deb

5、配置phpLDAPadmin

修改配置文件:

vim /etc/phpldapadmin/config.php

(1) $servers->setValue('server'. 'host', '127.0.0.1')
#修改为某个内网可访问的IP地址

(2) $servers->setValue('server'. 'base', array('dc=example,dc=com')) 
#修改为baseDN

(3) $servers->setValue('login', 'bind_id', 'cn=admin,dc=example,dc=com')
#修改为baseDN下的admin

(4) $config->custom->appearance['hide_template_warning'] = false 
#false修改为true(这一行可能是注释着的,记得删掉开头的注释)

6、写nginx和php配置文件

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

结尾加上:
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
listen.backlog = -1

可以选择使用套接字来降低TCP的利用:
listen = /run/php/php7.0-fpm.sock


vim /etc/nginx/nginx.conf

server {
server_name ldap.yourdomain.com 1.1.1.1;
listen 80;

# document root
root /usr/share/nginx/html/;
index index.php index.html index.htm;
#
#  # application: phpldapadmin
  location /phpldapadmin {
  alias /usr/share/phpldapadmin/htdocs;
  index index.php index.html index.htm;
  }
  location ~ ^/phpldapadmin/.*\.php$ {
  root /usr/share;
  if ($request_filename !~* htdocs) {
  rewrite ^/phpldapadmin(/.*)?$ /phpldapadmin/htdocs$1;
  }
# fastcgi_pass unix:/run/php/php7.0-fpm.sock; #这里可选使用套接字,需要配合php-fpm一起修改
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $request_filename;
  include fastcgi_params;
  }

#  # logging
  error_log /var/log/nginx/phpldapadmin.error.log;
  access_log /var/log/nginx/phpldapadmin.access.log;
  }


systemctl restart php7.0-fpm.service
systemctl restart nginx.service

一切正常的话应该就可以通过浏览器访问了,地址是:http://yourdomain.com/phpldapadmin/

7、检查和添加数据
可以通过ldapseach来检查结构,例如

ldapsearch -x -LLL -H ldap:/// -b dc=yourdomain,dc=com
ldapsearch -x -LLL -h 1.1.1.1 -p 389 -b dc=yourdomain,dc=com

创建一个新的结构,保存成.ldif文件并利用ldapadd命令将数据添加入数据库

vim structure.ldif

dn: ou=office,dc=yourdomain,dc=com
objectClass: organizationalUnit
ou: office

ldapadd -x -D cn=admin,dc=yourdomain,dc=com -W -f structure.ldif

会提示输入密码,导入完成后可以查询来验证一下

ldapsearch -x -LLL -h 1.1.1.1 -p 389 -b dc=yourdomain,dc=com objectClass=*

参考:
Ubuntu下OpenLDAP的安装及配置
https://linoxide.com/linux-how-to/install-openldap-phpldapadmin-nginx-server/
完整版的OpenLDAP搭建全过程