tags: [网络, IPv6, 服务器, 手机, Android]

手机作为 IPv6服务器

概要

利用手机的移动网络(4G/5G)天然拥有公网 IPv6 地址的特性,将手机变成一台轻量级服务器,无需内网穿透、无需公网 IPv4,即可对外提供服务。

原理

为什么手机有公网 IPv6?

  • 中国三大运营商(移动/联通/电信)在 4G/5G 网络中已全面部署 IPv6
  • 每张 SIM 卡分配的 IPv6 地址通常是全球单播地址(2400:/2001: 开头),而非 NAT 后的地址
  • 这意味着手机直接暴露在公网上(仅 IPv6),任何 IPv6 网络均可直接访问

与家庭宽带的对比

特性手机移动网络家庭宽带
IPv4 公网无(运营商 NAT)通常无(需申请)
IPv6 公网有(默认分配)有(需路由器支持)
IP 稳定性较差(基站切换会变)较好(重启光猫会变)
带宽取决于信号(5G 可达数百 Mbps)取决于套餐
需要内网穿透是(IPv4)

前置条件

  1. SIM 卡:开通了 IPv6 的手机卡(目前三大运营商默认已支持)
  2. 手机系统:Android 推荐(可 root 更佳),iOS 因系统限制功能有限
  3. 确认 IPv6 可用:浏览器访问 ipv6.test-ipv6.com 确认获得公网 IPv6 地址
  4. 目标访问端:访问方也需要 IPv6 网络(家庭宽带 + 光猫开启 IPv6,或手机流量)

方案一:Termux + SSH(最基础)

安装 Termux

F-Droid 下载安装 Termux(不要用 Play Store 版本,已过时)。

配置 SSH 服务

# 安装 openssh
pkg update && pkg install openssh

# 设置密码
passwd

# 启动 sshd(默认监听 8022 端口)
sshd

获取 IPv6 地址

# 查看手机的 IPv6 地址
ifconfig
# 或
ip -6 addr show

找到 rmnet_data0(移动数据接口)上的 scope global 地址,类似 2408:xxxx:xxxx::xxxx

从外部连接

ssh -p 8022 user@[2408:xxxx:xxxx::xxxx]

注意:方括号是 IPv6 地址的必需格式。

方案二:Termux + Web 服务器

Nginx

pkg install nginx

# 编辑配置,监听 IPv6
nano $PREFIX/etc/nginx/nginx.conf

确保 listen 指令包含:

listen [::]:8080;

启动:

nginx

Python HTTP Server

# Python 内置,零依赖
python3 -m http.server 8080 --bind ::

Node.js

pkg install nodejs

创建 server.js

const http = require('http');
const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end('<h1>Hello from phone!</h1>');
});
server.listen(8080, '::', () => {
  console.log('Server running on [::]:8080');
});
node server.js

方案三:运行各类服务

在 Termux 中可以运行几乎所有 Linux 服务:

# 文件服务器(FTP/SFTP 已包含在 SSH 中,scp 即可传输)

# 数据库
pkg install mariadb
mariadb-install-db
mysqld_safe &

# Git 服务器(通过 SSH 即可,Git 原生支持 SSH 协议)
# 在手机上创建 bare repo
mkdir ~/git/myrepo.git && cd ~/git/myrepo.git
git init --bare
# 外部通过 git clone ssh://[2408:xxxx::xxxx]:8022/~/git/myrepo.git 克隆

稳定性与注意事项

IP 地址变化问题

手机 IPv6 地址可能因以下原因变化:

  • 切换基站(移动中)
  • 飞行模式开关
  • 重启手机
  • 运营商重新分配前缀

解决方案

  • DDNS:使用支持 IPv6 的 DDNS 服务(如 Cloudflare API),配合定时脚本更新 DNS 记录
  • 临时方案:适用于一次性使用、开发调试、临时文件传输等场景

防火墙

  • Android 系统本身没有入站防火墙(非 root 情况下),Termux 的服务默认可被外部访问
  • 部分运营商可能对入站流量做了过滤(尤其是常用端口如 80/443),建议使用高位端口(如 8080、8443)
  • 如需精细控制,root 后可使用 iptables / ip6tables

电量与性能

  • 长时间运行服务会消耗电量,建议连接充电器
  • Termux 在后台可能被系统杀死,可使用 termux-wake-lock 保持唤醒:
    termux-wake-lock
    
  • MIUI/ColorOS/OneUI 等深度定制系统需要在设置中关闭 Termux 的电池优化

安全建议

  • 必须设置强密码或使用 SSH 密钥认证
  • 不要暴露不必要的端口
  • 考虑使用 fail2ban 防暴力破解(需 proot 完整 Linux 环境)
  • 定期检查开放端口:ss -tlnp

进阶:proot 完整 Linux 环境

如果 Termux 原生环境不够用,可以通过 proot-distro 安装完整 Linux 发行版:

pkg install proot-distro
proot-distro install debian
proot-distro login debian

# 在 Debian 环境中可以安装完整的 nginx、docker(部分)、systemd 服务等
apt update && apt install nginx

典型使用场景

场景说明
临时 Web 演示在手机上跑一个 Web 服务,发链接给别人直接访问
远程开发SSH 连接手机,用 vim/emacs 写代码
文件传输scp 直接传文件,无需微信/QQ 中转
Git 仓库手机作为 Git remote,离线也能 push/pull
IoT 网关手机作为中间层,连接本地设备并对外暴露 API
翻墙出口手机作为代理服务器,利用运营商 IPv6 出口

参考资料