在 Nginx 将某个子路径反代

现在遇到这么一个需求,访问根下面是提供一个服务,访问某个子路径(/abc),则需要提供另一个服务。这两个服务处于不同的机器上,我们现在通过反代把他们合在一起。在配置这个的时候,遇到了一些问题,最后得以解决。 upstream root { server 1.2.3.4:1234; } upstream subpath { server 4.3.2.1:4321; } server { listen 443 ssl; server_name test.example.com; # the last slash is useful, see below location /abc/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # the last slash is useful too, see below proxy_pass http://subpath/; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://root; } } 由于并不想 subpath 他看到路径中 /abc/ 这一层,导致路径和原来在根下不同,通过这样配置以后,特别是两个末尾的斜杠,可以让 nginx 把 GET /abc/index.

Read More

向 Nexus 6P 中刷入 LineageOS 实践

Nexus 6P 自带的系统没有允许 Root ,所以需要自己解锁 bootloader 并且刷上别的系统。我选择了 LineageOS 。Nexus 6P 的代号为 angler, 首先可以找到官方的安装教程。 我们需要下载的东西: $ wget https://mirrorbits.lineageos.org/full/angler/20180521/lineage-15.1-20180521-nightly-angler-signed.zip $ wget https://mirrorbits.lineageos.org/full/angler/20180521/lineage-15.1-20180521-nightly-angler-signed.zip?sha256 -O lineage-15.1-20180521-nightly-angler-signed.zip.sha256 $ wget https://mirrorbits.lineageos.org/su/addonsu-15.1-arm64-signed.zip $ wget https://mirrorbits.lineageos.org/su/addonsu-15.1-arm64-signed.zip?sha256 -O addonsu-15.1-arm64-signed.zip $ wget https://github.com/opengapps/arm64/releases/download/20180527/open_gapps-arm64-8.1-full-20180527.zip $ wget https://github.com/opengapps/arm64/releases/download/20180527/open_gapps-arm64-8.1-full-20180527.zip.md5 $ wget https://dl.twrp.me/angler/twrp-3.2.1-0-angler.img $ wget https://dl.twrp.me/angler/twrp-3.2.1-0-angler.img.asc $ wget https://dl.twrp.me/angler/twrp-3.2.1-0-angler.img.md5 $ gpg --verify *.asc $ md5sum -c *.md5 $ sha256sum -c *.sha256 其中 Open GApps 可以自己考虑选择 full 还是其它的选择。 接下来,按照教程,先解锁 bootloader 。连接手机,进入 USB Debugging Mode ,重启进入 bootloader 并且解锁:

Read More

在 WSL 上开启一个 getty 到串口的方法

为了测试一个硬件的 terminal ,想在 Windows 上向串口开一个 tty ,跑各种软件来测试。这件事情在 Linux 上和 macOS 上都有实践,但一直不知道 Windows 上怎么搞。经过了一番搜索,找到了 https://blogs.msdn.microsoft.com/wsl/2017/04/14/serial-support-on-the-windows-subsystem-for-linux/ 和 https://unix.stackexchange.com/a/123559 的方案。 以 COM5 为例: $ sudo chmod 666 /dev/ttyS5 $ sudo agetty -s 115200 ttyS5 linux 这样就可以看到一个登录的界面了。 在 macOS 上(https://superuser.com/questions/1059744/serial-console-login-on-osx): $ screen /dev/tty.SLAB_USBtoUART 115200 # type C-b : exec ::: /usr/libexec/getty std.115200

Read More

体验 Fedora on RISCV

看到 RISCV 很久了,但一直没能体验。最近工具链不断更新, QEMU 在 2.12.0 也正式加入了 riscv 的模拟。但是自己编译一个内核又太麻烦,就找到了 Fedora 做的 RISCV port,下载下来试用了一下。之前试过一次,但是遇到了一些问题,刚才总算是成功地搞出来了。 官方文档地址: https://fedorapeople.org/groups/risc-v/disk-images/readme.txt 首先下载 https://fedorapeople.org/groups/risc-v/disk-images/ 下的 bbl vmlinux 和 stage4-disk.img.xz 三个文件,然后解压 stage4-disk.img.xz ,大约有 5G 的样子。之前作者在脚本里作死开得特别大,导致我以前光是解压这一步就成功不了。现在终于解决了。 然后启动 qemu 命令打开虚拟机: qemu-system-riscv64 \ -nographic \ -machine virt \ -m 2G \ -kernel bbl \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-device,rng=rng0 \ -append "console=ttyS0 ro root=/dev/vda" \ -device virtio-blk-device,drive=hd0 \ -drive file=stage4-disk.img,format=raw,id=hd0 \ -device virtio-net-device,netdev=usernet \ -netdev user,id=usernet,hostfwd=tcp::10000-:22 这段命令摘自 readme.txt ,区别只在于把 -smp 4 去掉了。不知道为什么不能正常工作,可能和作者提到的 FPU patch 有关。然后系统就可以正常起来了(firewalld和systemd-logind不止为啥起不来,但是不用管)。

Read More

在 VMware ESXi 上部署 vCSA 实践

首先获取 vCSA 的 ISO 镜像,挂载到 Linux 下(如 /mnt),然后找到 /mnt/vcsa-cli-installer/templates/install 下的 embedded_vCSA_on_ESXi.json ,复制到其它目录并且修改必要的字段,第一个 password 为 ESXi 的登录密码,一会在安装的过程中再输入。下面有个 deployment_option,根据你的集群大小来选择,我则是用的 small 。下面配置这台机器的 IP 地址,用内网地址即可。下面的 system_name 如果要写 fqdn ,记得要让这个域名可以解析到正确的地址,不然会安装失败,我因此重装了一次。下面的密码都可以留空,在命令行中输入即可。SSO 为 vSphere Client 登录时用的密码和域名,默认用户名为 Administrator@domain_name (默认的话,则是 Administrator@vsphere.local) 这个用户名在安装结束的时候也会提示。下面的 CEIP 我选择关闭,设置为 false 。 接下来进行安装。 $ /mnt/vcsa-cli-installer/lin64/vcsa-deploy install /path/to/embedded_vCSA_on_ESXi.json --accept-eula 一路输入密码,等待安装完毕即可。然后通过 443 端口进入 vSphere Client, 通过 5480 端口访问 vCSA 的管理页面。两个的密码可以不一样。 2018-05-21 Update: 想要设置 VMKernel 的 IPv6 网关的话,ESXi 中没找到配置的地方,但是在 vSphere Client 中可以进行相关配置。

Read More

在脚本中寻找 X11 的 DISPLAY 和 XAUTHORITY

之前在搞一个小工具,在里面需要访问 X11 server ,但是访问 X11 server 我们需要两个东西:DISPLAY和XAUTHORITY两个环境变量。但是,由于它们在不同的发型版和Display Manager下都有些不同,所以花了不少功夫才写了一些。 为了验证我们是否可以连上 X11 server, 我们使用这一句: DIMENSIONS=$(xdpyinfo | grep 'dimensions:' | awk '{print $2;exit}') 它尝试打开当前的 DISPLAY,并且输出它的分辨率。接下来,我对不同的一些发型版,综合网上的方法,尝试去找到正确的环境变量。 对于 Debian: DISPLAY=$(w -hs | awk -v tty="$(cat /sys/class/tty/tty0/active)" '$2 == tty && $3 != "-" {print $3; exit}') USER=$(w -hs | awk -v tty="$(cat /sys/class/tty/tty0/active)" '$2 == tty && $3 != "-" {print $1; exit}') eval XAUTHORITY=~$USER/.Xauthority export DISPLAY export XAUTHORITY DIMENSIONS=$(xdpyinfo | grep 'dimensions:' | awk '{print $2;exit}') 对于 Archlinux:

Read More

在 macOS 和 Linux 之间搭建 tinc 网络

一直听说 tinc 比较科学,所以尝试自己用 tinc 搭建一个网络。这里,macOS 这段没有固定 IP 地址,Linux 机器有固定 IP 地址 linux_ip 。假设网络名称为 example , macOS 端名为 macos 地址为 192.168.0.2, linux 端名为 linux 地址为 192.168.0.1。 2018-11-11 注:本文用的 tinc 版本为 1.0.x ,而不是 1.1-pre ,两个分支命令不同,但协议可以兼容。 在 macOS 上配置: brew install tinc mkdir -p /usr/local/etc/tinc/example 新建 /usr/local/etc/tinc/example/tinc.conf: Name = macos Device = utun0 # use an unused number ConnectTo = linux 编辑 /usr/local/etc/tinc/example/tinc-up: #!/bin/sh ifconfig $INTERFACE 192.168.0.2 192.168.0.1 mtu 1500 netmask 255.

Read More

使用 Nginx 转发 VMware ESXi

我们的 VMware ESXi 在一台 NAT Router 之后,但是我们希望通过域名可以直接访问 VMware ESXi 。我们首先的尝试是,把 8443 转发到它的 443 端口,比如: socat TCP-LISTEN:8443,reuseaddr,fork TCP:esxi_addr:443 它能工作地很好(假的,如果你把 8443 换成 9443 它就不工作了),但是,我们想要的是,直接通过 esxi.example.org 就可以访问它。于是,我们需要 Nginx 在其中做一个转发的功能。在这个过程中遇到了很多的坑,最后终于是做好了 (VMware Remote Console等功能还不行,需要继续研究)。 首先讲讲为啥把 8443 换成 9443 不能工作吧 – 很简单,ESXi 的网页界面会请求 8443 端口。只是恰好我用 8443 转发到 443, 所以可以正常工作。这个很迷,但是测试的结果确实如此。VMware Remote Console 还用到了别的端口,我还在研究之中。 来谈谈怎么配置这个 Nginx 转发吧。首先是 80 跳转 443: server { listen 80; listen 8080; server_name esxi.example.org; return 301 https://$host$request_uri; } 这个很简单,接下来是转发 443 端口: server { listen 443 ssl; server_name esxi.

Read More

搭建 FTP server behind NAT

我们出现新的需求,要把以前的 FTP 服务器迁移到 NAT 之后的一台机器上。但是,FTP 不仅用到 20 21 端口, PASV 还会用到高端口,这给端口转发带来了一些麻烦。我们一开始测试,直接在 Router 上转发 20 和 21 端口到 Server 上。但是很快发现, Filezilla 通过 PASV 获取到地址为 (内网地址,端口高8位,端口低8位),然后,Filezilla 检测出这个地址是内网地址,于是转而向 router_ip:port 发包,这自然是不会得到结果的。 此时我们去网上找了找资料,找到了一个很粗暴的方法: iptables -A PREROUTING -i external_interface -p tcp -m tcp --dport 20 -j DNAT --to-destination internal_ip:20 iptables -A PREROUTING -i external_interface -p tcp -m tcp --dport 21 -j DNAT --to-destination internal_ip:21 iptables -A PREROUTING -i external_interface -p tcp -m tcp --dport 1024:65535 -j DNAT --to-destination internal_ip:1024-65535 有趣地是, macOS 自带的 ftp 命令(High Sierra似乎已经删去)可以正常使用。研究发现,它用 EPSV(Extended Passive Mode) 代替 PASV ,这里并没有写内网地址,因而可以正常使用。

Read More

使用 iptables 和策略路由进行带源地址的 forwarding

陈老师打开他的服务器,突然发现 CPU 莫名高负载,然后发现是有一个用户被远程登录拿来挖矿了。但是这台机器在 NAT 后,所以登录的源地址全是 NAT 路由,所以不知道对方的地址是什么。我们为了能使用 fail2ban 来禁用多次尝试失败的 IP ,但又不想因为别人把 NAT 路由的地址给禁了,这样我们自己也用不了了。所以必须要让这台机器能够知道 ssh 的源地址,我们现在简单的 socat 方案不能满足这个需求。 需求: 可以在外网连 NAT 路由的高端口(如2222)来访问这台机器。 在内网中,既可以直接连它的内网地址,也可以连 NAT 路由的高端口来访问这台服务器。此时,由于连 ssh 的机器就在同一个子网中,如果保留了源地址,服务器发的包会直接回来不经过 NAT 。所以我们还是保留了 socat 的方案。 实现方法: 在 NAT Router 上配置 DNAT ,这样发到 NAT Router 上的包就可以转发到服务器上: iptables -t nat -A PREROUTING -i external_interface -p tcp -m tcp --dport 2222 -j DNAT --to-destination internal_server_ip:22 但是,从服务器回来的包到了 NAT Router 上后,由于路由表的配置问题,默认的路由并不能把包送达对方。 方法1: 我们首先给包打上 mark: iptables -t mangle -A PREROUTING -i internal_interface -p tcp -m tcp --sport 22 -j MARK --set-mark 0x2222 然后配置策略路由:

Read More