技術 約6分で読めます

OpenConnect(ocserv)サーバーの構築メモ

ShadowSocksV2RaySoftEtherWireGuard に続いて、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規格によるつながりやすさの比較

参考