跳转至

Ubuntu 20.04 Server 安装教程

在 VMware 虚拟机上安装 Ubuntu 20.04 Server Version

如何安装系统

选择 ubuntu server iso

来到 Ubuntu Server 20.04 Image

选择 ubuntu-20.04.6-live-server-amd64.iso

Danger

注意,一定是 Server 版本,而不是 Desktop 版

因为 Server 更加轻量化

虚拟机配额

新建虚拟机,选 recommended

alt text

将刚才下载好的镜像文件导入

alt text

设置虚拟机名(在vmware中的显示名,而不是主机名 host name)

alt text

设置主机名, host name

alt text

disk分配,保持默认不变

alt text

配置 CPU/Memory/Network Adaptor: 点击 Customize Hardware

alt text

  • 2' CPU
  • 2048 Memory
  • Network Adaptor: 保持默认,是NAT
  • Network Adaptor 2: 点击Add新建一个,选择模式host-only

alt text

结束配置,点击finish

alt text

系统安装

现在进入系统安装阶段,选择语言为English

alt text

跟图示一样即可

alt text

跟图示一样即可

alt text

跟图示一样即可, 不用动

alt text

跟图示一样即可, 不用动

alt text

跟图示一样即可, 不用动

alt text

跟图示一样, 取消勾选 Set up this disk as an LVM group

alt text

跟图示一样即可, 不用动

alt text

跟图示一样即可, continue

alt text

设置你的用户名(username)和密码

alt text

理论上现在你就是 username@hostname(hostname 在上面设置中提到过了)

勾选 Install OpenSSH Server: 自动配置SSH相关的内容,便于远程操控

alt text

啥也不选,直接 Done

alt text

现在就是系统安装的阶段了, 显示 Installing System

alt text

显示 Installing Complete! 后, 选择 Reboot Now!

alt text

现在输入完login的username和passwd, 就顺利进来了 :))

alt text

如何实现服务器端的“翻墙”

在 Server 端 “翻墙” 可没那么容易

  1. Server端 没有 Desktop端 的图形化界面
  2. Desktop端 如何“翻墙”? 传送门
  3. 需要打破翻墙的“自环” (传送门提到过👆)
  4. 需要深刻理解“配置文件”是什么?

这里借鉴了参考文档: linux server 翻墙教程

具体的原理我在这里就忽略了,我们只讲解如何做

Note

我们的默认是, 你的 物理机(宿主机) 已经成功翻墙

现在 VMware 上的 Ubuntu20.04 还没翻墙

打开 linux 命令行,依次执行下列命令

Bash
1
2
3
mkdir  ~/.config/
mkdir  ~/.config/mihomo/
cd     ~/.config/mihomo/

在宿主机上下载 clash-linux / Country.mmdb / GeoSite.dat

Bash
1
2
3
4
5
cd ~/Downloads
# clash-linux
wget -O clash-linux.gz https://github.com/MetaCubeX/mihomo/releases/download/v1.17.0/mihomo-linux-amd64-v1.17.0.gz
# Country.mmdb
wget -O Country.mmdb https://github.com/Dreamacro/maxmind-geoip/releases/latest/download/Country.mmdb

来到 v2ray-规则文件下载地址

选择 GeoSite.dat的任一链接 下载

在CLI中开设两个窗口

  1. Win1: 远程连接上 ubuntu server
    Bash
    1
    ssh ubuntu@172.16.122.129
    
  2. Win2: 本机传送scp指令
    Bash
    1
    2
    3
    4
    cd ~/Downloads
    scp ./clash-linux.gz ubuntu@172.16.122.129:~/.config/mihomo/
    scp ./Country.mmdb ubuntu@172.16.122.129:~/.config/mihomo/
    scp ./geosite.dat ubuntu@172.16.122.129:~/.config/mihomo/
    
如何使用SSH连接到Ubuntu VM
Bash
1
2
sudo apt install net-tools
ifconfig

找对应的端口IP即可

