ShadowSocksサーバーの構築メモ(2025年の補足付き)
昔、在中法人向けの通信サービスをやっていた時にShadowSocksサーバーを構築した。当時のメモが出てきたので、現在の状況と合わせてまとめておく。
ShadowSocksとは
ShadowSocksは2012年に中国人プログラマー「clowwindy」が開発したSOCKS5プロキシ。主に中国のインターネット検閲(GFW: Great Firewall)を回避するために使われる。
世間では「ShadowSocks VPN」とか「中国用VPN」と呼ばれがちだが、厳密にはVPNではなくプロキシ。わかってる、わかってるんだけど伝わりやすさ優先でVPNって言っちゃうやつ。
VPNとの違い:
- VPN: 全トラフィックを暗号化トンネル経由にする
- ShadowSocks: 特定のアプリやブラウザだけプロキシ経由にできる。軽量で高速
2019年頃から中国でShadowSocksの検出・規制が本格化し、現在はV2RayやTrojanといった後継プロトコルも登場している。
サーバー構築手順
以下はCentOS 7での手順。当時はConoHaのVPSを使用していた。
インストール
teddysunのインストールスクリプトを使用する。
wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
chmod +x shadowsocks.sh
./shadowsocks.sh 2>&1 | tee shadowsocks.log
インストール中にパスワード、ポート、暗号化方式を聞かれる。
サービス管理
# 起動
/etc/init.d/shadowsocks start
# 停止
/etc/init.d/shadowsocks stop
# 再起動
/etc/init.d/shadowsocks restart
# ステータス確認
/etc/init.d/shadowsocks status
ファイアウォールの設定
ConoHaはデフォルトでSELinuxとiptablesが無効。firewalldが有効な場合は停止する。
systemctl stop firewalld
systemctl disable firewalld
または、ShadowSocksで使用するポートだけ開ける。
firewall-cmd --permanent --add-port=8388/tcp
firewall-cmd --permanent --add-port=8388/udp
firewall-cmd --reload
DNS設定
名前解決の問題を避けるため、Google Public DNSを追加。
vi /etc/resolv.conf
以下を追加:
nameserver 8.8.8.8
nameserver 8.8.4.4
ファイルディスクリプタの上限設定
同時接続数を増やすための設定。
vi /etc/security/limits.conf
以下を追加:
root soft nofile 51200
root hard nofile 51200
カーネルパラメータの最適化
vi /etc/sysctl.conf
以下を追加:
# max open files
fs.file-max = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# max processor input queue
net.core.netdev_max_backlog = 250000
# max backlog
net.core.somaxconn = 4096
# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 0
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 8192
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# TCP Fast Open
net.ipv4.tcp_fastopen = 3
# TCP memory
net.ipv4.tcp_mem = 25600 51200 102400
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1
# TCP congestion control
net.ipv4.tcp_congestion_control = hybla
設定を反映:
sysctl -p
ログ確認
less -n /var/log/shadowsocks.log
設定ファイル
ShadowSocksの設定ファイルは /etc/shadowsocks.json に保存される。
{
"server": "0.0.0.0",
"server_port": 8388,
"password": "your_password",
"method": "aes-256-gcm",
"timeout": 300
}
複数ユーザーに別々のパスワードを発行したい場合は、同じ /etc/shadowsocks.json を以下のように編集する:
{
"server": "0.0.0.0",
"port_password": {
"8388": "user1_password",
"8389": "user2_password",
"8390": "user3_password"
},
"method": "aes-256-gcm",
"timeout": 300
}
ポートごとにパスワードを分けられるので、誰がどの接続を使っているか管理しやすい。
2025年現在の推奨設定
暗号化方式
当時は aes-256-cfb や chacha20 が主流だったが、現在は以下を推奨:
- AES-256-GCM: 高いセキュリティと速度のバランス。サーバー向け
- ChaCha20-IETF-Poly1305: モバイルデバイスで省電力。ARM系CPU向け
以下の古い暗号化方式は使用しない:
- RC4系(rc4-md5など)
- DES系
- CFBモード(aes-256-cfbなど)- 脆弱性あり
カーネルパラメータの改善案
上で紹介した sysctl.conf の設定は当時のもので普通に動いていたが、今ならこうした方がいいっぽい:
tcp_tw_reuse を有効化
# 元の設定
net.ipv4.tcp_tw_reuse = 0
# 推奨
net.ipv4.tcp_tw_reuse = 1
timewaitソケットの再利用。0でも動くが1の方が効率的。なお tcp_tw_recycle は0のままにしておくこと(公式Wikiで「DO NOT ENABLE」と警告されている)。
輻輳制御を BBR に変更
# 元の設定
net.ipv4.tcp_congestion_control = hybla
# 推奨(Linux 4.9以降)
net.ipv4.tcp_congestion_control = bbr
hybla は衛星通信など超高遅延環境向けで、中国-日本間でも妥当な選択だった。ただ今はGoogleが開発した BBR の方がパフォーマンスが良い。Linux 4.9以降で利用可能。
注意点
- 2019年以降、中国ではDPI(Deep Packet Inspection)によるShadowSocksの検出が行われている
- サーバーのIPがブロックされる可能性がある
- より検出されにくいプロトコル(V2Ray、Trojan、Xray)への移行も検討の価値あり
後継プロトコル
ShadowSocksをベースに、より検閲回避に特化したプロトコルが登場している:
- V2Ray / Xray: 複数のプロトコルをサポート。WebSocketやgRPCでHTTPSに偽装可能
- Trojan: HTTPSトラフィックに完全に偽装する設計
これらは設定が複雑になるが、規制が厳しい環境では有効な選択肢。
→ 続き: V2Ray(WebSocket+TLS)サーバーの構築メモ
→ まとめ: 対中国通信 VPN規格によるつながりやすさの比較
いま日本が中国と関係が悪化してるから出したんじゃないよ?
絶対に違うからね?