OpenConnect(ocserv)サーバーの構築メモ
ShadowSocks、V2Ray、SoftEther、WireGuard に続いて、OpenConnect についてもメモが出てきたのでまとめておく。
OpenConnect とは
OpenConnect は Cisco AnyConnect SSL VPN のオープンソース互換実装。企業 VPN でよく使われる AnyConnect クライアントがそのまま使える。
他のプロトコルとの違い:
- SSL/TLS ベース: HTTPS トラフィックに見えるので検閲回避に強い
- DTLS サポート: UDP による高速通信も可能
- 企業向け: Cisco AnyConnect クライアントと互換性あり
IKEv2 と混同されがちだが、IKEv2 は IPSec ベースで GFW に検出されやすい。OpenConnect は SSL/TLS ベースなので別物。
サーバー構築手順
CentOS 7 での手順。
インストール
sudo yum install -y ocserv
証明書の準備
Let’s Encrypt(推奨) を使う場合、取得済みの証明書を配置:
cd /etc/ocserv
sudo vi /etc/ocserv/server-cert.pem # fullchain.pem の内容
sudo vi /etc/ocserv/server-key.pem # privkey.pem の内容
注意: 中国向けなら正規の証明書を使うこと。自己署名証明書は GFW に「怪しい TLS」として検出されやすい。
設定ファイルの編集
sudo vi /etc/ocserv/ocserv.conf
主な変更点:
# 認証方式(PAMからファイル認証に変更)
#auth = "pam[gid-min=1000]"
auth = "plain[/etc/ocserv/ocpasswd]"
# 接続上限
max-clients = 0
max-same-clients = 3
# MTU探索を有効化
#try-mtu-discovery = false
try-mtu-discovery = true
# 証明書のパス
#server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem
#server-key = /etc/ssl/private/ssl-cert-snakeoil.key
server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/server-key.pem
# ルーティング(全ルートをコメントアウトしてフルトンネルに)
#route = 10.10.10.0/255.255.255.0
#route = 192.168.0.0/255.255.0.0
#route = fef4:db8:1000:1001::/64
#no-route = 192.168.5.0/255.255.255.0
# Cisco クライアント互換
cisco-client-compat = true
# クライアントに割り当てるIPアドレス
ipv4-network = 192.168.10.0
ipv4-netmask = 255.255.224.0
# DNS
#dns = 192.168.1.2
dns = 1.1.1.1
dns = 8.8.8.8
dns = 8.8.4.4
カーネルパラメータの設定
sudo vi /etc/sysctl.conf
以下を有効化(コメントアウトを解除):
net.ipv4.ip_forward=1
net.ipv4.conf.all.proxy_arp=1
設定を反映:
sysctl -p
ファイアウォールの設定
CentOS 7 では firewalld から iptables に切り替える。
# firewalld を無効化
systemctl stop firewalld
systemctl mask firewalld
# iptables をインストール・有効化
yum install -y iptables-services
systemctl start iptables.service
systemctl enable iptables.service
systemctl start ip6tables.service
systemctl enable ip6tables.service
ルールを追加:
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.10.0/19 -j MASQUERADE
注意: eth0 はサーバーのネットワークインターフェース名に置き換える。
設定を保存:
iptables-save > /etc/sysconfig/iptables
または、/etc/sysconfig/iptables を直接編集:
sudo vi /etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.10.0/19 -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p udp -m udp --dport 443 -j ACCEPT
COMMIT
再起動:
service iptables restart
ユーザーの作成
sudo ocpasswd -c /etc/ocserv/ocpasswd ユーザー名
パスワードを2回入力する。
サービスの起動
# ソケットを停止(手動起動の場合)
sudo systemctl stop ocserv.socket
# 手動起動
sudo ocserv -c /etc/ocserv/ocserv.conf
または systemd で管理:
sudo systemctl enable ocserv
sudo systemctl start ocserv
ユーザー管理
状態確認
sudo occtl show status
sudo occtl show users
ユーザー操作
# ロック
sudo ocpasswd -c /etc/ocserv/ocpasswd -l ユーザー名
# アンロック
sudo ocpasswd -c /etc/ocserv/ocpasswd -u ユーザー名
# 削除
sudo ocpasswd -c /etc/ocserv/ocpasswd -d ユーザー名
一括ユーザー登録(expect使用)
大量のユーザーを登録する場合、expect スクリプトが便利。
yum install -y expect
ex.exp を作成:
#!/usr/bin/expect
set Id [lindex $argv 0]
set pw [lindex $argv 1]
spawn ocpasswd -c /etc/ocserv/ocpasswd ${Id}
expect {
"Enter password:" {
send "${pw}\n"
}
}
expect {
"password:" {
send "${pw}\n"
}
}
interact
exit 0
実行:
expect ex.exp ユーザー名 パスワード
自己署名証明書の生成(非推奨)
Let’s Encrypt が使えない環境向け。中国からの接続には正規証明書を推奨。
cd /etc/ocserv
CA テンプレート作成:
sudo vi ca.tmpl
cn = "VPN CA"
organization = "example.com"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
CA 証明書生成:
sudo certtool --generate-privkey --outfile ca-key.pem
sudo certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
サーバー証明書テンプレート作成:
sudo vi server.tmpl
cn = "vpn.example.com"
organization = "example.com"
expiration_days = 3650
signing_key
encryption_key
tls_www_server
サーバー証明書生成:
sudo certtool --generate-privkey --outfile server-key.pem
sudo certtool --generate-certificate --load-privkey server-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template server.tmpl --outfile server-cert.pem
クライアント接続
Cisco AnyConnect
公式の Cisco AnyConnect クライアントがそのまま使える。
- Windows / macOS / Linux: Cisco AnyConnect
- iOS / Android: App Store / Google Play から「Cisco AnyConnect」をインストール
接続先にサーバーのドメイン名を入力し、ユーザー名・パスワードで認証。
OpenConnect クライアント
オープンソースのクライアントも使用可能。
# Ubuntu / Debian
sudo apt install openconnect
# 接続
sudo openconnect vpn.example.com
2025年現在の推奨設定
証明書は Let’s Encrypt 必須
自己署名証明書は GFW に検出されやすい。正規の証明書を使うことで、普通の HTTPS サイトと見分けがつかなくなる。
DTLS の無効化を検討
UDP トラフィック(DTLS)は検出されやすい場合がある。純粋な TLS のみで運用する場合は ocserv.conf で以下を設定:
udp-port = 0
ocserv のバージョン
CentOS 7 の yum リポジトリにあるバージョンは古い可能性がある。最新版が必要な場合はソースからビルド。
→ 続き: IKEv2(strongSwan)サーバーの構築メモ
→ まとめ: 対中国通信 VPN規格によるつながりやすさの比較