比如笔者的是, 下面的172.16.122.129:

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ubuntu@ubuntu:~$ ifconfig
  ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
          inet 172.16.162.132  netmask 255.255.255.0  broadcast 172.16.162.255
          inet6 fe80::20c:29ff:fe57:d10f  prefixlen 64  scopeid 0x20<link>
          ether 00:0c:29:57:d1:0f  txqueuelen 1000  (Ethernet)
          RX packets 3590  bytes 1806912 (1.8 MB)
          RX errors 0  dropped 0  overruns 0  frame 0
          TX packets 3234  bytes 400532 (400.5 KB)
          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
          inet 172.16.122.129  netmask 255.255.255.0  broadcast 172.16.122.255
          inet6 fe80::20c:29ff:fe57:d119  prefixlen 64  scopeid 0x20<link>
          ether 00:0c:29:57:d1:19  txqueuelen 1000  (Ethernet)
          RX packets 34899  bytes 48328921 (48.3 MB)
          RX errors 0  dropped 0  overruns 0  frame 0
          TX packets 6066  bytes 1072881 (1.0 MB)
          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
          inet 127.0.0.1  netmask 255.0.0.0
          inet6 ::1  prefixlen 128  scopeid 0x10<host>
          loop  txqueuelen 1000  (Local Loopback)
          RX packets 137  bytes 12033 (12.0 KB)
          RX errors 0  dropped 0  overruns 0  frame 0
          TX packets 137  bytes 12033 (12.0 KB)
          TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  1. inet 对应的
  2. host-only 的 interface 对应的 IP
  3. 笔者处: ens34host-only; ens33NAT

从梯子下载配置文件

参考 这里

alt text

做法: 点击 Clash 的订阅链接

这是一个URL,将这个URL复制到浏览器搜索栏,就会自动下载一份文件

这个文件本质上是一个 .yaml 配置文件, 类似于:

alt text

在本机保存好,待会要复制并覆盖 config.yaml

现在本机的使命达成,后面我们聚焦于ubuntu server窗口:

ubuntu server clash 运行配置

现在你的~/.config/mihomo应该包含以下成分:

Bash
1
2
ubuntu@ubuntu:~/.config/mihomo$ ls
Country.mmdb  clash-linux.gz  geosite.dat

解压到当前文件夹:

Bash
1
gzip -f clash-linux.gz -d 

授权可执行权限:

Bash
1
chmod +x clash-linux

初始化执行 clash:

Bash
1
./clash-linux 

发生了点笔误,我们要修复下 :-(

跟刚才一样,我们回到Win2上,进行如下操作:

Bash
1
2
3
cd ~/Downloads
scp ./Country.mmdb ubuntu@172.16.122.129:~/.config/mihomo/
scp ./geosite.dat ubuntu@172.16.122.129:~/.config/mihomo/

现在来修改配置文件~/.config/mihomo/config.yaml:

Bash
1
2
3
ubuntu@ubuntu:~/.config/mihomo$ ls
Country.mmdb  cache.db  clash-linux  config.yaml  geosite.dat
ubuntu@ubuntu:~/.config/mihomo$ vim config.yaml

将之前拉到本地的配置文件(上面展示的那种,从梯子下载的)中的文本复制粘贴到config.yaml

然后,再次启动clash

Bash
1
./clash-linux

alt text

看见这样的结果,就知道已经稳了 :)

基于上述,日常开发如何使用梯子
  1. 在本机开两个CLI窗口连接ubuntu server
  2. 其中一个窗口进入 ~/.config/mihomo 运行: ./clash-linux
  3. 相当于后台进程
  4. 另一个窗口做开发

服务器的VPN如何可视化配置

YACD 是一个专门为 Clash / Mihomo 提供GUI的"网页版控制面板"

我们目前在 Ubuntu 服务器上运行的 ./clash-linux 是一个纯命令行的核心程序, 它本身没有任何界面, 只能通过修改配置文件或者发 API 请求来控制

为了让大家能像使用手机或电脑上的客户端一样直观地操作, 开发者们就做出了这类网页

