青蛙小白
目录

My Code Server(Ubuntu)

My Code Server(Ubuntu)是我整个开发工作流的核心与基石。它为我提供了一个统一、强大且可从任何地方访问的开发环境,无论是通过MacBook上的Chrome浏览器、 VSCode,还是在iPad Pro上使用Code-Server的PWA应用,最终的计算和执行环境都汇集于此。

这种将开发环境集中化的策略,使得我可以摆脱对特定客户端设备的依赖,确保了在不同设备上拥有一致的开发体验和环境配置。

这个基于Ubuntu Server的开发服务器,承载了我多样化的开发场景:

  • Code-Server后端: 通过HTTPS协议,为MacBook和iPad Pro上的Chrome PWA应用提供随时随地的Web IDE体验。
  • VScode(Cursor)远程主机: 通过Remote SSH扩展,将MacBook上的VSCode(Cursor)无缝连接到服务器,利用其强大的计算资源。
  • 容器化开发平台: 结合Remote SSH和Dev Containers扩展,直接在服务器的Docker容器中进行开发、构建和测试,实现了环境的完全隔离与复现。

本篇文档将主要记录这个强大、稳定且高效的个人代码服务器"My Code Server(Ubuntu)"。

当前操作系统: Ubuntu 24.04 LTS

设置默认编辑器为vi

sudo update-alternatives --config editor

mihomo proxy

为了增强系统安全性,我们首先为mihomo创建一个专用的运行用户。

useradd -m mihomo

下载安装包:

wget https://github.com/MetaCubeX/mihomo/releases/download/<version>/mihomo-linux-amd64-<version>.deb
dpkg -i mihomo-linux-amd64-<version>.deb

查看一下安装的内容:

dpkg -L mihomo
/.
/etc
/etc/mihomo
/etc/mihomo/config.yaml
/usr
/usr/share
/usr/share/doc
/usr/share/doc/mihomo
/usr/share/doc/mihomo/changelog.gz
/usr/share/licenses
/usr/share/licenses/mihomo
/usr/share/licenses/mihomo/LICENSE
/usr/lib
/usr/lib/systemd
/usr/lib/systemd/system
/usr/lib/systemd/system/mihomo.service
/usr/lib/systemd/system/[email protected]
/usr/bin
/usr/bin/mihomo

下载数据文件:

cd /etc/mihomo
# https://github.com/MetaCubeX/meta-rules-dat
wget https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/country.mmdb
wget https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat
wget https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.db
wget https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.metadb
wget https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat
wget https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.db

接下来配置/etc/mihomo/config.yaml。这是一个核心配置文件,以下是一个包含了基本DNS、代理、分组和规则的完整示例。需要根据自己的代理服务信息和需求进行修改。

mixed-port: 7890
redir-port: 7892
mode: rule
log-level: info
allow-lan: true
external-controller: 0.0.0.0:9090
external-ui: /etc/mihomo/ui
secret: <secret>

# 省略了dns,proxies,proxy-providers,rule-providers,rules,proxy-group等配置

安装UI:

git clone https://github.com/metacubex/metacubexd.git -b gh-pages /etc/mihomo/ui

如果后续需要更新UI

git -C /etc/mihomo/ui pull -r

接下来,为了让mihomo服务以之前创建的mihomo用户身份运行,需要修改其systemd服务配置。修改/usr/lib/systemd/system/mihomo.service,在[Service]中加入:

User=mihomo

修改配置后,需要重新加载systemd守护进程,然后启用并立即启动mihomo服务:

systemctl daemon-reload
systemctl enable --now mihomo

服务启动后,可以通过以下方式检查其运行状态和日志:

# 查看服务状态
systemctl status mihomo

# 实时查看服务日志
journalctl -u mihomo -f

最后,确认代理是否正常工作:

curl --proxy http://127.0.0.1:7890 https://targedomain.com

如果一切顺利,你应该能看到targedomain的HTML内容。至此,mihomo代理已配置完成。

为了实现透明代理,让服务器上的网络流量(或特定用户的流量)都通过mihomo,我们需要配置iptables规则。

set-iptables.sh
#!/bin/bash

PROXY_PORT=7892
PROXY_DNS_PORT=1053
PROXY_UID_USER="mihomo"
# 服务器的本地IP地址
SERVER_LOCAL_IP="192.168.100.15"

if ! id -u "$PROXY_UID_USER" &>/dev/null; then
    echo "错误:用户 $PROXY_UID_USER 不存在。请替换成实际运行 mihomo 的用户名。"
    exit 1
fi
PROXY_UID=$(id -u "$PROXY_UID_USER")
echo "找到用户 $PROXY_UID_USER,UID 为 $PROXY_UID。"

