GNU/Linux >> Linux の 問題 >  >> Ubuntu

Let’sEncryptを使用してUbuntu20.04でOpenConnectVPNサーバー(ocserv)をセットアップする

このチュートリアルでは、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

Ubuntu
  1. UbuntuでWireGuardVPNを設定する方法(ステップバイステップガイド)

  2. Ubuntu22.04でStrongSwanを使用してIKEv2VPNサーバーをセットアップする方法

  3. Nginxを使用してUbuntu18.04にLet'sEncryptSSLをインストールする方法

  1. Debian 11BullseyeでOpenConnectVPNサーバー(ocserv)をセットアップする

  2. Debian 10BusterでOpenConnectVPNサーバー(ocserv)をセットアップする

  3. OpenConnect VPNサーバー(ocserv)での証明書認証の設定

  1. Ubuntu20.04でPleskを使用してEメールサーバーを設定する方法

  2. UbuntuでPure-FTPdを使用して安全なFTPサーバーをセットアップする方法

  3. Let’sEncryptを使用してUbuntu18.04 /16.04でOpenConnectVPNサーバー(ocserv)をセットアップします