技術 約5分で読めます

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-cfbchacha20 が主流だったが、現在は以下を推奨:

  • 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規格によるつながりやすさの比較


いま日本が中国と関係が悪化してるから出したんじゃないよ?
絶対に違うからね?

参考