Vượt tường lửa với SOCKS

Bài này sẽ hướng dẫn dùng giao thức SOCKS để vượt tường lửa bằng nhiều phương pháp khác nhau.

SSH Tunnel

Đây là cách vượt tường lửa nhanh gọn nếu ta có sẵn VPS. Ta chỉ cần chạy lệnh sau là tạo được một SSH tunnel đến VPS.

ssh -D 1080 -q -C -N -f [email protected]

Mở trình duyệt và chỉnh cấu hình SOCKS5 là localhost với port là 1080. Mọi traffic sẽ được truyền qua SSH tunnel.

SOCKS5 Server

Dưới đây là file compose để dựng SOCKS5 server.

version: "3.9"
services:
  socks5-server:
    image: serjs/go-socks5-proxy
    container_name: socks5-server
    ports:
      - 1080:1080
    environment:
      - PROXY_USER=hieu
      - PROXY_PASSWORD=password
      - PROXY_PORT=1080

Tương tự như phương pháp SSH tunnel, ta bật trình duyệt và cấu hình SOCKS5 đến IP server với port 1080. Nhập username và password cho đúng là kết nối được đến proxy.

Shadowsocks

Shadowsocks giả lập traffic của ứng dụng Internet thông thường để qua mặt tường lửa. Dưới đây là sơ đồ mô tả cách hoạt động của Shadowsocks:

Shadowsocks

Ta cần có Client và Server kết nối với nhau để mã hóa và giải mã traffic. Trình duyệt sẽ kết nối đến Client bằng giao thức SOCKS5.

Shadowsocks server

Dockerfile cho Shadowsocks server.

FROM ubuntu:22.04
WORKDIR /shadowsocks

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y wget && \
    wget https://github.com/shadowsocks/go-shadowsocks2/releases/download/v0.1.5/shadowsocks2-linux.tgz && \
    tar -xvzf shadowsocks2-linux.tgz

ARG SHADOWSOCKS_PORT=8488
EXPOSE ${SHADOWSOCKS_PORT}

ENV SHADOWSOCKS_CIPHER=AEAD_CHACHA20_POLY1305
ENV SHADOWSOCKS_PASSWORD=password
ENV SHADOWSOCKS_PORT=${SHADOWSOCKS_PORT}

CMD ./shadowsocks2-linux \
    -s "ss://${SHADOWSOCKS_CIPHER}:${SHADOWSOCKS_PASSWORD}@:${SHADOWSOCKS_PORT}"

Tạo Docker image cho server.

docker build -t shadowsocks-server -f Dockerfile-server .

Sau đó, ta chạy container này lên ở trên server.

docker run -d -p 8488:8488 --name shadowsocks-server shadowsocks-server

Shadowsocks client

Dockerfile cho Shadowsocks client.

FROM ubuntu:22.04
WORKDIR /shadowsocks

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y wget && \
    wget https://github.com/shadowsocks/go-shadowsocks2/releases/download/v0.1.5/shadowsocks2-linux.tgz && \
    tar -xvzf shadowsocks2-linux.tgz

ARG SOCKS5_PORT=1080
EXPOSE ${SOCKS5_PORT}

ENV SHADOWSOCKS_CIPHER=AEAD_CHACHA20_POLY1305
ENV SHADOWSOCKS_SERVER=192.168.1.2 # Change this to your server IP.
ENV SHADOWSOCKS_PASSWORD=password
ENV SHADOWSOCKS_PORT=8488
ENV SOCKS5_PORT=${SOCKS5_PORT}
ENV DNS1=1.1.1.1
ENV DNS2=1.0.0.1

CMD ./shadowsocks2-linux \
    -c "ss://${SHADOWSOCKS_CIPHER}:${SHADOWSOCKS_PASSWORD}@${SHADOWSOCKS_SERVER}:${SHADOWSOCKS_PORT}" \
    -socks :${SOCKS5_PORT} \
    -u \
    -udptun :8053=${DNS1}:53,:8054=${DNS2}:53 \
    -tcptun :8053=${DNS1}:53,:8054=${DNS2}:53

Tạo Docker image cho client.

docker build -t shadowsocks-client -f Dockerfile-client .

Tiếp theo, ta chạy container cho client ở máy localhost.

docker run -d -p 1080:1080 --name shadowsocks-client shadowsocks-client