前言
目前有项目有调用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
构建
#老版本的是docker-compose up -d 注意自己的compose版本
docker compose up -d
windows连接
这里只展示windows连接的方法,其他服务/操作系统的连接方式同样参考官方文档
首先,下载最新版本的Shadowsocks客户端的压缩包,解压后直接运行,右击任务栏图标
我们需要编辑服务器地址信息
此时右击任务栏shadowsocks -> 系统代理 -> 全局代理 就可以使用代理服务器访问了所有网站了
配置自定义PAC代理
右击任务栏shadowsocks -> PAC模式 -> 编辑本地PAC文件,打开pac.txt,可以看到
var __USERRULES__ = [];
var __RULES__ = [
//...
];
其中__RULES__为已有规则,这里为了演示方便直接删掉,然后在系统代理中选择PAC代理,可以发现,现在所有访问的网站均不会走代理,此时添加规则
var __USERRULES__ = [];
var __RULES__ = [
"||baidu.com"
];
则,访问百度可以发现以及走了代理进行访问,更多规则参考Adblock Plus filters explained
使用通配符也可以,比较容易理解
var __USERRULES__ = [];
var __RULES__ = [
"*.baidu.com/*"
];
客户端容器
官网只给出了服务端的容器构建,没有给出客户端的容器构建,我们看下源码的dockerfile,目前的发布docker版本是v3.5.5
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
#!/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命令来完成客户端容器的构建,这里给出示例
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请求
curl --socks5-hostname localhost:9527 https://www.baidu.com