このチュートリアルでは、Ubuntu20.04にOpenConnectVPNサーバーをインストールして独自のVPNサーバーを実行する方法を説明します。 OpenConnect VPNサーバー、別名 ocserv は、Cisco AnyConnnect VPNプロトコルのオープンソース実装であり、企業や大学で広く使用されています。 AnyConnectは、SSLベースのVPNプロトコルであり、個々のユーザーがリモートネットワークに接続できるようにします。
注 :このチュートリアルは、Ubuntu20.10およびUbuntu21.04でも機能します。
独自のVPNサーバーを設定する理由
- あなたはVPNサービスプロバイダーまたはシステム管理者である可能性があり、独自のVPNサーバーをセットアップする必要があります。
- VPNサービスプロバイダーのノーログポリシーを信頼していないため、セルフホストルートを使用します。
- VPNを使用して、ネットワークセキュリティポリシーを実装できます。たとえば、独自の電子メールサーバーを実行している場合、ファイアウォールにIPアドレスホワイトリストを作成することにより、VPNサーバーのIPアドレスからのみログインするようにユーザーに要求できます。したがって、メールサーバーはハッキング活動を防ぐために強化されています。
- VPNサーバーがどのように機能するかを知りたいだけかもしれません。
OpenConnectVPNサーバーの機能
- 軽量で高速。私のテストでは、OpenConnectVPNを使用してYouTube4Kビデオを視聴できます。私の国(中国)ではYouTubeがブロックされています。
- LinuxおよびほとんどのBSDサーバーで実行されます。
- CiscoAnyConnectクライアントと互換性があります
- Linux、MacOS、Windows、OpenWRT用のOpenConnectクライアントソフトウェアがあります。 AndroidおよびiOSの場合、CiscoAnyConnectクライアントを使用できます。
- パスワード認証と証明書認証をサポートします
- RADIUSアカウンティングをサポートします。
- 仮想ホスティング(複数のドメイン)をサポートします。
- セットアップが簡単
特に、他のVPNテクノロジーと比較して、エンドユーザーがOpenConnectVPNを使用するのが非常に簡単で便利であるという事実が気に入っています。 Linuxディストリビューションをコンピューターにインストールして、Webサイトのブロックをすばやく解除したり、IPアドレスを非表示にしたりする場合は常に、OpenConnectクライアントをインストールし、2行のコマンドでサーバーに接続します。
sudo apt install openconnect sudo openconnect -b vpn.mydomain.com
Fedora、RHEL、CentOS、Arch Linux、OpenSUSE用のOpenConnectVPNクライアントもあります。パッケージマネージャーを使用して簡単にインストールできます。
sudo dnf install openconnect sudo yum install openconnect sudo pacman -S openconnect
要件
このチュートリアルに従うには、ブロックされたWebサイトに自由にアクセスできるVPS(仮想プライベートサーバー)が必要です(国外またはインターネットフィルタリングシステム)。次の機能を備えたカマテラVPSをお勧めします:
- 30日間の無料トライアル。
- 月額4ドル(1 GB RAM)から
- 高性能KVMベースのVPS
- 米国、カナダ、英国、ドイツ、オランダ、香港、イスリアルを含む世界中の9つのデータセンター。
以下にリンクされているチュートリアルに従って、KamateraでLinuxVPSサーバーを作成してください。
- カマテラでLinuxVPSサーバーを作成する方法
Ubuntu 20.04を実行しているVPSを入手したら、以下の手順に従ってください。
OpenConnect VPNでHTTPSを有効にするには、ドメイン名も必要です。 NameCheapからドメイン名を登録したのは、価格が安く、whoisのプライバシー保護が一生無料になるからです。
ステップ1:Ubuntu20.04にOpenConnectVPNサーバーをインストールする
Ubuntu20.04サーバーにログインします。次に、apt
を使用します ocserv
をインストールするには デフォルトのUbuntuリポジトリからのパッケージ。
sudo apt update sudo apt install ocserv
インストールすると、OpenConnectVPNサーバーが自動的に起動します。次のコマンドでステータスを確認できます:
systemctl status ocserv
サンプル出力:
● ocserv.service - OpenConnect SSL VPN server Loaded: loaded (/lib/systemd/system/ocserv.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2020-04-12 19:57:08 HKT; 12s ago Docs: man:ocserv(8) Main PID: 216409 (ocserv-main) Tasks: 2 (limit: 9451) Memory: 1.6M CGroup: /system.slice/ocserv.service ├─216409 ocserv-main └─216429 ocserv-sm
ヒント:上記のコマンドがすぐに終了しない場合は、Qキーを押して端末の制御を取り戻すことができます。
実行されていない場合は、次のコマンドで開始できます:
sudo systemctl start ocserv
デフォルトでは、OpenConnect VPNサーバーはTCPおよびUDPポート443でリッスンします。Webサーバーで使用されている場合、VPNサーバーはおそらく起動に失敗します。 OpenConnectVPN構成ファイルでポートを変更する方法については後で説明します。
サーバーでファイアウォールが実行されている場合は、ポート80と443を開く必要があります。たとえば、UFWを使用している場合は、次のコマンドを実行します。
sudo ufw allow 80,443/tcp
ステップ2:Let’s Encrypt Client(Certbot)をUbuntu20.04サーバーにインストールする
gnutls-bin
ocserv
と一緒にインストールされたパッケージ 独自のCAおよびサーバー証明書を作成するためのツールを提供しますが、Let’sEncrypt証明書を取得してインストールします。 Let’s Encrypt証明書を使用する利点は、VPNクライアントソフトウェアによって無料でセットアップが簡単で信頼できることです。
次のコマンドを実行して、デフォルトのUbuntuリポジトリからLet’s Encryptクライアント(certbot)をインストールします。
sudo apt install certbot
バージョン番号を確認するには、
を実行しますcertbot --version
サンプル出力:
certbot 0.40.0
ステップ3:Let’sEncryptから信頼できるTLS証明書を取得する
standalone
の使用をお勧めします またはwebroot
ocservのTLS証明書を取得するためのプラグイン。
スタンドアロンプラグイン
Ubuntu 20.04サーバーで実行されているWebサーバーがなく、OpenConnect VPNサーバーでポート443を使用する場合は、スタンドアロンプラグインを使用して、Let’sEncryptからTLS証明書を取得できます。次のコマンドを実行します。ドメイン名にAレコードを設定することを忘れないでください。
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d vpn.example.com
場所:
-
certonly
:証明書を取得しますが、インストールしないでください。 --standalone
:スタンドアロンプラグインを使用して証明書を取得します-
--preferred-challenges http
:http-01チャレンジを実行して、ポート80を使用するドメインを検証します。 -
--agree-tos
:Let'sEncryptの利用規約に同意します。 --email
:メールアドレスはアカウントの登録と復旧に使用されます。-
-d
:ドメイン名を指定してください。
次のスクリーンショットからわかるように、証明書を正常に取得しました。
webrootプラグインの使用
Ubuntu 20.04サーバーにポート80と443でリッスンするWebサーバーがある場合、webrootプラグインはほとんどすべてのWebサーバーで機能し、インストールする必要がないため、webrootプラグインを使用して証明書を取得することをお勧めします。 Webサーバーの証明書。
まず、vpn.example.comの仮想ホストを作成する必要があります。
Apache
Apacheを使用している場合は、
sudo nano /etc/apache2/sites-available/vpn.example.com.conf
そして、次の行をファイルに貼り付けます。
<VirtualHost *:80> ServerName vpn.example.com DocumentRoot /var/www/ocserv </VirtualHost>
ファイルを保存して閉じます。次に、Webルートディレクトリを作成します。
sudo mkdir /var/www/ocserv
www-data(Apacheユーザー)をWebルートの所有者として設定します。
sudo chown www-data:www-data /var/www/ocserv -R
この仮想ホストを有効にします。
sudo a2ensite vpn.example.com
変更を有効にするためにApacheをリロードします。
sudo systemctl reload apache2
仮想ホストを作成して有効にしたら、次のコマンドを実行して、webrootプラグインを使用してLet’sEncrypt証明書を取得します。
sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv
Nginx
Nginxを使用している場合は、
sudo nano /etc/nginx/conf.d/vpn.example.com.conf
次の行をファイルに貼り付けます。
server { listen 80; server_name vpn.example.com; root /var/www/ocserv/; location ~ /.well-known/acme-challenge { allow all; } }
ファイルを保存して閉じます。次に、Webルートディレクトリを作成します。
sudo mkdir -p /var/www/ocserv
www-data(Nginxユーザー)をWebルートの所有者として設定します。
sudo chown www-data:www-data /var/www/ocserv -R
変更を有効にするためにNginxをリロードします。
sudo systemctl reload nginx
仮想ホストを作成して有効にしたら、次のコマンドを実行して、webrootプラグインを使用してLet’sEncrypt証明書を取得します。
sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv
ステップ4:OpenConnectVPNサーバー構成ファイルを編集する
ocservメイン構成ファイルを編集します。
sudo nano /etc/ocserv/ocserv.conf
まず、パスワード認証を構成する必要があります。デフォルトでは、PAM(Pluggable Authentication Modules)によるパスワード認証が有効になっています。これにより、Ubuntuシステムアカウントを使用してVPNクライアントからログインできます。この動作は、次の行をコメントアウトすることで無効にできます。
auth = "pam[gid-min=1000]"
ユーザーがシステムアカウントではなく別のVPNアカウントを使用してログインできるようにする場合は、次の行を追加して、パスワードファイルによるパスワード認証を有効にする必要があります。
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
この構成ファイルの編集が終了したら、ocpasswd
の使用方法を確認します。 /etc/ocserv/ocpasswd
を生成するためのツール ファイル。ユーザー名とエンコードされたパスワードのリストが含まれています。
注 :Ocservはクライアント証明書認証をサポートしていますが、Let’sEncryptはクライアント証明書を発行しません。クライアント証明書を発行するには、独自のCAを設定する必要があります。
次に、ocservでTCPおよびUDPポート443を使用したくない場合は、次の2行を見つけて、ポート番号を変更します。それ以外の場合はそのままにしておきます。
tcp-port = 443 udp-port = 443
次に、次の2行を見つけます。それらを変更する必要があります。
server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem server-key = /etc/ssl/private/ssl-cert-snakeoil.key
デフォルト設定をLet’sEncryptサーバー証明書とサーバーキーファイルのパスに置き換えます。
server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem
次に、クライアントの最大数を設定します。デフォルトは128です。無制限の場合はゼロに設定します。
max-clients = 128
ユーザーが同時にログインできるデバイスの数を設定します。デフォルトは2です。無制限の場合はゼロに設定します。
max-same-clients = 2
デフォルトでは、キープアライブパケットは300秒(5分)ごとに送信されます。 VPN接続のドロップアウトの可能性を減らすために、短い時間(30秒)を使用することを好みます。
keepalive = 30
次に、次の行を見つけます。 false
を変更します true
に VPNのパフォーマンスを最適化できるMTUディスカバリーを有効にします。
try-mtu-discovery = false
次の2つのパラメータを使用して、クライアントが切断される前にアイドル状態を維持できる時間を設定できます。クライアントが無期限に接続されたままになるようにしたい場合は、これら2つのパラメーターをコメントアウトしてください。
idle-timeout=1200 mobile-idle-timeout=1800
その後、デフォルトのドメインをvpn.example.comに設定します。
default-domain = vpn.example.com
IPv4ネットワーク構成はデフォルトで以下のとおりです。多くのホームルーターもIPv4ネットワーク範囲を192.168.1.0/24
に設定しているため、これにより問題が発生します。 。
ipv4-network = 192.168.1.0 ipv4-netmask = 255.255.255.0
別のプライベートIPアドレス範囲(10.10.10.0/24)を使用して、IPアドレスの衝突を回避できるため、ipv4-network
の値を変更します。 に
ipv4-network = 10.10.10.0
次の行のコメントを解除して、VPN経由ですべてのDNSクエリをトンネリングします。
tunnel-all-dns = true
デフォルトのDNSリゾルバーアドレスは次のとおりです。これで問題ありません。
dns = 8.8.8.8 dns = 1.1.1.1
注 :VPNサービスプロバイダーの場合は、同じサーバーで独自のDNSリゾルバーを実行することをお勧めします。同じサーバーで実行されているDNSリゾルバーがある場合は、DNSを次のように指定します
dns = 10.10.10.1
10.10.10.1は、VPNLAN内のOpenConnectVPNサーバーのIPアドレスです。これにより、VPNサーバーとDNSリゾルバー間のネットワーク遅延が排除されるため、クライアントのDNSルックアップが少し高速化されます。
次に、すべてのルートパラメータをコメントアウトします(次の行の先頭に#記号を追加します)。これにより、サーバーがクライアントのデフォルトゲートウェイとして設定されます。
#route = 10.0.0.0/8 #route = 172.16.0.0/12 #route = 192.168.0.0/16 #route = fd00::/8 #route = default #no-route = 192.168.5.0/255.255.255.0
ファイルを保存して閉じます。次に、VPNサーバーを再起動して、変更を有効にします。
sudo systemctl restart ocserv
ステップ5:VPNアカウントを作成する
次に、ocpasswdツールを使用してVPNアカウントを生成します。
sudo ocpasswd -c /etc/ocserv/ocpasswd username
ユーザーのパスワードを設定するように求められ、情報は/etc/ocserv/ocpasswd
に保存されます。 ファイル。パスワードをリセットするには、上記のコマンドをもう一度実行します。
ステップ6:IP転送を有効にする
VPNサーバーがVPNクライアントとインターネット間でパケットをルーティングするには、IP転送を有効にする必要があります。 sysctl.conf
を編集します ファイル。
sudo nano /etc/sysctl.conf
このファイルの最後に次の行を追加します。
net.ipv4.ip_forward = 1
ファイルを保存して閉じます。次に、以下のコマンドで変更を適用します。 -p オプションは、 /etc/sysctl.confからsysctl設定をロードします ファイル。このコマンドは、システムを再起動しても変更を保持します。
sudo sysctl -p
ステップ7:ファイアウォールでIPマスカレードを構成する
サーバーがVPNクライアントの仮想ルーターになるように、サーバーファイアウォールでIPマスカレードを設定する必要があります。 iptablesファイアウォールのフロントエンドであるUFWを使用します。以下を使用してUbuntuにUFWをインストールします:
sudo apt install ufw
まず、SSHトラフィックを許可する必要があります。
sudo ufw allow 22/tcp
次に、サーバーのメインネットワークインターフェースの名前を見つけます。
ip addr
ご覧のとおり、ens3
という名前です。 私のUbuntuサーバーで。
IPマスカレードを設定するには、UFW設定ファイルにiptablesコマンドを追加する必要があります。
sudo nano /etc/ufw/before.rules
デフォルトでは、filter
にはいくつかのルールがあります テーブル。このファイルの最後に次の行を追加します。 ens3
を置き換えます 独自のネットワークインターフェイス名を使用します。
# NAT table rules *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.10.10.0/24 -o ens3 -j MASQUERADE # End each table with the 'COMMIT' line or these rules won't be processed COMMIT
Nanoテキストエディタでは、Ctrl+W
を押すと、ファイルの最後に移動できます。 、次にCtrl+V
を押します 。
上記の行が追加されます( -A ) POSTROOUTINGの最後までのルール natのチェーン テーブル。仮想プライベートネットワークをインターネットにリンクします。また、ネットワークを外界から隠します。そのため、インターネットはVPNサーバーのIPしか見ることができませんが、ホームルーターがプライベートホームネットワークを隠すように、VPNクライアントのIPを見ることができません。
デフォルトでは、UFWはパケット転送を禁止しています。プライベートネットワークの転送を許可できます。 ufw-before-forward
を見つけます このファイルにチェーンを追加し、次の3行を追加します。これは、送信元IPまたは宛先IPが10.10.10.0/24
にある場合にパケット転送を受け入れます。 範囲。
# allow forwarding for trusted network -A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT -A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT
ファイルを保存して閉じます。次に、UFWを有効にします。
sudo ufw enable
以前にUFWを有効にしたことがある場合は、systemctlを使用してUFWを再起動できます。
sudo systemctl restart ufw
ここで、次のコマンドを使用して、NATテーブルのPOSTROUTINGチェーンにルールをリストするとします。
sudo iptables -t nat -L POSTROUTING
仮面舞踏会のルールを見ることができます。
UFWがファイアウォールルールを処理するのに時間がかかる場合があります。マスカレードルールが表示されない場合は、UFWを再起動します(sudo systemctl restart ufw
。
ステップ8:ファイアウォールでポート443を開く
次のコマンドを実行して、TCPおよびUDPポート443を開きます。ocservに別のポートを構成した場合は、443を構成済みのポートに変更します。
sudo ufw allow 443/tcp sudo ufw allow 443/udp
これで、OpenConnectVPNサーバーはクライアント接続を受け入れる準備ができました。
ローカルDNSリゾルバーを実行している場合
ローカルDNSリゾルバーを実行している場合、VPNクライアントのDNSサーバーとして10.10.10.1を指定した場合は、VPNクライアントが次のUFWルールを使用してポート53に接続できるようにする必要があります。
sudo ufw insert 1 allow in from 10.10.10.0/24
また、BIND DNSサーバーの構成ファイル(/etc/bind/named.conf.options
)を編集する必要があります。 )VPNクライアントが以下のような再帰DNSクエリを送信できるようにします。
allow-recursion { 127.0.0.1; 10.10.10.0/24; };
次に、BINDを再起動します。
sudo systemctl restart named
Ubuntu20.04デスクトップにOpenConnectVPNクライアントをインストールして使用する方法
次のコマンドを実行して、OpenConnectVPNコマンドラインクライアントをUbuntuデスクトップにインストールします。
sudo apt install openconnect
以下のようにコマンドラインからVPNに接続できます。 -b
フラグは、接続が確立された後、バックグラウンドで実行されます。
sudo openconnect -b vpn.example.com:port-number
VPNユーザー名とパスワードの入力を求められます。接続が正常に確立されると、次のメッセージが表示されます。
Got CONNECT response: HTTP/1.1 200 CONNECTED CSTP connected. DPD 90, Keepalive 32400 Connected tun0 as 192.168.1.139, using SSL Established DTLS connection (using GnuTLS). Ciphersuite (DTLS1.2)-(RSA)-(AES-256-GCM).
接続を停止するには、次のコマンドを実行します:
sudo pkill openconnect
クライアントを非対話的に実行するには、次の構文を使用します。
echo -n password | sudo openconnect -b vpn.example.com -u username --passwd-on-stdin
Network Managerを使用してVPN接続を管理する場合は、これらのパッケージもインストールする必要があります。
sudo apt install network-manager-openconnect network-manager-openconnect-gnome
VPNサーバーに正常に接続しても、パブリックIPアドレスが変更されない場合は、IP転送またはIPマスカレードが機能していないことが原因です。 iptablesコマンドに(間違ったIPアドレス範囲を使用して)タイプミスがあったため、コンピューターがインターネットを閲覧できなくなったことがあります。
次のエラーが発生した場合は、ocservでUDPポートを無効にする必要があります。これについては、後で速度の最適化で説明します。 セクション。
DTLS handshake failed: Resource temporarily unavailable, try again
次のエラーが発生した場合は、VPNアカウントのパスワードが間違っている可能性があります。
fgets (stdin): Inappropriate ioctl for device
システム起動時の自動接続
OpenConnect VPNクライアントが起動時にサーバーに自動的に接続できるようにするために、systemdサービスユニットを作成できます。
sudo nano /etc/systemd/system/openconnect.service
次の行をファイルに追加します。赤いテキストを置き換えます。
[Unit] Description=OpenConnect VPN Client After=network-online.target systemd-resolved.service Wants=network-online.target [Service] Type=simple ExecStart=/bin/bash -c '/bin/echo -n password | /usr/sbin/openconnect vpn.example.com -u username --passwd-on-stdin' KillSignal=SIGINT Restart=always RestartSec=2 [Install] WantedBy=multi-user.target
ファイルを保存して閉じます。次に、このサービスを有効にして、起動時に開始されるようにします。
sudo systemctl enable openconnect.service
ファイルの内容の説明:
-
After=network-online.target systemd-resolved.service
およびWants=network-online.target
ネットワークが起動した後にこのサービスを実行します。openconnect.service
が必要ですsystemd-resolved.service
の後に開始します これにより、OpenConnectによって設定されたDNSサーバーアドレスがsystemd-resolved.service
によって上書きされないようになります。 。 - 実際には、このサービスはネットワークが起動する前でも実行できます。
Restart=always
を追加します およびRestartSec=2
このサービスが失敗した場合、2秒後にこのサービスを再起動します。 - Systemdはパイプのリダイレクトを認識しないため、
ExecStart
ディレクティブでは、コマンドを一重引用符で囲み、Bashシェルで実行します。 - OpenConnect VPNクライアントはバックグラウンドで実行されるsystemdサービスとして実行されるため、
-b
を追加する必要はありません。openconnect
へのフラグ コマンド。 -
KillSignal
ディレクティブはSystemdにSIGINT
を送信するように指示しますsystemctl stop openconnect
のシグナル コマンドが発行されます。これにより、セッションがログオフされ、DNSサーバー設定とLinuxカーネルルーティングテーブルが復元され、クリーンシャットダウンが実行されます。
このSystemdサービスをすぐに開始するには、
を実行しますsudo systemctl start openconnect
このSystemdサービスを停止するには、
を実行しますsudo systemctl stop openconnect
一時停止から再開するときにOpenConnectクライアントを自動的に再起動する方法
Ubuntuデスクトップが一時停止状態になると、OpenConnectクライアントはVPNサーバーへの接続を失います。一時停止から再開するときに自動的に再起動するには、別のsystemdサービスユニットを作成する必要があります。
sudo nano /etc/systemd/system/openconnect-restart.service
ファイルに次の行を追加します。
[Unit] Description=Restart OpenConnect client when resuming from suspend After=suspend.target [Service] Type=simple ExecStart=/bin/systemctl --no-block restart openconnect.service [Install] WantedBy=suspend.target>
ファイルを保存して閉じます。次に、このサービスを有効にします。
sudo systemctl enable openconnect-restart.service
自動-VPN接続が切断されたときに再起動
他の理由でVPN接続が切断されることがありました。次のコマンドを実行して、VPNクライアントがVPNサーバーのプライベートIPアドレス(10.10.10.1)にpingを実行できるかどうかを確認できます。 pingが失敗した場合は、右側のコマンドが実行され、VPNクライアントが再起動されます。 ||
BashのOR演算子です。左側のコマンドがエラーを返した場合にのみ、右側のコマンドを実行します。
ping -c9 10.10.10.1 || systemctl restart openconnect
pingは9回、つまり9秒間実行されます。 無限ループを使用できます コマンド全体を永久に実行するためにBashシェルで。 Ctrl+C
を押します それを止めるために。
for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done
これで、このタスク用のsystemdサービスを作成できます。
sudo nano /etc/systemd/system/openconnect-check.service
このファイルに次の行を追加します。このサービスはopenconnect.service
の後に実行するように指定します 。
[Unit] Description=OpenConnect VPN Connectivity Checker After=openconnect.service [Service] Type=simple ExecStart=/bin/bash -c 'for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done' [Install] WantedBy=multi-user.target
ファイルを保存して閉じます。次に、このサービスを開始します。
sudo systemctl start openconnect-check
起動時に自動起動を有効にします。
sudo systemctl enable openconnect-check
このサービスが開始されると、pingコマンドは永久に実行されます。 VPN接続が切断されると、openconnect.service
が自動的に再起動します 。
WindowsおよびmacOS用のOpenConnectGUIクライアント
OpenConnectGUIGithubページからダウンロードできます。
速度
OpenConnectVPNはかなり高速です。 YouTubeで4k動画を視聴するために使用できます。ご覧のとおり、接続速度は 63356 Kbpsです。 、これは 61 Mbit / sに変換されます 。
そして、これがspeedtest.netでのテスト結果です。
速度の最適化
OpenConnectは、デフォルトでTLS over UDPプロトコル(DTLS)を使用して高速化を実現しますが、UDPは信頼性の高い伝送を提供できません。 TCPはUDPよりも低速ですが、信頼性の高い伝送を提供できます。最適化のヒントの1つは、DTLSを無効にし、標準TLS(TCP経由)を使用してから、TCPBBRを有効にしてTCP速度を上げることです。
DTLSを無効にするには、コメントアウトします(#
を追加します) 冒頭の記号)ocserv構成ファイルの次の行。
udp-port = 443
ファイルを保存して閉じます。次に、ocservサービスを再起動します。
sudo systemctl restart ocserv.service
TCP BBRを有効にするには、次のチュートリアルを確認してください。 ocservでDTLSを無効にする必要があることに注意してください。無効にしないと、TCPBBRが機能しません。
- TCPBBRを有効にしてUbuntuネットワークのパフォーマンスを簡単に向上させる方法
私のテストでは、TCPBBRが有効になっている標準のTLSはDTLSの2倍高速です。
速度に影響を与えるもう1つの非常に重要な要素は、ローカルコンピューターとVPNサーバー間の接続がどれだけ良好かということです。中東に住んでいて、VPNサーバーが米国にある場合、速度は遅くなります。お住まいの地域に近いデータセンターを選択してください。
また、CPU負荷の平均を確認してください。 (htop
sudo apt install htop
でインストールできます 。
htop
CPU負荷の平均が1
未満であることを確認してください 。私はかつて3
のCPU負荷平均を持っていました 、VPNクライアントとVPNサーバー間の待ち時間が長くなりました。
Let'sEncrypt証明書の自動更新
rootユーザーのcrontabファイルを編集します。
sudo crontab -e
ファイルの最後に次の行を追加します。新しい証明書とキーファイルを取得するには、VPNサーバーのocservサービスをリロードする必要があります。
@daily certbot renew --quiet && systemctl reload ocserv
トラブルシューティングのヒント
OpenVZ
OpenVZ VPSを使用している場合は、VPSコントロールパネルでTUN仮想ネットワークデバイスが有効になっていることを確認してください。 (Vultr VPSを使用している場合は、KVMベースのVPSを使用しているため、これについて心配する必要はありません。)
ログファイル
問題が発生した場合は、OpenConnectVPNサーバーのログを確認してください。
sudo journalctl -eu ocserv.service
ポート443を別のポートに変更すると、中国のグレートファイアウォールがこのVPN接続をブロックすることがわかりました。
デバッグモード
ocservが/etc/ocserv/ocserv.conf
を読み込めないと言った場合 ファイル、ocservを停止できます。
sudo systemctl stop ocserv
次に、デバッグを有効にしてフォアグラウンドで実行します。
sudo /usr/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf --debug=10
次に、出力により、ocservが機能しない理由の手がかりが得られる可能性があります。
インターネットを閲覧できません
VPNサーバーに正常に接続しているのにインターネットを閲覧できない場合は、IP転送またはIPマスカレードが機能していないことが原因です。私のVPSプロバイダーがかつてプラットフォームのアップグレードを行ったことを覚えています。これにより、メインネットワークインターフェイスの名前がens3
から変更されました。 enp3s0
へ 、そのため、UFWファイル(/etc/ufw/before.rules
)の名前を更新する必要がありました 。
構文エラー
VPN接続を確立しようとしたときに次のエラーが表示される場合は、ocserv構成ファイルに構文エラーがあることが原因である可能性があります。ジャーナルを確認します(sudo journalctl -eu ocserv
)調べる。
Got inappropriate HTTP CONNECT response: HTTP/1.1 401 Cookie is not acceptable
コンピュータを再起動します
VPN接続を確立しようとしたときに次のエラーが表示される場合は、ローカルコンピューターの問題である可能性があります。コンピュータを再起動してみてください。
Server 'vpn.your-domain.com' requested Basic authentication which is disabled by default
TLS接続が正しく終了していません
VPN接続を確立しようとしたときに、クライアントで次のエラーが表示された場合は、
SSL connection failure: The TLS connection was non-properly terminated.
おそらくocserv
を再起動する必要があります VPNサーバー上のサービス。
sudo systemctl restart ocserv
ocserv
を自動的に再起動するcronジョブを作成できます 1日1回午前4時。
sudo crontab -e
次の行を追加します。
0 4 * * * systemctl restart ocserv
ファイルを保存して閉じます。
OpenConnectVPNサーバーとWebサーバーが同時にポート443を使用するようにする
次の記事をお読みください:
- HAProxyを使用して同じボックスでOpenConnectVPNサーバーとApache/Nginxを実行する
ocservでTLS1.0とTLS1.1を無効にする方法
PCI評議会は2018年6月30日にTLS1.0を廃止し、メインストリームのWebブラウザは2020年にTLS1.0とTLS1.1を無効にする予定です。VPNサーバーでも同じことを行う必要があります。メインの構成ファイルを編集します。
sudo nano /etc/ocserv/ocserv.conf
次の行を見つけます:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"
OpenConnectVPNサーバーでTLS1.0およびTLS1.1を無効にするには、-VERS-TLS1.0
を追加するだけです。 および-VERS-TLS1.1
行に。
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1"
ファイルを保存して閉じます。次に、ocservを再起動します。
sudo systemctl restart ocserv
現在、ocservはTLS1.3とTLS1.2のみを受け入れます。 ocservでのTLSパラメータの設定の詳細については、GnuTLS優先度文字列を参照してください。
OpenConnectVPNサーバーでTLS1.0がサポートされているかどうかを確認するには、次のコマンドを実行します。
openssl s_client -connect vpn.your-domain.com:443 -tls1
そしてTLS1.1を確認してください
openssl s_client -connect vpn.your-domain.com:443 -tls1_1
出力に次のメッセージが表示された場合は、TLSバージョンがサポートされていないことを意味します。
New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported
ユーザーごとまたはグループごとの構成
Ocservでは、ユーザーごとおよびグループごとの構成が可能です。この機能を有効にするには、/etc/ocserv/ocserv.conf
の次の2行のコメントを解除します ファイル。
config-per-user = /etc/ocserv/config-per-user/ config-per-group = /etc/ocserv/config-per-group/
ファイルを保存して閉じます。次に、ユーザーごとおよびグループごとの構成ディレクトリを作成します。
sudo mkdir /etc/ocserv/config-per-user/ sudo mkdir /etc/ocserv/config-per-group/
次に、これら2つのディレクトリの下にファイルを作成できます。たとえば、user1
を作成します user1
のカスタム構成を許可するファイル 。
sudo nano /etc/ocserv/config-per-user/user1
group1
を作成することもできます group1
という名前のグループのカスタム構成を許可するファイル 。
sudo nano /etc/ocserv/config-per-group/group1
以下のようなものをファイルに追加して、スプリットトンネリングを有効にすることができます。
route = 10.10.10.0/255.255.255.0 tunnel-all-dns = false dns = 8.8.8.8 dns = 1.1.1.1
場所:
- 最初の行は、
user1
の後を意味します またはgroup1
のユーザー このVPNサーバーに接続し、10.10.10.0/24
へのトラフィックのみ ネットワークはVPNサーバー経由でルーティングされます。 Traffic to other IP addresses are routed via the original gateway. - The second line disables tunneling DNS queries.
- The third and fourth line set DNS servers for VPN clients.
I use this trick to allow my another VPS (virtual private server) to connect to this VPN server without disrupting normal traffic, so the TUN device (vpns0) of my VPN server is always turned on, which means my VPN server will always have the private IP address 10.10.10.1.
ファイルを保存して閉じます。 Restart ocserv
for the changes to take effect.
sudo systemctl restart ocserv
Note that if you enable IPv6 in ocserv, then you also need to add the IPv6 network range in order to use split tunneling.
route = 10.10.10.0/255.255.255.0 route = fda9:4efe:7e3b:03ea::/48 tunnel-all-dns = false dns = 8.8.8.8 dns = 1.1.1.1
If you want to exclude an IP address from the default route, then use no-route
。
no-route = 12.34.56.78/32
This means all other traffic will go through the VPN tunnel except traffic to IP 12.34.56.78. route and no-route paramater accept both netmask notation (10.10.10.0/255.255.255.0) and CIDR notation (12.34.56.78/32)
If you see the following error after enabling split tunneling, it’s probably because you didn’t use the netmask or CIDR notation.
could not parse proxy protocol header; discarding connection
Split Tunneling by Country
Let’s say you only want traffic to foreign counties to be tunneled by the VPN. Traffic to your own country should use the normal route. You can use the no-route
directive in ocserv configuration file to achieve this.
First, you need to download the IP range for your country by going to this web page:https://www.ip2location.com/free/visitor-blocker, which allows you to download the IP address range in CIDR format.
Save the IP range in a text file ip2location.txt
, and run the following command in your Linux terminal to add the no-route =
directive to the beginning of each line.
sed 's/^/no-route = /' -i ip2localtion.txt
Now open the file in a text editor and copy all the lines in it. We need to add these lines in the ocserv configuration file. If there are too many lines, you can and add these lines to the the per-user configuration file.
sudo nano /etc/ocserv/config-per-user/user1
You can also add them to the per-group configuration file, then add users to the group.
Restart ocserv for the changes to take effect.
sudo systemctl restart ocserv
How to Enable IPv6 in OpenConnect VPN
If your VPN server has a public IPv6 address, you can enable IPv6 in OpenConnect VPN. Edit ocserv configuariton file.
sudo nano /etc/ocserv/ocserv.conf
Find the following two lines and uncomment them.
ipv6-network = fda9:4efe:7e3b:03ea::/48 ipv6-subnet-prefix = 64
ファイルを保存して閉じます。 Restart ocserv for the change to take effect.
sudo systemctl restart ocserv
Then we need to enable IP forwarding for IPv6. Edit sysctl.conf
ファイル。
sudo nano /etc/sysctl.conf
このファイルの最後に次の行を追加します。
net.ipv6.conf.all.forwarding=1
ファイルを保存して閉じます。 Then apply the changes with the below command.
sudo sysctl -p
Next, we need to set up IPv6 masquerading in the server firewall, so that the server becomes a virtual router for VPN clients.
sudo nano /etc/ufw/before6.rules
By default, there are some rules for the filter
table. Add the following lines at the end of this file. Replace ens3
with your own network interface name.
# NAT table rules *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -o ens3 -j MASQUERADE # End each table with the 'COMMIT' line or these rules won't be processed COMMIT
In Nano text editor, you can go to the end of the file by pressing Ctrl+W
, then pressing Ctrl+V
。

By default, UFW forbids packet forwarding. We can allow forwarding for our private IPv6 network. Find the ufw6-before-forward
chain in this file and add the following 3 lines, which will accept packet forwarding if the source IP or destination IP is in the fda9:4efe:7e3b:03ea::/48
範囲。

ファイルを保存して閉じます。 Restart UFW for the change to take effect.
sudo systemctl restart ufw
Now if you list the rules in the POSTROUTING chain of the NAT table by using the following command:
sudo ip6tables -t nat -L POSTROUTING
You can see the Masquerade rule.
Disconnect the current VPN connection, add an AAAA record for vpn.example.com
and re-establish VPN connection. Then go to https://test-ipv6.com/ to check your IPv6 connectivity.
If you run your own BIND DNS resolver on the VPN server, you can add the following line in /etc/ocserv/ocserv.conf
file to set the VPN server as the DNS resolver for VPN clients.
dns = fda9:4efe:7e3b::1
ファイルを保存して閉じます。 To query DNS names in IPv6, we need to configure BIND to allow IPv6 VPN clients.
sudo nano /etc/bind/named.conf.options
Find the allow-recursion parameter and change it to:
allow-recursion { 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; };
ファイルを保存して閉じます。 Restart BIND9.
sudo systemctl restart named
We also need to allow IPv6 VPN client in the firewall.
sudo ufw allow in from fda9:4efe:7e3b:03ea::/48
Virtual Hosting
注 :If you just want to have the ability to use multiple hostnames for the VPN server, you can use certbot to obtain a multi-domain certificate. Then restart ocserv and you are done.
To add a new virtual host in ocserv, first you need to use the method in step 3 to obtain a TLS certificate for the new virtual host. Then edit ocserv configuration file.
sudo nano /etc/ocserv/ocserv.conf
Go to the bottom of this file. In Nano text editor, you can press Ctrl+W
, then Ctrl+V
to jump to the bottom of a file.次の行を追加します。 Replace vpn2.example.com
with the hostname of the second virtual host.
[vhost:vpn2.example.com] #Allow password authentication and certificate authentication enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]" auth = "certificate" tcp-port = 443 #uncomment the two lines if ocserv runs behind HAProxy. #listen-host = 127.0.0.1 #listen-proxy-proto = true # SSL/TLS configuration ca-cert = /etc/ocserv/ssl/ca-cert.pem server-cert = /etc/letsencrypt/live/vpn2.example.com/fullchain.pem server-key = /etc/letsencrypt/live/vpn2.example.com/privkey.pem cert-user-oid = 0.9.2342.19200300.100.1.1 #Networking configuration. Use a different network range for this virtual host. device = vpns ipv4-network = 10.10.20.0 ipv4-netmask = 255.255.255.0 route = default dns = 8.8.8.8 tunnel-all-dns = true compression = true max-clients = 0 max-same-clients = 0 try-mtu-discovery = true idle-timeout=1200 mobile-idle-timeout=2400 config-per-user = /etc/ocserv/config-per-user/ config-per-group = /etc/ocserv/config-per-group/
ファイルを保存して閉じます。 Then restart ocserv.
sudo systemctl restart ocserv
Edit the UFW configuration file.
sudo nano /etc/ufw/before.rules
Find the ufw-before-forward
chain in this file and add the following 2 lines, which will accept packet forwarding if the source IP or destination IP is in the 10.10.20.0/24
範囲。
-A ufw-before-forward -s 10.10.20.0/24 -j ACCEPT -A ufw-before-forward -d 10.10.20.0/24 -j ACCEPT
ファイルを保存して閉じます。 Then restart UFW.
sudo systemctl restart ufw
Note that the ocserv daemon might tell you some parameters will be ignored for virtual host. However, I found that some of the ignored parameters are actually needed. For example, if you delete the device = vpns
line from the virtual host, you might encounter the following error when establishing VPN connection to the virtual host.
VPN service unavailable; reason: Server configuration error
And the VPN server would produce the following error message in the log.
no networks are configured; rejecting client
Also Note that the AnyConnect VPN client on iOS doesn’t support TLS SNI, so iOS users will connect to the default virtual host.
How to Run Multiple Instances of ocserv
One ocserv process can bind to only one TCP or UDP port on your server. If you want to allow ocserv to bind to multiple TCP or UDP ports, then you need to run multiple ocserv processes. It’s very simple. Copy the /lib/systemd/system/ocserv.service
to a new file.
sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv2.service
Then edit the new file.
sudo nano /etc/systemd/system/ocserv2.service
変更
/etc/ocserv/ocserv.conf
に
/etc/ocserv/ocserv2.conf
ファイルを保存して閉じます。 Next, you can edit the /etc/ocserv/ocserv2.conf
file and add your custom configurations. Once you are done, start the second ocserv service.
sudo systemctl start ocserv2