Important
本指南特别针对 Android 设备。虽然 Droidspaces 也可以在 Linux 桌面上运行,但这些说明专门针对 Android 环境独特的网络、存储和内核需求。
通过将 Droidspaces 与 Tailscale 及标准 Linux 安全工具结合使用,你可以将 Android 设备变成一台安全、可从任何地方访问的 Linux 服务器。
- 内核支持:此设置需要多个 Netfilter 和 IPSet 模块。请参阅 UFW/Fail2ban 的附加内核配置 查看所需选项的完整列表。
- LTS 发行版:强烈建议使用长期支持(LTS)发行版,如 Ubuntu 24.04 LTS 或 Debian 12,以获得最佳的稳定性和软件包支持。
- Root 用户:本指南中的所有步骤都必须在容器内以 root 用户身份运行。
- 包管理器:以下命令使用
apt,仅在 Debian 和 Ubuntu 系列的发行版中可用。 - NAT 模式:必填。 你必须在 NAT 模式(
--net=nat)下运行容器。在使用 UFW 这类防火墙时使用主机网络模式可能会干扰 Android 宿主端的网络连接,甚至根本无法正常工作。
为了处理防火墙规则和网络调试,你首先需要安装必要的网络工具,并确保与 Android 内核的兼容性。
-
安装工具:
apt update && apt install -y net-tools iptables -
切换到旧版 iptables: 现代 Ubuntu/Debian 版本默认使用
nftables后端,这在 Android 内核上的 Droidspaces 容器中经常会运行失败。你必须切换到旧版iptables后端以确保防火墙能正常工作:update-alternatives --set iptables /usr/sbin/iptables-legacy update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
为了维护服务器的安全,最佳方案是创建一个具有 sudo 权限的专用用户,并禁用 SSH 的直接 root 访问。
-
回收 UID 1000:Linux 发行版通常将 UID
1000分配给第一个非 root 用户(如ubuntu)。要为你自己的个人用户使用此 ID,你应首先检测并完全删除任何现有的 UID 1000:# 识别并删除与 UID 1000 关联的默认用户 DEFAULT_USER=$(getent passwd 1000 | cut -d: -f 1) userdel -r "$DEFAULT_USER" groupdel "$DEFAULT_USER" 2>/dev/null
-
将你的个人用户创建为 UID 1000(将
YOUR_USER替换为你期望的用户名):useradd -m -u 1000 -s /bin/bash YOUR_USER usermod -aG sudo YOUR_USER passwd YOUR_USER
-
安装 OpenSSH 服务器:
apt install -y openssh-server
-
禁用 Root 登录: 编辑
/etc/ssh/sshd_config以防止直接 root 访问:sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config systemctl restart ssh
Tailscale 为你的容器提供安全的 P2P 隧道,让你可以从 Tailnet 中的任何设备访问它,无需在公共路由器上开放端口。
-
安装 Tailscale:
curl -fsSL https://tailscale.com/install.sh | sh -
认证:
tailscale up
由于 Droidspaces 的 NAT 模式目前仅支持 IPv4,我们应在 UFW 中禁用 IPv6 以避免初始化错误。
-
在 UFW 中禁用 IPv6:
sed -i 's/IPV6=yes/IPV6=no/' /etc/default/ufw -
设置默认策略:
ufw default deny incoming ufw default allow outgoing
-
将 Tailscale 接口加入白名单: 与其将特定 IP 地址列入白名单,不如告诉 UFW 信任所有通过你的私有 Tailscale 隧道传入的流量:
ufw allow in on tailscale0 -
启用防火墙:
ufw --force enable
Fail2Ban 监控你的系统日志,并自动封禁表现出恶意行为的 IP 地址。
-
安装 Fail2Ban:
apt install -y fail2ban
-
创建本地配置: 在
/etc/fail2ban/jail.local创建一个持久配置文件来保护 SSH 并与 UFW 集成:[DEFAULT] # 在 10 分钟内失败 5 次后封禁 1 小时 bantime = 1h findtime = 10m maxretry = 5 # 使用 UFW 作为封禁动作 banaction = ufw # 使用白名单以防止意外锁定: # 1. YOUR_TAILSCALE_IP:你的私有隧道地址(例如 100.74.132.81) # 2. 172.28.0.0/16:Droidspaces 内部 NAT 网桥(涵盖所有容器) # 3. YOUR_LAN_SUBNET:如果你使用端口转发,你的本地 Wi-Fi 子网(例如,若你的局域网 IP 是 192.168.1.15,则使用 192.168.1.0/24) ignoreip = YOUR_TAILSCALE_IP 172.28.0.0/16 YOUR_LAN_SUBNET [sshd] enabled = true port = ssh backend = systemd
-
启动并验证:
systemctl restart fail2ban fail2ban-client status sshd
你的"移动服务器"现在已是一座坚固的堡垒!任何试图从公网访问它的人都将被封禁,而你则可以通过你的私有 Tailscale 网络保持完全的访问。
Droidspaces 支持在所有受支持的内核版本上于容器内原生运行 Docker。这使你可以直接在 Android 设备上运行嵌套的容器化服务(如 Portainer、Home Assistant 等)。
- LTS 发行版:如果你的内核版本低于 5.x.x,强烈建议使用 LTS 发行版,如 Ubuntu 24.04 LTS,以获得最佳兼容性。
- 内核配置:确保你的内核已启用所需的 Droidspaces 选项。参见所需的内核配置。
- 存储模式:你必须使用 ext4 /data 或 rootfs.img 模式(推荐)。
- 为什么? Android 默认的
f2fs文件系统不支持 Docker 的overlay2存储驱动所需的 overlay 特性。使用rootfs.img可以确保你运行在原生的 ext4 文件系统上。
- 为什么? Android 默认的
- NAT 模式:必须 Docker 需要 NAT 网络来创建其内部
docker0网桥并为嵌套容器提供互联网访问。
在主机网络模式下运行 Droidspaces 会导致 Docker 在尝试创建 docker0 接口时失败。请为你的容器选择 NAT 模式。
你可以通过 Android App 编辑容器配置来轻松切换到 NAT 模式。
Docker 的网络栈严重依赖 iptables。现代发行版通常默认使用 nftables 后端,这会在容器中引发"chain not found"错误。在安装 Docker 之前请切换到旧版后端:
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy使用官方的 Docker 安装脚本或发行版的包管理器:
# 使用官方便捷脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh如果想在运行 Docker 命令时不加 sudo 前缀,请将你的用户添加到 docker 组:
# 将 YOUR_USER 替换为你的用户名
usermod -aG docker YOUR_USER
# 无需注销即可应用组更改
newgrp docker测试 Docker 是否可以拉取并运行一个嵌套容器:
docker run --rm hello-world如果你看到 "Hello from Docker!" 消息,说明你已成功在 Android 上运行嵌套容器!
Tip
Docker 故障排除:如果 Docker 守护进程未能自动启动或 docker run 命令失败,请在你的终端中手动运行 sudo dockerd。这将输出实时日志,帮助你识别是否存在缺失的内核模块、文件系统冲突或网桥问题。
如果你无论如何都想在Host模式下运行 Docker,或者你的内核太旧而不支持 iptables-legacy 和 NAT 网络,你可以禁用 Docker 的内部网络管理,作为最后手段。
运行以下命令来配置守护进程:
mkdir -p /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"iptables": false,
"ip6tables": false,
"bridge": "none"
}
EOF
systemctl restart dockerWarning
上述 daemon.json 配置禁用了 Docker 的内部网桥(docker0)和所有自动端口转发。你只能使用 --network host 参数来运行具有互联网访问的 Docker 容器。
例如:docker run -it --network host ubuntu