iWAN / USTC

CONNECT FROM YOUR TERMINAL

校园网络,
从命令行出发。

Linux、macOS、Windows。一个客户端,三种连接方式。

下载客户端 ↓快速开始 →

ustc-iwan

USTC iWAN 命令行客户端:通过统一身份认证(OIDC)获取线路配置,并提供三种连接方式。

连接方式 平台 需要 root 说明
TUN 隧道 仅 Linux 是(或 CAP_NET_ADMIN) 创建虚拟网卡,按 IP/域名/CIDR 精确路由
SOCKS5 代理 Linux / macOS / Windows 否 用户态 TCP/IP 栈,默认监听 1080
HTTP 代理 Linux / macOS / Windows 否 用户态 TCP/IP 栈,默认监听 8080

SOCKS5/HTTP 模式由 smoltcp 在用户态生成完整的 TCP/IPv4 数据包,不创建网卡、不修改系统路由。

仓库包含三个二进制:

二进制 用途
iwan-client-oidc 推荐使用。负责登录、保存线路配置、选择线路并连接。
iwan-client 手动指定服务器、用户名和密码,适合调试或自定义接入。
iwan-server 自建兼容测试服务端,普通用户通常不需要。

目录

快速开始

# 1. 下载对应平台二进制并加执行权限(见「安装」)
chmod +x iwan-client-oidc-*

# 2. 登录并保存线路配置
./iwan-client-oidc --fetch

# 3. 查看本地线路
./iwan-client-oidc --list

# 4. 连接(Linux 推荐 TUN,其他平台用 SOCKS5/HTTP)
sudo ./iwan-client-oidc --connect            # TUN 隧道
./iwan-client-oidc --connect --socks         # SOCKS5 代理
./iwan-client-oidc --connect --http          # HTTP 代理

安装

项目文档可在 iwan.novusapp.app 在线阅读;下载页面 提供 Cloudflare 与 GitHub 下载入口。开发、R2 配置及历史版本补传见 Workers 子项目说明。

从 GitHub Releases 下载对应平台的压缩包:

iwan-client-oidc-linux-x86_64-musl      iwan-client-oidc-linux-aarch64-musl
iwan-client-oidc-macos-x86_64           iwan-client-oidc-macos-aarch64
iwan-client-oidc-windows-x86_64.exe     iwan-client-oidc-windows-aarch64.exe

发布流程将各平台压缩包直接上传到 Release 草稿,全部构建成功后发布,再将正式附件校验并同步至 R2 托管,不保存 Actions 中转产物。R2 同步失败不影响 GitHub 下载,可单独重跑同步任务;网站仅展示完整同步的版本。

从源码构建:

cargo build --release --bin iwan-client-oidc
cargo build --release --bin iwan-client
cargo build --release --bin iwan-server

交叉编译(需要 cargo install cargo-zigbuild 与对应 target):

cargo zigbuild --bin iwan-client-oidc --target aarch64-unknown-linux-musl --release
cargo zigbuild --bin iwan-client --target x86_64-unknown-linux-gnu.2.17 --release

获取线路配置

./iwan-client-oidc --fetch

命令会输出登录链接。用浏览器打开链接并完成认证后,将回调 URL 粘贴回终端。

如果浏览器提示打开 iWAN.app,选择取消,保留在当前网页:

取消打开 iWAN.app

随后在页面按钮上复制链接地址,将复制到的 com.panabit.mobile://... 回调 URL 粘贴回终端:

复制回调链接

配置保存到 ~/.config/iwan/servers.json(可用 --config-dir 修改目录),包含线路地址、 用户名和加密后的线路密码。--list 只读取线路信息,不解密密码。

选择线路

./iwan-client-oidc --list

示例输出:

 1. 教育网线路                          <server-ip>:6001
 2. 电信线路                           <server-ip>:6002
 3. 联通线路                           <server-ip>:6001
 4. 移动线路                           <server-ip>:6001

--connect 时默认交互输入序号;也可以显式指定线路,适合脚本或 systemd 无人值守启动:

./iwan-client-oidc --connect --server 电信   # 按名称关键字
./iwan-client-oidc --connect --server 2      # 按 1 起始的序号

配置用普通用户执行 --fetch 保存即可。连接时即使使用 sudo,也不需要把配置文件复制到 root 用户目录。

连接方式

TUN 隧道

Linux 下以 root 运行,创建 TUN 设备(需要 /dev/net/tun)并建立隧道:

sudo ./iwan-client-oidc --connect

默认只创建并配置 iwan0,不修改业务流量路由。需要让指定目标走 iWAN 时,显式传入路由参数:

