VPN이 작동하지 않는 환경에서 제한없이 웹을 사용하기 위해 프록시 서버를 구축하고 싶었다. 보안을 위해 하는 작업인만큼 사용자 인증이 가능한 Socks5 서버를 목표로 했다. 하지만 프록시 서버 그 중에서도 Socks5에 대한 정보는 적었다. Arch Linux에서 작동하는 것은 더더욱 찾기 어려웠다.

물론 서버 프로그램을 설치하지 않아도 SSH Tunnel을 이용하여 Socks 프로토콜을 사용할 수 있다. 하지만 내 환경에선 22포트가 막혀있었고, 따라서 PuTTY등의 방법으로 SSH 환경에 접속할 수 없었다.

여러 프로그램을 시도했다. SS5, Dante, Srelay 등 Socks5를 지원하는 모든 프로그램에 도전했다. 하지만 좋은 결과를 얻진 못했다. 설정도 복잡했고 일단 제대로 작동하지 않았다. 그러다 찾은 프로그램이 3proxy였다. 설정 파일도 단순했고 일단 작동이 가능해보였다.

AUR에서 해당 패키지를 clone하고 makepkg로 설치했다. 그리고 3proxy의 설정 파일을 수정했다.

$ cat /etc/3proxy/3proxy.cfg

# Starting 3proxy as a service/daemon
daemon

# DNS Servers to resolve domains and for the local DNS cache
# that providers faster resolution for cached entries
nserver 8.8.8.8
nserver 8.8.4.4
nscache 65536

# Authentication
# CL = Clear Text, CR = Encrypted Passswords (MD5)
# Add MD5 users with MD5 passwords with "" (see below)
# users "user:CR:$1$lFDGlder$pLRb4cU2D7GAT58YQvY49."
users {username}:CL:{password}

# Logging
log /var/log/3proxy/3proxy.log D
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotate 30

# Auth type
# auth strong = username & password
auth strong

# Binding address
external 0.0.0.0
internal 0.0.0.0

# SOCKS5
auth strong
flush
allow {username}
maxconn 384
socks -p{8080}

Arch Linux의 경우 일반적으로 포트가 모두 닫혀있기 때문에 iptables로 열어줘야 사용이 가능하다.

# iptables에 INPUT 명령어를 설정한다.
$ iptables -I INPUT -p {tcp/udp} --dport {8080} -j ACCEPT

# iptables에 제대로 등록되었는지 확인한다. ACCEPT 항목이 있으면 제대로 된 것이다.
$ iptables --list

마지막으로 부트시 자동으로 실행하기 위해 서비스 파일을 만든다.

# 3proxy.service 파일을 만든다.
$ cat /etc/systemd/system/3proxy.service

[Unit]
Description=3proxy Proxy Server
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/3proxy /etc/3proxy/3proxy.cfg

[Install]
WantedBy=multi-user.target

# 3proxy를 설정한다.
$ systemctl enable 3proxy.service
$ systemctl start 3proxy.service

# 제대로 작동하는지 확인한다.
$ ps aux | grep 3proxy

VPN에 비하면 속도가 빠른 편은 아니지만 나름 만족할 만한 성능을 보여주기에 만족한다.