echo "正在清理旧的 iptables 规则..."
iptables -t nat -D OUTPUT -p tcp -m owner --uid-owner "$PROXY_UID" -j RETURN 2>/dev/null
iptables -t nat -D OUTPUT -p tcp -j MIHOMO 2>/dev/null
iptables -t nat -D OUTPUT -p udp --dport 53 -m owner --uid-owner "$PROXY_UID" -j RETURN 2>/dev/null
iptables -t nat -D OUTPUT -p udp --dport 53 -j REDIRECT --to-ports "$PROXY_DNS_PORT" 2>/dev/null
iptables -t nat -F MIHOMO 2>/dev/null
iptables -t nat -X MIHOMO 2>/dev/null

echo "正在新建 MIHOMO chain..."
iptables -t nat -N MIHOMO

echo "正在添加 MIHOMO 链的排除规则..."
iptables -t nat -A MIHOMO -d 0.0.0.0/8 -j RETURN
iptables -t nat -A MIHOMO -d 127.0.0.0/8 -j RETURN
iptables -t nat -A MIHOMO -d 10.0.0.0/8 -j RETURN
iptables -t nat -A MIHOMO -d 172.16.0.0/12 -j RETURN
iptables -t nat -A MIHOMO -d 192.168.0.0/16 -j RETURN
iptables -t nat -A MIHOMO -d 224.0.0.0/4 -j RETURN
iptables -t nat -A MIHOMO -d 240.0.0.0/4 -j RETURN

iptables -t nat -A MIHOMO -d "$SERVER_LOCAL_IP" -p tcp --dport "$PROXY_PORT" -j RETURN
iptables -t nat -A MIHOMO -d 127.0.0.1 -p tcp --dport "$PROXY_PORT" -j RETURN
iptables -t nat -A MIHOMO -d "$SERVER_LOCAL_IP" -p udp --dport "$PROXY_DNS_PORT" -j RETURN
iptables -t nat -A MIHOMO -d 127.0.0.1 -p udp --dport "$PROXY_DNS_PORT" -j RETURN

echo "正在重定向 TCP 流量到 mihomo redir-port $PROXY_PORT..."
iptables -t nat -A MIHOMO -p tcp -j REDIRECT --to-ports "$PROXY_PORT"

echo "正在将 MIHOMO 链应用到 OUTPUT 链..."
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner "$PROXY_UID" -j RETURN
iptables -t nat -A OUTPUT -p udp --dport 53 -m owner --uid-owner "$PROXY_UID" -j RETURN

iptables -t nat -A OUTPUT -p tcp -j MIHOMO
iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports "$PROXY_DNS_PORT"

echo "iptables 配置完成!请确保 Mihomo 已配置 DNS Fake-IP 并正在运行。"

为什么没有选择使用TProxy或mihomo的tun模式

TProxy和mihomo的TUN模式都是实现透明代理的强大方案,尤其适用于将设备作为旁路网关的场景。但在这个Code Server的配置中,核心目标是仅代理特定用户或特定进程在服务器本机上产生的出站流量,而不是接管整个服务器或局域网的网络。基于这个目标,选择了iptablesREDIRECT 模式,这样配置简单,且已满足需求。

文件共享

如需从其他设备访问 Ubuntu 服务器的文件:

SFTP(通过 SSH)

可以直接使用 SFTP 访问文件,无需额外配置。

Samba 共享(可选)

如果需要与 Mac 或 Windows 设备共享文件,可以配置 Samba。以下以为用户 user1 配置 Samba 共享为例:

首先安装 Samba:

sudo apt update
sudo apt install samba

确认 Samba 服务状态:

sudo systemctl status smbd

为要共享的用户创建 Samba 密码(Samba 使用独立的密码数据库):

# 添加现有系统用户到 Samba,并设置 Samba 密码
sudo smbpasswd -a user1

创建共享目录(如果还没有):

# 例如共享用户的整个 home 目录,或创建专门的共享文件夹
mkdir -p /home/user1/share

备份原始配置文件:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup

编辑 /etc/samba/smb.conf,在文件末尾添加共享配置:

[user1-home]
    comment = user1's Home Directory
    path = /home/user1
    browseable = yes
    read only = no
    guest ok = no
    valid users = user1
    create mask = 0644
    directory mask = 0755

# 如果只想共享特定文件夹
[user1-share]
    comment = user1's Shared Files
    path = /home/user1/share
    browseable = yes
    read only = no
    guest ok = no
    valid users = user1
    create mask = 0644
    directory mask = 0755

验证配置文件语法:

testparm

重启 Samba 服务使配置生效:

sudo systemctl restart smbd

从客户端测试连接:

# 在 Mac 上,Finder -> Go -> Connect to Server
# smb://server-ip

# 在 Linux 上测试
smbclient //server-ip/user1-home -U user1

# 查看所有共享
smbclient -L server-ip -U user1

常用管理命令:

# 查看当前 Samba 用户列表
sudo pdbedit -L

# 删除 Samba 用户
sudo smbpasswd -x username

# 禁用/启用 Samba 用户
sudo smbpasswd -d username  # 禁用
sudo smbpasswd -e username  # 启用

# 查看当前连接
sudo smbstatus
评论