前言
目前有项目有调用google drive api的需求,我们这里需要一个代理服务器来完成稳定调用的条件。而且目前很多机场不是特别稳定,尤其是在晚上访问人数较多的时候,如果有自己的代理服务器的话,相对来说也就不用受这方面的干扰了
代理服务器
购买一台海外服务器,从海外运营商国内运营商购买都可以,建议买大公司的,小公司网络不稳定,如果只有代理需求不如去机场买套餐
服务器初始化
参考本站服务器初始化相关内容,海外服务器不需要设置代理仓库,这里我们只需要docker
构建代理服务器
这里使用shadowsocks,以及docker构建的方式,其他构建方式参考官方GitHub以及官网文档
version: '3.7'
services:
shadowsocks:
restart: always
container_name: shadowsocks
image: shadowsocks/shadowsocks-libev:v3.3.5
ports:
- 9527:8388/tcp
- 9527:8388/udp
environment:
- METHOD=aes-256-gcm
- PASSWORD=passwd
- SERVER_ADDR=0.0.0.0
- TIMEOUT=60
- DNS_ADDRS=8.8.8.8,8.8.4.4
- TZ=UTC
相关参数的含义见Shadowsocks-libev Docker Image,记得开放对外的端口,这里是9527
构建
1 2 3 |
#老版本的是docker-compose up -d 注意自己的compose版本 docker compose up -d |
windows连接
这里只展示windows连接的方法,其他服务/操作系统的连接方式同样参考官方文档
首先,下载最新版本的Shadowsocks客户端的压缩包,解压后直接运行,右击任务栏图标
我们需要编辑服务器地址信息
此时右击任务栏shadowsocks -> 系统代理 -> 全局代理 就可以使用代理服务器访问了所有网站了
配置自定义PAC代理
右击任务栏shadowsocks -> PAC模式 -> 编辑本地PAC文件,打开pac.txt,可以看到
1 2 3 4 5 |
var __USERRULES__ = []; var __RULES__ = [ //... ]; |
其中__RULES__为已有规则,这里为了演示方便直接删掉,然后在系统代理中选择PAC代理,可以发现,现在所有访问的网站均不会走代理,此时添加规则
1 2 3 4 5 |
var __USERRULES__ = []; var __RULES__ = [ "||baidu.com" ]; |
则,访问百度可以发现以及走了代理进行访问,更多规则参考Adblock Plus filters explained
使用通配符也可以,比较容易理解
1 2 3 4 5 |
var __USERRULES__ = []; var __RULES__ = [ "*.baidu.com/*" ]; |
客户端容器
官网只给出了服务端的容器构建,没有给出客户端的容器构建,我们看下源码的dockerfile,目前的发布docker版本是v3.5.5
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
FROM alpine LABEL maintainer="kev <noreply@datageek.info>, Sah <contact@leesah.name>" ENV SERVER_ADDR 0.0.0.0 ENV SERVER_PORT 8388 ENV PASSWORD= ENV METHOD aes-256-gcm ENV TIMEOUT 300 ENV DNS_ADDRS 8.8.8.8,8.8.4.4 ENV TZ UTC ENV ARGS= COPY . /tmp/repo RUN set -ex \ # Build environment setup && apk add --no-cache --virtual .build-deps \ autoconf \ automake \ build-base \ c-ares-dev \ libcap \ libev-dev \ libtool \ libsodium-dev \ linux-headers \ mbedtls-dev \ pcre-dev \ # Build & install && cd /tmp/repo \ && ./autogen.sh \ && ./configure --prefix=/usr --disable-documentation \ && make install \ && ls /usr/bin/ss-* | xargs -n1 setcap cap_net_bind_service+ep \ && apk del .build-deps \ # Runtime dependencies setup && apk add --no-cache \ ca-certificates \ rng-tools \ tzdata \ $(scanelf --needed --nobanner /usr/bin/ss-* \ | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \ | sort -u) \ && rm -rf /tmp/repo USER nobody COPY ./docker/alpine/entrypoint.sh /entrypoint.sh CMD /entrypoint.sh |
以及entrypoint.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/bin/sh if [[ -f "$PASSWORD_FILE" ]]; then PASSWORD=$(cat "$PASSWORD_FILE") fi if [[ -f "/var/run/secrets/$PASSWORD_SECRET" ]]; then PASSWORD=$(cat "/var/run/secrets/$PASSWORD_SECRET") fi exec ss-server \ -s $SERVER_ADDR \ -p $SERVER_PORT \ -k ${PASSWORD:-$(hostname)} \ -m $METHOD \ -t $TIMEOUT \ -d $DNS_ADDRS \ -u \ $ARGS |
可以看到他这里甚至没有给出客户端构建的必要参数,而且ss-server也是写死的,我们可以通过docker-compose中的command重写最后的cmd命令来完成客户端容器的构建,这里给出示例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
version: '3.7' services: shadowsocks-client: restart: always container_name: shadowsocks-client image: shadowsocks/shadowsocks-libev:v3.3.5 ports: - 9527:1080 command: - "/bin/sh" - "-c" - "exec ss-local -s your_sw_server_ip -p your_sw_server_port -b 0.0.0.0 -l 1080 -k your_sw_server_passwd -m your_server_method -t 60" |
其实也可以重写他的docker构建自己的shadowsocks客户端,但是没啥难度也没啥必要,这里就不这么处理了
此时使用代理,即可完成socket代理http请求
1 2 |
curl --socks5-hostname localhost:9527 https://www.baidu.com |