sudo ./iwan-client-oidc --connect \
  --proxy-ip 1.1.1.1,2.2.2.2 \
  --proxy-domain example.com,api.example.com \
  --proxy-cidr 10.0.0.0/8
参数 说明
--proxy-ip 指定 IPv4 地址,自动转换为 /32 路由。
--proxy-domain 连接前解析域名,并把解析得到的 IPv4 地址加入路由。
--proxy-cidr 指定 CIDR 网段,例如 10.0.0.0/8 或 0.0.0.0/0。
--tun TUN 设备名,默认 iwan0。
--tun-mtu 握手协商的 MTU,同时设置到 TUN 设备,默认 1400,上限 2040。
--encrypt 协议加密模式,默认 1。

路由参数可以重复,也可以用逗号分隔。将全部流量路由到 iWAN:

sudo ./iwan-client-oidc --connect --proxy-cidr 0.0.0.0/0

注意:域名只在连接时解析一次,连接后解析变化不会自动同步到路由表。以上路由参数仅 TUN 模式可用。

SOCKS5 代理

免 root,Linux / macOS / Windows 通用:

./iwan-client-oidc --connect --socks
curl --socks5-hostname 127.0.0.1:1080 https://www.example.com/

默认监听 127.0.0.1:1080,可用 --socks-listen 修改。支持 CONNECT、IPv4 地址目标和 域名目标;不支持 IPv6、BIND 或 UDP ASSOCIATE(会收到对应的错误响应)。

HTTP 代理

用 --http 启用,默认监听 127.0.0.1:8080:

./iwan-client-oidc --connect --http
curl -x http://127.0.0.1:8080 https://www.example.com/   # CONNECT(HTTPS)
curl -x http://127.0.0.1:8080 http://www.example.com/    # 明文转发

