---
url: /blog/h8av3l51/index.md
---
## 前言

这件事情起因是在学校服务器上分配了 3 个操作系统，分别叫做 ==MinecraftServer==，==WebHost==，==GitServer==，Debian 13 系统；其中 ==MinecraftServer== 是负责社团 MC 服务器，由于常年需要开启，所以内网穿透优先选择了这个节点。

既然需要选择内网穿透，那就需要过学校网关，当时写了一个自动过网关的脚本，通过 `cron` 协议每天和我们一起上早八……

由于学校的网关认证貌似一个 ip 只能对一个账号，尝试过 `git pull` 同步 `git` 服务器，上次尝试上脚本结果发现把跳板机的挤掉了，然后抑郁症大发作。

第二天早八过后就尝试使用了 `proxychains` 在 ==WebHost== 上面进行代理。这个文章留给后人，讲解如何使用 `proxychains` 通过已经接入网络的电脑代理上网。

::: tip
设 A，B 机器在同一局域网的网段下，B 机器已经接入 Internet。
:::

## 设置 SSH 服务器

在 B 机器上安装 `ssh-server`，一般来说作为跳板机，都会安装 ssh 服务器。

```bash
# 在已认证电脑上执行：
# 安装OpenSSH服务器（如未安装）
sudo apt update
sudo apt install openssh-server

# 启动SSH服务
sudo systemctl start ssh
sudo systemctl enable ssh

# 检查SSH服务状态
sudo systemctl status ssh

# 查看SSH服务器监听的端口（默认22）
sudo ss -tlnp | grep ssh
```

其次，配置防火墙允许SSH连接：

```bash
# 如果已认证电脑有防火墙，允许SSH端口
sudo ufw allow 22/tcp
# 或者临时禁用防火墙（仅测试用）
sudo ufw disable
```

## 配置 SSH 免密登录

下面在 A 机器上生成密钥对，注释为 `proxy-key`，一路点击回车，不要输入任何东西。

```bash
ssh-keygen -t rsa -b 4096 -C "proxy-key"
```

这样我们就在 `~/.ssh/id_rsa` 生成了密钥对，然后复制公钥到已认证电脑。在校园内，Minecraft 服务器地址在 `192.168.119.230`，接下来输入 yes 加入信任主机。

```bash
ssh-copy-id user@B的IP
```

## 建立 SSH 隧道

接下来 A 电脑是无法上网的，我们没有办法使用 `apt` 下载 `proxychains`，此时需要使用 `ssh` 隧道通过 `socks5` 代理本机，我选择了 `1080` 端口。

```bash
ssh -f -N -D 127.0.0.1:1080 user@B的IP
# -N: 不执行远程命令
# -D: 本地动态端口转发（SOCKS5代理）
# -f: 持续连接隧道
# 1080: 本地端口号
```

接下来对 `apt` 包使用代理：

```bash
# 1. 创建apt代理配置文件
sudo tee /etc/apt/apt.conf.d/80proxy << 'EOF'
Acquire::http::Proxy "socks5h://127.0.0.1:1080";
Acquire::https::Proxy "socks5h://127.0.0.1:1080";
EOF

# 2. 设置环境变量（供其他命令使用）
export HTTP_PROXY="socks5h://127.0.0.1:1080"
export HTTPS_PROXY="socks5h://127.0.0.1:1080"
export ALL_PROXY="socks5h://127.0.0.1:1080"

# 3. 现在可以更新和安装软件了
sudo apt update
sudo apt install proxychains autossh
```

安装完毕后，我们删除已经建立的 `/etc/apt/apt.conf.d/80proxy` 文件，即：

```bash
sudo rm /etc/apt/apt.conf.d/80proxy
```

接下来复查 `1080` 端口，使用更稳定的 `autossh` 自动创建隧道：

```bash
lsof -i:1080
```

如果有返回值，那就使用 `kill` 命令终止进程：

```bash
sudo lsof -ti:1080 | xargs -r sudo kill -9
```

## Autossh 自动隧道与 Proxychains 透明代理

ProxyChains 是 Linux 和其他Unix下的代理工具。它可以使任何程序通过代理上网，允许 TCP 和 DNS 通过代理隧道，支持 HTTP、SOCKS4 和 SOCKS5 类型的代理服务器，并且可配置多个代理。ProxyChains 通过一个用户定义的代理列表强制连接指定的应用程序，直接断开接收方和发送方的连接。

```bash
autossh -M 0 -f -N -D 127.0.0.1:1080 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -o "ExitOnForwardFailure=yes" user@B的ip >> /tmp/autossh.log 2>&1
```

完成后，再对 proxychains 进行配置：

```bash
# 备份原始配置文件
sudo cp /etc/proxychains.conf /etc/proxychains.conf.bak

# 使用sed命令快速修改
sudo sed -i 's/^socks4\s.*/socks5 127.0.0.1 1080/' /etc/proxychains.conf
```

最后复查并测试：

```bash
# 检查SSH隧道是否建立
ss -tlnp | grep 1080
# 应该看到类似：LISTEN 0 128 127.0.0.1:1080

# 测试SOCKS5代理功能
curl --socks5 127.0.0.1:1080 http://ifconfig.me
# 应该返回已认证电脑的公网IP
```

## 操作方案

各种网络操作通过代理，只需要前面添加 `proxychains` 即可：

```bash
# 更新系统
sudo proxychains apt update && sudo proxychains apt upgrade

# 下载文件
proxychains wget https://example.com/file.zip
proxychains curl -O https://example.com/file.tar.gz

# 使用git
proxychains git clone https://github.com/user/repo.git
proxychains git pull

# 使用scp传输文件
proxychains scp file.txt user@remote:/path/

# 使用rsync
proxychains rsync -avz /local/path user@remote:/remote/path

# 使用ping（注意：ping不走SOCKS5，需要额外配置）
# 使用curl测试ping替代
proxychains curl --connect-timeout 5 http://example.com
```

EOF...