(1) 通过 SSH 把服务器上的 9090 端口"映射"到你本地电脑

本地转发

Bash
1
ssh -L 9090:127.0.0.1:9090 bxhu@server_ip

登录成功后, 保持这个终端窗口开着不要关

(2) 打开本地电脑的浏览器, 访问在线面板: https://yacd.metacubex.one/

在 API 基础地址里填入: http://127.0.0.1:9090, 点击"添加"并连接

alt text

alt text

服务器的VPN如何进行节点分流

这部分写于 2026-07-01, 近期由于 claude 封号太严重

笔者需要日常维护 "多设备 IP" 的一致性. 如何"养号"脱离本文讲解范围, 这里只聚焦:

"如何在 headless server 上将VPN流量全部采用 Global, 并全部从 🇸🇬 新加坡 12 家宽 节点走"

(1) 开启 mihomo 代理工具进程

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
bxhu@ubuntu ~/.c/mihomo> sudo ./mihomo-linux-amd64-v1.19.22 -d .

INFO[2026-07-01T12:33:24.459807380Z] Start initial configuration in progress
INFO[2026-07-01T12:33:24.476982031Z] Geodata Loader mode: memconservative
INFO[2026-07-01T12:33:24.477036677Z] Geosite Matcher implementation: succinct
INFO[2026-07-01T12:33:24.481542962Z] Initial configuration complete, total time: 21ms
INFO[2026-07-01T12:33:24.481882812Z] RESTful API listening at: 127.0.0.1:9097
INFO[2026-07-01T12:33:24.503615840Z] Sniffer is closed
INFO[2026-07-01T12:33:24.503809315Z] DNS server(TCP) listening at: [::]:1053
INFO[2026-07-01T12:33:24.503870067Z] DNS server(UDP) listening at: [::]:1053
INFO[2026-07-01T12:33:24.503964632Z] Mixed(http+socks) proxy listening at: [::]:7897
INFO[2026-07-01T12:33:24.504091835Z] Start initial compatible provider  Twitter
INFO[2026-07-01T12:33:24.504143234Z] Start initial compatible provider 📢 Whatsapp
INFO[2026-07-01T12:33:24.504172669Z] Start initial compatible provider 📽 Twitch

(2) 基于 Clash RESTful API 从外部改变

仔细检查自己的配置文件 config.yaml

比如对于笔者的配置文件, 里面已经开启了 API 控制, 参数如下:

  • API 地址: 127.0.0.1:9097 (external-controller)
  • 访问密钥: set-your-secret (secret)

[1] 设置 Global 节点:

Bash
1
2
3
4
curl -X PUT "http://127.0.0.1:9097/proxies/GLOBAL" \
  -H "Authorization: Bearer set-your-secret" \
  -H "Content-Type: application/json" \
  -d '{"name": "🇸🇬 新加坡 12 家宽"}'

如果执行成功,通常不会返回任何报错信息。或返回一个空的 HTTP 204 No Content 状态

[2] 进行检查:

检查, 确认目前 Global 到底走的是哪个节点

Bash
1
2
curl -s -X GET "http://127.0.0.1:9097/proxies/GLOBAL" \
  -H "Authorization: Bearer set-your-secret"

这个命令会返回一串 JSON 数据! 找到里面 "now": 对应的值, 那就是当前正在使用的节点!!!

Bash
1
2
3
4
bxhu@ubuntu ~> curl -s -X GET "http://127.0.0.1:9097/proxies/GLOBAL" \
                     -H "Authorization: Bearer set-your-secret"