支持 CONNECT host:port(任意 TCP 隧道)和明文 HTTP 转发(GET http://host/path 改写为 GET /path 后转发)。限制:仅 IPv4 目标;不支持代理认证;明文 HTTP 每个连接只处理一个请求 (转发时强制 Connection: close)。--socks 与 --http 互斥。

高级选项

域名解析

SOCKS5/HTTP 模式下,域名由客户端在本机解析为 IPv4 地址,默认使用 114.114.114.114:53, 可用 --dns 指定其他解析器:

--dns 223.5.5.5                         # 普通 UDP(可带端口:223.5.5.5:5353)
--dns tls://dns.alidns.com              # DNS over TLS(默认端口 853)
--dns https://dns.alidns.com/dns-query  # DNS over HTTPS

当本机 DNS 被代理工具接管(如 TUN + fake-ip)时,建议改用 DoT 或 DoH,避免解析到假地址。

网络接口绑定

客户端默认把连接服务器的 UDP 套接字绑定到当前活跃的物理网卡 IPv4 地址:优先有线网卡, 其次无线网卡;虚拟网卡(VPN/TUN、docker、veth 等)会被排除。连接时会打印实际选择:

  bind en0 (192.168.1.5)

需要指定其他网卡或地址时使用 --bind:

./iwan-client-oidc --connect --bind eth0          # 按网卡名(Linux)
./iwan-client-oidc --connect --bind en0           # 按网卡名(macOS)
./iwan-client-oidc --connect --bind 192.168.1.5   # 按本机 IP
./iwan-client-oidc --connect --bind 0.0.0.0       # 交还内核按路由选择

iwan-client 的 ping/auth/proxy/socks/http 子命令同样支持 --bind。按网卡名绑定时, Linux 会额外尝试 SO_BINDTODEVICE 锁定出口(需要 CAP_NET_ADMIN,失败时仅保留源地址绑定并 打印警告),macOS 使用 IP_BOUND_IF,Windows 使用源地址绑定。

MTU

选项 适用模式 默认 作用
--tun-mtu(oidc)/ --mtu(iwan-client proxy) TUN 1400 握手上报的 MTU,服务器确认后设置到 TUN 设备,上限 2040。
--proxy-mtu(oidc,旧名 --socks-mtu)/ --mtu(iwan-client socks/http) SOCKS5/HTTP 1380 用户态内层 MTU,决定发出的包长;超长下行包会被丢弃,实际取与服务器确认值的较小者。
--mtu(iwan-server) 服务端 1400 服务端 TUN 设备 MTU,应不小于客户端上报值。

TUN 默认 1400、用户态默认 1380:后者需为外层 IP+UDP 及协议头预留空间,取更保守的值。

性能调优

客户端会把连接服务器的 UDP 套接字收发缓冲区请求为 16 MB。Linux 默认的 net.core.rmem_max/wmem_max(约 208 KB)会把它钳制到系统上限,高带宽场景可按需调大:

sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216

用 IWAN_DEBUG=1 运行时会打印实际生效的 rcvbuf/sndbuf,便于确认是否被钳制。

调试输出

设置 IWAN_DEBUG=1 可输出 DNS 解析、VPN 收发包与 TCP 状态等诊断信息:

# Linux / macOS
IWAN_DEBUG=1 ./iwan-client-oidc --connect --socks
# Windows PowerShell
$env:IWAN_DEBUG = "1"
.\iwan-client-oidc-windows-x86_64.exe --connect --socks
:: Windows CMD
set IWAN_DEBUG=1
iwan-client-oidc-windows-x86_64.exe --connect --socks

Windows 上还可用 setx IWAN_DEBUG 1 设为用户级永久变量(新开终端生效,setx IWAN_DEBUG "" 清除)。 调试信息输出到标准错误,可重定向保存:... 2> debug.log。

命令行参数

参数 行为
--fetch 通过 OIDC 登录并保存线路配置。
--list 读取本地配置并列出线路,不联网、不解密密码。
--connect 读取本地配置,选择线路并连接。
--all 依次完成 --fetch → --list → --connect。
--server <序号|关键字> 非交互选择线路。
--socks / --http 启用用户态 SOCKS5 / HTTP 代理,二者互斥。
--socks-listen <addr> / --http-listen <addr> 代理监听地址,默认 127.0.0.1:1080 / 127.0.0.1:8080。
--proxy-mtu <mtu> 用户态内层 MTU,默认 1380。
--dns <resolver> SOCKS5/HTTP 的域名解析器。
--bind <网卡|IP> 绑定隧道 UDP 套接字的出口网卡或源地址,默认活跃物理网卡(有线优先)。
--config-dir <dir> 配置目录,默认 ~/.config/iwan。
--tun <name> TUN 设备名(Linux),默认 iwan0。
--tun-mtu <mtu> TUN 协商 MTU(Linux),默认 1400。
--proxy-ip / --proxy-domain / --proxy-cidr TUN 路由规则(Linux)。
--encrypt <0|1|2> 加密模式:0=None,1=XOR,2=AES,默认 1。

必须指定 --fetch、--list、--connect、--all 中的至少一个动作。

手动客户端

iwan-client 不使用 OIDC,需要手动提供服务器、用户名和密码。

# 测试连通性
./iwan-client ping --server <SERVER_IP> --port 6001

# 仅测试认证
./iwan-client auth --server <SERVER_IP> --port 6001 --user <USER> --pass '<PASSWORD>'

# 建立 TUN 隧道(Linux,root)
sudo ./iwan-client proxy --server <SERVER_IP> --port 6001 \
  --user <USER> --pass '<PASSWORD>' --proxy-ip 1.1.1.1,2.2.2.2

# 用户态 SOCKS5 / HTTP 代理(免 root)
./iwan-client socks --server <SERVER_IP> --port 6001 \
  --user <USER> --pass '<PASSWORD>' --listen 127.0.0.1:1080
./iwan-client http  --server <SERVER_IP> --port 6001 \
  --user <USER> --pass '<PASSWORD>' --listen 127.0.0.1:8080

服务端

iwan-server 用于自建测试环境,连接 USTC iWAN 不需要运行服务端:

sudo ./iwan-server \
  --port 6001 \
  --tun iwan-srv \
  --mtu 1400 \
  --server-ip 198.18.0.1 \
  --subnet 198.18.0.0/16 \
  --dns 114.114.114.114 \
  --users /etc/iwan/users.txt \
  --nat-if eth0

用户文件格式为每行 username:password。服务端所在机器需要开启 IPv4 转发和 NAT:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo iptables -t nat -A POSTROUTING -s 198.18.0.0/16 -o eth0 -j MASQUERADE

使用技巧

与 Clash / Mihomo / Stash / Surge 等分流软件配合使用时,可在其配置中添加一个指向本程序 本地端口的出站代理(SOCKS5 默认 127.0.0.1:1080,HTTP 默认 127.0.0.1:8080),再用规则 把需要走 iWAN 的目标流量导过去。本程序默认绑定物理网卡,不会走进分流软件的虚拟网卡造成 环路;完整配置示例、防环路与 fake-ip 处理见 doc/usage-tips.md, 现成的 USTC 网段与域名规则见 doc/iwan-rules.yaml。

参与贡献

欢迎反馈与贡献,但请遵守以下约定:

详细开发规范见 CONTRIBUTING.md。

免责声明

本项目仅供学习、研究和合法授权访问使用。使用者应自行确认其使用方式符合所在网络和服务的规则。