在 macOS 下实现 GRETAP

由于没有找到 macOS 下现成的 GRETAP 实现,我就想到自己实现一个。由于tuntaposx提供了一个和 Linux 下基本一样的 TAP Interface,于是自己利用 raw socket 和 TAP Interface 实现了一下,主要方法: 打开 raw socket ,读取收到的 proto 47 的包,判断是否为 GRETAP 包,是,则写入内层包到打开的 TAP Interface 中。 从 TAP Interface 中读入包,自己加上 GRE 头和 IP 头,然后发送。 主要的难度是在 raw socket 部分,macOS 继承了 BSD ,与 Linux 不大一样。于是参考了SOCK_RAW Demystified,成功地实现了这个功能。 代码放在jiegec/gretapmac。写得并不高效,仅仅可用,用了一百多行。 UPDATE: 之后又随手实现了一个类似的协议,L2TPv3 over UDP。代码在jiegc/l2tpv3udptap。

Read More

在 WireGuard 构建的 Overlay Network 上跑 babel 路由协议

受 Run Babeld over Wireguard - Fugoes’s Blog 和 Route-based VPN on Linux with WireGuard 启发,自己也想尝试一下,在一个有多个结点的网络中,如何通过 WireGuard 构建一个 overlay network,并通过 babel 自动进行结点发现和路径选择。 首先建立点对点的 WireGuard Tunnel 。由于我们用 babel 进行路由,所以我们不能采用 Wiregurad 本身基于目的地址的端口复用,所以每一个 WireGuard interface 都只有一个 Peer 。 配置一个点对点的 WireGuard Tunnel: $ # for wg-quick $ cat wg0.conf [Interface] Address = IPV4/32, fe80::ID/64 PrivateKey = REDACTED ListenPort = PORT1 Table = off # ask wg-quick not to insert peer address into routing table [Peer] PublicKey = REDACTED AllowedIPs = 0.

Read More

更改 macOS 屏幕亮度的按键

由于我打开了「Invert Fn」功能,所以需要调亮度的时候,是采用Fn+F1/F2的方法。但是,我的机械键盘则是,不按Fn时为1-9,按着Fn时为对应的F1-F9,但是就无法调整亮度和声音了。 然后捣腾了一下,发现可以用ScLk和Pa/Br(名称在各个键盘上不大一样)调整亮度。不过,还没发现如何更改音量。。。

Read More

向 Lenovo y1s 刷入 OpenWRT 17.01.5 固件,并把 IPv6 bridge 到内网中和配置认证脚本

首先参照OpenWRT Wiki - Lenovo Y1 v1找到刷固件教程: 下载Lenovo y1s 的固件备用 断开电源,等待一段时间,插入电源同时快速按下重置按钮,如果面板双闪,则说明进入了恢复模式 电脑连接到四个 LAN 口中任意一个,配置静态地址在 192.168.1.0/24 网段 打开 192.168.1.1 可以看到刷固件的页面 上传固件,等待路由器重启 配置 IP 地址为 DHCP 模式,打开 192.168.1.1 进行配置 然后就是常规的密码设置,opkg 源设置为 tuna 的源,配置 ssh 和 公钥。 接下来,我们为了使用学校的 SLAAC ,采用 ebtables 直接把学校的 IPv6 bridge 进来,而 IPv4 由于准入系统,需要 NAT 。 参考 Bridge IPv6 connections to WAN,下载 v6brouter_openwrt.sh 到某个地方,然后修改一下里面的一些参数: # For Lenovo y1s WAN_DEV=eth0.2 BRIDGE=br-lan # the rest remain unchanged 然后跑起来之后,自己的电脑可以成功拿到原生的 IPv6 地址了,不需要用难用的 NAT66 技术。

Read More

构建简易的 initramfs

