基本玩法
登录之后查看网络信息:
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 4e:37:c2:a9:f6:66 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::2/64 scope link
valid_lft forever preferred_lft forever
inet6 fe80::4c37:c2ff:fea9:f666/64 scope link
valid_lft forever preferred_lft forever
这里的 eth0@if23 就是前面说的 veth 链路的用户端设备。注意它已经设置了 fe80::2/64 本地链接地址。登录之后无法直接访问外部网络环境。但你用 curl 访问 github.com 就会发现是通的。这是因为系统会自动设置 HTTP 代理环境变量:
$ export|grep http
declare -x http_proxy="http://[fe80::1%eth0]:8888"
declare -x https_proxy="http://[fe80::1%eth0]:8888"
非 HTTP 协议无法通信!
如果你做个网站对外提供 web 内容,就需要自己运行 http 服务。我们以 python3 内置的 http.server 包为例演示用法。
先准备 web 内容:
mkdir web
echo "Hello, World!" > web/index.html
然后运行
http.server
cd web
python3 -m http.server -b :: 8080
注意,这里使用-b ::来监听所有 IPv6 地址,包括我们自己的 fe80::2/64。端口只能固定为 8080。
到此,web 服务就准备好了。打开浏览器访问https://lab.example.zz.ac就会看到熟悉的”Hello, World!“。宿主机上的 Caddy 会自动申请 SSL 证书,并将请求转发到对应的用户网络空间。
为了让 web 服务在 ssh 退出后继续运行,你需要使用创建用户态的 systemd 服务。
服务路径为 ~/.config/systemd/user/web.service,内容如下:
[Unit]
Description=Web Service
[Service]
WorkingDirectory=%h/www
ExecStart=/usr/bin/python3 -m http.server -b :: 8080
[Install]
WantedBy=default.target
保存之后通过 systemctl 启动服务:
systemctl --user enable --now web.service
这样你的服务就能在后台自动运行了。而且宿主机重启之后你的服务也会自动启动。
高级玩法(podman)
以上展示了公益主机的基本玩法。如果觉得不过瘾,还可以自己折腾高级玩法。
虽然申请到的用户没有 root 权限,不能直接在系统层面安装软件。用户还是可以通过 Linux 版的 Homebrew 或者 Nix 包管理器在自己的家目录安装需要的工具,然后通过 systemd 来管理。
宿机上部署了 podman,这是 docker 的平替工具,不需要 root 权限就能运行,命令参数几乎跟 docker 一样,大家可以玩玩。