{"alive":true,"all":["DIRECT","REJECT","🇭🇰 香港 01","🇭🇰 香港 02","🇭🇰 香港 03 [0.3X]","🇭🇰 香港 04","🇭🇰 香港 05","🇭🇰 香港 06","🇭🇰 香港 07","🇭🇰 香港 08","🇭🇰 香港 09","🇭🇰 香港 10","🇭🇰 香港 11","🇭🇰 香港 12","🇭🇰 香港 13 家宽","🇭🇰 香港 14 家宽","🇭🇰 香港 15 家宽","🇸🇬 新加坡 01 [0.3X]","🇸🇬 新加坡 02","🇸🇬 新加坡 03","🇸🇬 新加坡 04","🇸🇬 新加坡 05","🇸🇬 新加坡 06","🇸🇬 新加坡 07","🇸🇬 新加坡 08","🇸🇬 新加坡 09","🇸🇬 新加坡 10","🇸🇬 新加坡 11","🇸🇬 新加坡 12 家宽","🇨🇳 台湾 01 [0.3X]","🇨🇳 台湾 02","🇨🇳 台湾 03","🇨🇳 台湾 04","🇨🇳 台湾 05","🇨🇳 台湾 06","🇨🇳 台湾 07 家宽","🇨🇳 台湾 08 家宽","🇨🇳 台湾 09 家宽","🇲🇴 澳门 01 家宽","🇲🇴 澳门 02 家宽","🇵🇭 菲律宾 01","🇵🇭 菲律宾 02","🇲🇾 马来西亚 01","🇲🇾 马来西亚 02 家宽","🇲🇾 马来西亚 03 家宽","🇹🇭 泰国 01","🇹🇭 泰国 02 家宽","🇮🇳 印度 01","🇮🇳 印度 02","🇮🇩 印度尼西亚","🇻🇳 越南 家宽","🇰🇭 柬埔寨","🇧🇩 孟加拉国","🇳🇵 尼泊尔","🇲🇳 蒙古国 家宽","🇲🇲 缅甸","🇱🇦 老挝","🇰🇵 朝鲜","🇦🇺 澳大利亚 01","🇦🇺 澳大利亚 02","🇦🇺 澳大利亚 03 家宽","🇳🇿 新西兰 家宽","🇯🇵 日本 01 [0.3X]","🇯🇵 日本 02","🇯🇵 日本 03","🇯🇵 日本 04","🇯🇵 日本 05","🇯🇵 日本 06","🇯🇵 日本 07","🇯🇵 日本 08 家宽","🇯🇵 日本 09 家宽","🇯🇵 日本 10 家宽","🇯🇵 日本 11 家宽","🇯🇵 日本 12 家宽","🇰🇷 韩国 01","🇰🇷 韩国 02","🇰🇷 韩国 03 家宽","🇰🇷 韩国 04 家宽","🇰🇷 韩国 05 家宽","🇺🇸 美国 01","🇺🇸 美国 02","🇺🇸 美国 03","🇺🇸 美国 04","🇺🇸 美国 05","🇺🇸 美国 06","🇺🇸 美国 07","🇺🇸 美国 08","🇺🇸 美国 09","🇺🇸 美国 10 家宽","🇺🇸 美国 11 家宽","🇺🇸 美国 12 家宽","🇨🇦 加拿大 01 家宽","🇨🇦 加拿大 02 家宽","🇲🇽 墨西哥 01","🇲🇽 墨西哥 02 家宽","🇧🇷 巴西 01","🇧🇷 巴西 02","🇭🇳 洪都拉斯","🇨🇱 智利","🇦🇷 阿根廷 家宽","🇺🇾 乌拉圭 家宽","🇬🇫 法属圭亚那","🇨🇴 哥伦比亚","🇪🇨 厄瓜多尔 家宽","🇵🇪 秘鲁","🇧🇴 玻利维亚","🇩🇪 德国 01","🇩🇪 德国 02","🇩🇪 德国 03","🇩🇪 德国 04","🇬🇧 英国 01","🇬🇧 英国 02","🇬🇧 英国 03","🇬🇧 英国 04 家宽","🇫🇷 法国 01","🇫🇷 法国 02","🇫🇷 法国 03 家宽","🇳🇱 荷兰","🇪🇸 西班牙","🇮🇪 爱尔兰","🇮🇹 意大利","🇱🇺 卢森堡","🇨🇭 瑞士","🇩🇰 丹麦","🇫🇮 芬兰","🇸🇪 瑞典","🇳🇴 挪威","🇦🇹 奧地利","🇨🇿 捷克","🇸🇰 斯洛伐克","🇸🇮 斯洛文尼亚","🇭🇷 克罗地亚","🇮🇸 冰岛","🇹🇷 土耳其 家宽","🇧🇪 比利时","🇵🇹 葡萄牙","🇵🇱 波兰","🇱🇹 立陶宛","🇪🇪 爱沙尼亚","🇱🇻 拉脫维亚","🇭🇺 匈牙利","🇷🇺 俄罗斯","🇺🇦 乌克兰","🇲🇩 摩尔多瓦","🇷🇴 罗马尼亚","🇧🇬 保加利亚","🇷🇸 塞尔维亚","🇲🇰 北马其顿","🇮🇶 伊拉克","🇬🇷 希腊","🇲🇹 马耳他","🇮🇱 以色列","🇱🇧 黎巴嫩","🇦🇿 阿塞拜疆","🇪🇬 埃及","🇦🇪 迪拜","🇸🇦 沙特阿拉伯","🇺🇿 乌茲別克","🇰🇿 哈萨克 家宽","🇰🇬 吉尔吉斯","🇹🇯 塔吉克","🇵🇰 巴基斯坦","🇧🇭 巴林 家宽","🇩🇿 阿尔及利亚","🇳🇬 尼日利亚 01","🇳🇬 尼日利亚 02","🇪🇹 埃塞俄比亚 家宽","🇦🇴 安哥拉","🇰🇪 肯尼亚","🇿🇦 南非","🇬🇱 格陵兰岛","🇦🇶 南极洲","MESL","🤖 AI","🍎 Apple","🖥 Microsoft","💳 Paypal","📽️ Bilibili","👙 TikTok","🎮 Steam","🔍 Google","🎵 Spotify","📢 Facebook","📢 Discord","📢 Telegram","📢 Whatsapp","📢 Line","📢 Linkedin","📢 Reddit","♥ Instagram","♥ Twitter","📽️ Netflix","📽️ Disney","📽️ PrimeVideo","📽 Twitch","📽️ HBO","📽 Abema","📽️ Bahamut","📽 BBC","📽 DAZN","Final","Auto","Fallback"],"dialer-proxy":"","extra":{},"hidden":false,"history":[],"icon":"","interface":"","mptcp":false,"name":"GLOBAL","now":"🇸🇬 新加坡 12 家宽","provider-name":"","routing-mark":0,"smux":false,"testUrl":"","tfo":false,"type":"Selector","udp":true,"uot":false,"xudp":false}

