284 lines
6.7 KiB
Markdown
284 lines
6.7 KiB
Markdown
---
|
||
title:
|
||
source:
|
||
author: shenwei
|
||
published:
|
||
created:
|
||
description:
|
||
tags: [docker, proxychains, ubuntu, v2rayn]
|
||
---
|
||
|
||
#ubuntu #proxychains #docker #v2rayn
|
||
|
||
```table-of-contents
|
||
```
|
||
## 安装V2RayN
|
||
请参考以下文章来安装V2RayN
|
||
[[🟠3X-UI Xray on BandwagonVPS]]
|
||
[[🟠安装v2rayN]]
|
||
![[IMG-20251229190624376.png]]
|
||
|
||
|
||
|
||
## 验证代理可以科学上网
|
||
|
||
### 使用 `curl` 直接测试(最推荐)
|
||
|
||
这是最快、最直接的方法。我们可以强制 `curl` 使用 SOCKS5 代理去访问 Google 的状态页。
|
||
**执行命令:**
|
||
|
||
Bash
|
||
|
||
```
|
||
curl -x socks5h://127.0.0.1:10808 -v https://www.google.com
|
||
```
|
||
|
||
- **参数解释:**
|
||
|
||
- `-x socks5h://`:指定使用 SOCKS5 代理。注意加个 `h`,这表示让代理服务器去解析域名(防止本地 DNS 污染导致测试失败)。
|
||
- `-v`:(Verbose) 显示详细连接过程。
|
||
|
||
- **判断标准:**
|
||
- 如果看到 `HTTP/2 200` 或者大量的 HTML 文本,说明**代理成功**。
|
||
- 如果显示 `Connection refused` 或 `Timeout`,说明**端口未开放或 V2Ray 未运行**。
|
||
|
||
|
||
|
||
|
||
## 配置 ProxyChains
|
||
|
||
ProxyChains 是最灵活的工具,它可以让原本不支持代理的终端命令通过代理运行。
|
||
|
||
1. **编辑配置文件:**
|
||
```
|
||
sudo nano /etc/proxychains4.conf
|
||
```
|
||
|
||
(如果是旧版本可能是 `/etc/proxychains.conf`)
|
||
|
||
2. 修改 ProxyList:
|
||
|
||
滑动到文件末尾,注释掉默认的 socks4,添加你的 V2Ray 节点信息:
|
||
|
||
```
|
||
[ProxyList]
|
||
# 格式: 类型 IP 端口
|
||
socks5 127.0.0.1 10808
|
||
```
|
||
|
||
3. 使用方法:
|
||
|
||
在任何命令前加上 proxychains4 即可。例如:
|
||
|
||
```
|
||
proxychains4 curl https://www.google.com
|
||
``````
|
||
|
||
|
||
使用:
|
||
``` bash
|
||
proxychains git clone https://github.com/...
|
||
proxychains curl https://google.com
|
||
```
|
||
|
||
|
||
|
||
## 2. 配置 Git 代理
|
||
|
||
Git 不会自动走系统变量,建议为其设置全局配置。
|
||
|
||
- **设置 SOCKS5 代理(推荐):**
|
||
|
||
Bash
|
||
|
||
```
|
||
git config --global http.proxy 'socks5://127.0.0.1:10808'
|
||
git config --global https.proxy 'socks5://127.0.0.1:10808'
|
||
```
|
||
|
||
- **取消设置:**
|
||
|
||
Bash
|
||
|
||
```
|
||
git config --global --unset http.proxy
|
||
git config --global --unset https.proxy
|
||
```
|
||
|
||
|
||
---
|
||
|
||
## 3. 配置 Docker Pull (Daemon 代理)
|
||
|
||
`docker pull` 是由 Docker 守护进程(Daemon)执行的,它不读取普通用户的环境变量。
|
||
|
||
1. **创建配置目录:**
|
||
|
||
Bash
|
||
|
||
```
|
||
sudo mkdir -p /etc/systemd/system/docker.service.d
|
||
```
|
||
|
||
2. **创建代理配置文件:**
|
||
|
||
Bash
|
||
|
||
```
|
||
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
|
||
```
|
||
|
||
3. **添加以下内容:**
|
||
|
||
Ini, TOML
|
||
|
||
```
|
||
[Service]
|
||
Environment="HTTP_PROXY=http://127.0.0.1:10808/"
|
||
Environment="HTTPS_PROXY=http://127.0.0.1:10808/"
|
||
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporate.com"
|
||
```
|
||
|
||
_(注:这里通常使用 HTTP 代理端口)_
|
||
|
||
4. **重启 Docker 服务:**
|
||
|
||
```
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl restart docker
|
||
```
|
||
**检查 Docker 守护进程是否加载了代理:**
|
||
|
||
**执行命令:**
|
||
```
|
||
docker info | grep -i proxy
|
||
```
|
||
|
||
- **预期输出:** 如果你配置成功,你应该能看到类似下面的信息:
|
||
```
|
||
HTTP Proxy: http://127.0.0.1:10808
|
||
HTTPS Proxy: http://127.0.0.1:10808
|
||
No Proxy: localhost,127.0.0.1
|
||
```
|
||
_(注:如果这里没有输出,说明 `/etc/systemd/system/docker.service.d/http-proxy.conf` 配置未生效,请记得执行 `systemctl daemon-reload` 和 `systemctl restart docker`)_
|
||
|
||
|
||
|
||
---
|
||
|
||
## 4. 配置 Docker 容器内应用代理
|
||
|
||
#### docker-compose.yml里面直接加 env
|
||
```
|
||
`environment:
|
||
- ALL_PROXY=socks5://172.24.0.1:10808
|
||
```
|
||
|
||
For example:gi
|
||
```
|
||
version: "3.9"
|
||
|
||
services:
|
||
homarr:
|
||
image: ghcr.io/homarr-labs/homarr
|
||
container_name: homarr
|
||
restart: unless-stopped
|
||
ports:
|
||
- "7575:7575"
|
||
volumes:
|
||
- /home/shenwei/Docker/homarr/appdata:/appdata
|
||
- /var/run/docker.sock:/var/run/docker.sock
|
||
environment:
|
||
- SECRET_ENCRYPTION_KEY=4a418def4be700be26672aa57a4c3d4b94abd2cf97021b5c4ecd3c1644c1f071
|
||
- ALL_PROXY=socks5://172.24.0.1:10808
|
||
|
||
```
|
||
|
||
2个方法知道如何获取docker network gate IP
|
||
1. Docker Portainer
|
||
![[IMG-20251229190624729.png]]
|
||
2. 获取运行时container的network gateway
|
||
适用于容器已经在运行的情况。进入容器的交互式 shell:
|
||
```
|
||
docker exec -it <container_name_or_id> /bin/bash
|
||
```
|
||
- 如果容器没有 `bash`,可以用 `sh`:
|
||
```
|
||
docker exec -it <container_name_or_id> sh
|
||
```
|
||
|
||
运行以下命令获取network gateway IP:
|
||
```
|
||
ip route | awk '/default/ { print $3 }'
|
||
```
|
||
|
||
For example:
|
||
``` bash
|
||
|
||
root@shenwei-HP-ZBook-01:/home/shenwei/Docker/homarr# docker exec -it homarr /bin/bash
|
||
23c94b2dfeb5:/app# ip route
|
||
default via 172.24.0.1 dev eth0
|
||
172.24.0.0/16 dev eth0 scope link src 172.24.0.2
|
||
23c94b2dfeb5:/app# ip route | awk '/default/ { print $3 }'
|
||
172.24.0.1
|
||
|
||
|
||
```
|
||
|
||
|
||
如果你希望容器内部的程序(如 `apt-get`、`pip`)能上网,有两种方案:
|
||
|
||
### 方案 A:全局配置(推荐 Docker 17.07+)
|
||
|
||
修改当前用户的 Docker 客户端配置文件,这样所有 `docker run` 的容器都会自动带上代理环境变量。
|
||
|
||
1. **编辑配置文件:**
|
||
|
||
Bash
|
||
|
||
```
|
||
mkdir -p ~/.docker
|
||
nano ~/.docker/config.json
|
||
```
|
||
|
||
2. **添加内容:**
|
||
|
||
JSON
|
||
|
||
```
|
||
{
|
||
"proxies": {
|
||
"default": {
|
||
"httpProxy": "http://127.0.0.1:1081",
|
||
"httpsProxy": "http://127.0.0.1:1081",
|
||
"noProxy": "localhost,127.0.0.1"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**注意:** 如果你的容器使用的是 `bridge` 网络,`127.0.0.1` 指向的是容器内部。你需要将 IP 改为宿主机的虚拟网桥 IP(通常是 `172.17.0.1`)。
|
||
|
||
|
||
### 方案 B:运行时临时指定
|
||
|
||
在启动容器时通过 `-e` 参数注入环境变量:
|
||
|
||
Bash
|
||
|
||
```
|
||
docker run -e HTTP_PROXY="http://宿主机IP:1081" -e HTTPS_PROXY="http://宿主机IP:1081" my_image
|
||
```
|
||
|
||
---
|
||
|
||
## 总结建议
|
||
|
||
|**场景**|**推荐方式**|
|
||
|---|---|
|
||
|**临时终端命令**|`proxychains4 <command>`|
|
||
|**Git 操作**|`git config --global`|
|
||
|**下载 Docker 镜像**|修改 `systemd/system/docker.service.d`|
|
||
|**容器内部业务**|修改 `~/.docker/config.json`|
|
||
|
||
如果你在配置过程中遇到“连接被拒绝 (Connection Refused)”的问题,请检查 V2Ray 配置文件中是否开启了 HTTP 代理协议,并确认端口号是否正确。 |