一直对 Linux 的启动很感兴趣,但对 initrd 和 initramfs 等概念不大了解,于是上网找了资料,自己成功地看到了现象。 参考资料: Build and boot a minimal Linux system with qemu Custom Initramfs initramfs vs initrd ramfs, rootfs and initramfs The Kernel Newbie Corner: “initrd” and “initramfs”– What’s Up With That? 具体步骤: $ cat hello.c #include <stdio.h> #include <unistd.h> int main() { for (;;) { printf("Hello, world!\n"); } } $ gcc -static hello.c -o init $ echo init | cpio -o -H newc | gzip > initrd $ qemu-system-x86_64 -kernel /boot/vmlinuz-linux -initrd initrd -nographic -append 'console=ttyS0' # Use C-a c q u i t <Enter> to exit 可以看到过一会(三四秒?),可以看到满屏的 Hello world 在输出。

Read More

用 MuSSH 快速对多台机器进行软件包升级

Debian Stretch 9.5 刚刚更新,自己手上有不少 stretch 的机器,于是顺手把他们都升级了。不过,这个过程比较繁琐,于是我采用了 MuSSH 的方法,让这个效率可以提高,即自动同时 SSH 到多台机器上进行更新。 首先编写 hostlist 文件,一行一个地址,分别对应每台机器。 然后采用 MuSSH 对每台机器执行同样的命令 $ mussh -H hostlist -c 'apt update && apt upgrade -y' 此时要求,ssh 上去以后有相应的权限。这个有许多方法,不再赘述。然后就可以看到一台台机器升级,打上安全补丁,爽啊。

Read More

配置 fcitx-fbterm 实现在终端下显示和输入中文

参考网站: Ubuntu使用fbterm无法打开fb设备的解决及fcitx-fbterm安装 Fcitx - ArchWiki 完美中文tty, fbterm+yong(小小输入法) 让linux console支持中文显示和fcitx输入法 考虑到 lemote yeeloong 机器的 cpu 运算性能,跑一个图形界面会非常卡,于是选择直接用 framebuffer 。但是,显示中文又成了问题。于是,采用了 fbterm 和 fcitx 配合,加上 gdm 的方法,完成了终端下的中文输入。 首先,安装相关的包: $ sudo apt install gpm fcitx-fronend-fbterm dbus-x11 fbterm fonts-wqy-zenhei 接着,基于以上参考网站第一个,编写 zhterm 文件: $ echo zhterm #!/bin/bash eval `dbus-launch --auto-syntax` fcitx >/dev/null 2>&1 fbterm -i fcitx-fbterm kill $DBUS_SESSION_BUS_PID fcitx-remote -e $ chmod +x zhterm $ zhterm # Use C-SPC to switch input source 另:找到一个映射 Caps Lock 到 Escape 的方案:

Read More

在 Lemote Yeeloong 上安装 Debian jessie

参考网站: gNewSense To MIPS Run a TFTP server on macOS Debian on Yeeloong Debian MIPS port wiki Debian MIPS port 首先,进入设备的 PMON: Press Del to enter PMON 然后,下载 Debian Jessie 的 netboot 文件: $ wget https://mirrors.tuna.tsinghua.edu.cn/debian/dists/jessie/main/installer-mipsel/current/images/loongson-2f/netboot/vmlinux-3.16.0-6-loongson-2f $ wget https://mirrors.tuna.tsinghua.edu.cn/debian/dists/jessie/main/installer-mipsel/current/images/loongson-2f/netboot/initrd.gz 以 macOS 为例,起一个 tftp 服务器以供远程下载: # ln -s these files to /private/tftpboot: # initrd.gz # vmlinux-4.16.0-6-loongson-2f $ sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist # set addr manually to 192.168.2.1 回到 PMON ,配置远程启动:

Read More

通过 systemd-run 直接在容器中执行命令

之前使用 systemd-nspawn 开了容器,然后通过 machinectl shell 进去,想要起一个服务然后丢到后台继续执行,但是发现离开这个 session 后这个进程总是会被杀掉,于是找了 systemd-run 的方案,即: systemd-run --machine machine_name_here absolute_path_to_executable args_here 这样可以直接在容器中跑服务,而且用这个命令输出的临时 server 名称,还可以看到日志: journalctl --machine machine_name_here -u unit_name_above

Read More