看笔者这里, "now":"🇸🇬 新加坡 12 家宽", 从而确定已经成功!

[3] 上述效果已持久化, 进程关闭再重启不影响"已完成的节点配置"

这个更改是持久化的, 未来再次启动进程时, 不需要重新执行这条 curl 命令

因为在笔者的配置文件中,包含了一项非常关键的设置:

Bash
1
2
profile:
  store-selected: true

通过 API(或图形界面)切换节点后,Mihomo(Clash)会把我们的这个选择状态写入到工作目录下的一个缓存文件里(通常名为 cache.db

当按下 ctrl+c 正常结束进程时,Mihomo 会优雅退出,并确保状态安全保存

下次再运行 ./mihomo-linux-amd64-v1.19.22 -d . 时,它会读取这个缓存文件,自动恢复上次在 GLOBAL 模式下选中的 "🇸🇬 新加坡 12 家宽"

什么时候会失效
  1. 删除了缓存文件: 如果我们手动删除了当前目录下的 cache.db 文件...
  2. 异常强制退出: 如果进程被异常杀死(例如使用 kill -9 强杀,或者服务器直接断电),导致 Mihomo 没来得及将内存中的选择状态写入硬盘
  3. 更换了工作目录: 如果下次启动时换了一个目录(例如没有加 -d .,导致它去读 ~/.config/mihomo 里的默认空缓存)