本章では VPN に関するいくつかの用語を使用していますので、まずはその説明から行います。
VPN の接続の 「両端」 を表す用語です。 VPN サーバとクライアントの両方を意味しています。
TAP デバイスはイーサネットデバイス (イーサネットフレームなどの OSI モデルにおけるレイヤ 2) を疑似するデバイスです。 TAP デバイスはブリッジ型の VPN 接続で使用され、イーサネットのフレームを転送します。
TUN デバイスは IP ネットワーク (IP パケットなどの OSI モデルにおけるレイヤ 3) を疑似するデバイスです。 TUN デバイスはルーティング型の VPN で使用され、 IP のフレームを転送します。
2 つのエンドポイントを結ぶ通信経路を意味する用語です。もっと技術的な観点で言うと、クライアント側のデバイスとサーバ側のデバイスの接続を意味します。通常、トンネルは暗号化されていますが、暗号化されていなくてもトンネルと表現します。
VPN で接続を行うと、 IP パケットは トンネル を介して伝送されるようになります。トンネルは TUN または TAP のいずれかを使用します。 TUN/TAP は仮想ネットワークに対応するカーネルドライバで、イーサネットや IP フレーム (パケット) の伝送を行います。
ユーザスペース側のプログラム (OpenVPN) では、 TUN/TAP のデバイスに接続して、オペレーティングシステムとの間でパケットの送受信を行います。
一般的に言うと、 VPN には様々なソリューションが存在し、構成も様々なものが存在しています。本章では OpenVPN パッケージを利用した場合の説明を行っています。 OpenVPN では、他の VPN ソフトウエアとは異なり、下記に示す 2 種類のモードに対応しています:
ルーティング型 VPN は構築が簡単な方式です。ブリッジ型 VPN よりも効率的で大規模環境にも向きます。それに加えて、さらに効率を高めるために MTU (最大伝送単位; Maximum Transfer Unit) を調整することもできます。しかしながら、ゲートウエイ側で Samba サーバを動作させない限り、 NetBIOS ブロードキャストが動作しないという仕様上の問題があり、異種混合型の環境では都合が悪いことがあります。なお、 IPv6 を必要とする場合は、双方のエンドポイントで TUN デバイスに対して明示的に設定を行う必要があります。この方式の構成は 図24.1「ルーティング型 VPN」 のようになります。
ブリッジ型は少し複雑な方式です。 Samba や WINS サーバなどの設定を行うことなく、 VPN を介して Windows のファイル共有を参照できるようにしたい場合は、お勧めの方式です。ブリッジ型の VPN は IP プロトコル以外 (IPX など) を環境でも利用できるほか、ブロードキャストパケットを使用する様々なアプリケーションでも利用することができます。しかしながら、ルーティング型 VPN と比べると効率は悪く、大規模環境にも向きません。この方式の構成を下記の図に示します。
ブリッジ型とルーティング型の大きな違いは、ルーティング型の場合は IP ブロードキャストを通すことができないのに対して、ブリッジ型の場合はそれができるという点があります。
下記の例では、一対一の VPN トンネルを作成します。この例を読むことで、クライアントとサーバとの間で、どのようにして VPN トンネルが作られるのかを知ることができます。なお、 VPN サーバ側のアドレスは サーバの_IP
、 VPN クライアント側のアドレスは クライアントの_IP
として、いずれもプライベート IP アドレスを使用しているものとします。なお、実際の構築にあたっては、他の IP アドレスと重複しないものを選んでください。
下記のシナリオは VPN 技術の仕組みを説明するために用意しているものであります。 VPN 技術はその仕組み上、社外からのアクセスを受け入れる仕組みであるため、誤った設定を行ってしまうと、家庭内や社内のネットワークを危険にさらすことにも繋がります。実際に使用するにあたっては、よくご確認のうえ実施してください。
OpenVPN の設定ファイルを簡単に扱うことができるようにするため、下記のような構成をお勧めします:
OpenVPN の設定ファイルは、 /etc/openvpn
以下に配置してください。
1 つのファイル内に全ての設定を書き込む場合は、 MY_CONFIGURATION.conf
のようなファイルを作成して書き込んでください。
複数のファイルを利用して 1 つの構成を作り上げる場合は、 /etc/openvpn/MY_CONFIGURATION
のようなサブディレクトリを作成して、その中にファイルを置いてください。
VPN サーバの構築は下記のようにして行います:
VPN サーバとして動作させたいマシンに、 openvpn
パッケージをインストールします。
シェルを開いて root
になり、下記のように実行して VPN の機密鍵を作成します:
#
openvpn --genkey secret /etc/openvpn/secret.key
機密鍵をクライアントにコピーします:
#
scp /etc/openvpn/secret.key root@クライアントの_IP:/etc/openvpn/
下記のような内容で、サーバ側の設定ファイル /etc/openvpn/server.conf
を作成します:
dev tun ifconfig サーバの_IP クライアントの_IP secret secret.key
/etc/sysconfig/network/ifcfg-tun0
というファイル名のファイル (TUN デバイスの設定) を作成して、下記の内容を記述します:
STARTMODE='manual' BOOTPROTO='static' TUNNEL='tun' TUNNEL_SET_OWNER='nobody' TUNNEL_SET_GROUP='nobody' LINK_REQUIRED=no PRE_UP_SCRIPT='systemd:openvpn@server' PRE_DOWN_SCRIPT='systemd:openvpn@service'
途中、 openvpn@server
という記述がありますが、これは OpenVPN 内のサーバ設定 /etc/openvpn/server.conf
を参照するための設定です。詳しい情報については、 /usr/share/doc/packages/openvpn/README.SUSE
をお読みください。
ファイアウオールを使用している場合は、 YaST を開いて
› › を選び、 UDP ポート 1194 を開くように設定します。TUN デバイスを起動して、 OpenVPN のサービスを開始します:
>
sudo
wicked ifup tun0
下記のように表示されれば成功です:
tun0 up
VPN クライアントの構築は下記のようにして行います:
VPN クライアントとして動作させたいマシンに、 openvpn
パッケージをインストールします。
下記のような内容で、クライアント側の設定ファイル /etc/openvpn/client.conf
を作成します:
remote サーバのグローバル_IP_もしくはドメイン名 dev tun ifconfig クライアントの_IP サーバの_IP secret secret.key
サーバのグローバル_IP_もしくはドメイン名 の箇所には、サーバのグローバル IP アドレス、もしくはドメイン名とホスト名を入力します。
/etc/sysconfig/network/ifcfg-tun0
というファイル名のファイル (TUN デバイスの設定) を作成して、下記の内容を記述します:
STARTMODE='manual' BOOTPROTO='static' TUNNEL='tun' TUNNEL_SET_OWNER='nobody' TUNNEL_SET_GROUP='nobody' LINK_REQUIRED=no PRE_UP_SCRIPT='systemd:openvpn@client' PRE_DOWN_SCRIPT='systemd:openvpn@client'
ファイアウオールを使用している場合は、 手順24.1「VPN サーバの設定」 内の ステップ 6 で説明している手順に従って、 UDP ポート 1194 を開くように設定します。
TUN デバイスを起動して、 OpenVPN のサービスを開始します:
>
sudo
wicked ifup tun0
下記のように表示されれば成功です:
tun0 up
OpenVPN のサービスを正常に動作させることができたら、あとは下記のコマンドを利用して TUN デバイスが正常に動作しているかどうかを確認します:
ip addr show tun0
VPN の接続を確認するには、クライアントとサーバの両方で ping
コマンドを使用し、互いに通信ができていることを確認します。サーバからクライアントに ping を行いたい場合は、下記のように実行します:
ping -I tun0 サーバの_IP
逆に、クライアントからサーバに対して ping を行いたい場合は、下記のように実行します:
ping -I tun0 クライアントの_IP
24.2項 で説明している構築例はテストには便利であるものの、本格的な使用に耐えるものではありません。本章では、同時に複数の接続を受け入れることのできる VPN サーバを構築する方法について、説明を行っています。これは公開鍵基盤 (PKI; Public Key Infrastructure) を利用して実現するもので、それぞれのサーバやクライアントに別々の鍵対 (公開鍵と機密鍵) を発行して、それを証明機関 (CA; Certificate Authority) で署名してもらうことによって、正当性を設定する方法です。
この構成で設定を行うには、下記の手順を実施する必要があります:
VPN の接続を確立する前に、クライアントはサーバが提示する証明書を認証し、サーバはクライアントが提示する証明書を認証しなければなりません。これを 相互認証 と呼びます。
証明書の作成を行うための直接的な機能は、 openSUSE Leap には用意されていません。下記の手順では CA の証明書とサーバの証明書、そしてクライアントの証明書を他のシステムで作成したものとして説明しています。
サーバの証明書は PEM 形式で保存し、それに対応する機密鍵も暗号化することなく PEM 形式で保存しておきます。証明書は VPN サーバ内の /etc/openvpn/server_crt.pem
に、 (暗号化していない) 機密鍵は /etc/openvpn/server_key.pem
にそれぞれ置いておきます。
クライアント証明書は PKCS12 (推奨) 形式、もしくは PEM 形式で保存しておきます。 PKCS12 形式の場合は、その中に CA の証明書を含めておく必要があるほか、ファイルは /etc/openvpn/クライアント名.p12
というファイル名で保存しておきます。 PEM 形式で、 CA の証明書が含まれているものの場合は、 /etc/openvpn/クライアント名.pem
というファイル名で保存しておきます。 PEM 形式でクライアント証明書 ( *.ca
) とクライアント鍵 ( *.key
) 、そして CA の証明書 ( *.ca
) をそれぞれ別々に分割している場合は、それぞれのクライアント内の /etc/openvpn/
ディレクトリにそれらを保存します。
また、 CA の証明書は、サーバおよびクライアント内の /etc/openvpn/vpn_ca.pem
にコピーしておく必要があります。
クライアント証明書と対応する機密鍵、そして CA の証明書をそれぞれ別々のファイルに分割している場合は、それらのファイル名を各クライアント内の OpenVPN の設定ファイルで指定する必要があります (詳しくは 例24.1「VPN サーバの設定ファイル」 をお読みください) 。
サーバ側の設定に際しては、 /usr/share/doc/packages/openvpn/sample-config-files/server.conf
にある雛形を /etc/openvpn/
にコピーしたあと、必要に応じて修正を行うことをお勧めします。
# /etc/openvpn/server.conf port 1194 1 proto udp 2 dev tun0 3 # Security 4 ca vpn_ca.pem cert server_crt.pem key server_key.pem # ns-cert-type server remote-cert-tls client 5 dh server/dh2048.pem 6 server 192.168.1.0 255.255.255.0 7 ifconfig-pool-persist /var/run/openvpn/ipp.txt 8 # Privileges 9 user nobody group nobody # Other configuration 10 keepalive 10 120 comp-lzo persist-key persist-tun # status /var/log/openvpn-status.tun0.log 11 # log-append /var/log/openvpn-server.log 12 verb 4
OpenVPN が待ち受ける TCP/UDP ポートを指定します。なお、ここで指定するポートは、ファイアウオール側で開いておく必要があります。ファイアウオールに関する詳細は 第23章 「マスカレードとファイアウオール」 をお読みください。標準ではポート 1194 を使用しますが、今回はそのまま使用するものとします。 | |
プロトコルを指定します。 UDP もしくは TCP のいずれかを指定します。 | |
デバイスの種類を TUN もしくは TAP から選択して指定します。これらの違いについての詳細は 24.1.1項 「用語」 をお読みください。 | |
これ以降の行には、証明機関の証明書 ( | |
相手側に要求する証明書の種類を指定しています。この場合、 RFC3280 TLS rules で規定されている key usage と extended key usage (鍵の用途) について、明確な署名のある証明書のみを受け入れる設定です。 | |
Diffie-Hellman パラメータを指定します。ここで指定するファイルは、下記のコマンドで生成することができます: openssl dhparam -out /etc/openvpn/dh2048.pem 2048 | |
VPN サブネットを指定します。サーバ自身は | |
クライアントと仮想 IP アドレスの対応付けに関する情報を、指定したファイルに記録する指定です。これは特に、サーバ側を再起動するような場合、再起動後もクライアントに対して同じアドレスを割り当てたい場合に有用です。 | |
セキュリティ上の理由から、 OpenVPN に対する権限は制限しておくことをお勧めします。権限を制限するには、ユーザおよびグループを | |
その他の設定です。詳しくは | |
このオプションを有効にすることで、指定したファイルに状態に関する概要情報と統計情報 ( 「operational status dump」 ) を出力するようになります。既定では有効化されていません。 全ての出力は、 | |
既定では、ログメッセージは syslog に出力されます。この動作を変更したい場合は、この行にあるコメント文字 (#) を削除してください。コメント文字を削除すると、全てのメッセージが |
設定作業が終わったら、 OpenVPN サーバのログが /var/log/openvpn.log
に出力されます。初回の起動時には、下記のように出力されるはずです:
... Initialization Sequence Completed
上記のようなメッセージが表示されない場合は、ログファイルをよく読んで、設定ファイル内のどの箇所が誤っているのかをご確認ください。
クライアント側の設定に際しては、 /usr/share/doc/packages/openvpn/sample-config-files/client.conf
にある雛形を /etc/openvpn/
にコピーしたあと、必要に応じて修正を行うことをお勧めします。
# /etc/openvpn/client.conf client 1 dev tun 2 proto udp 3 remote IP_OR_HOST_NAME 1194 4 resolv-retry infinite nobind remote-cert-tls server 5 # Privileges 6 user nobody group nobody # Try to preserve some state across restarts. persist-key persist-tun # Security 7 pkcs12 client1.p12 comp-lzo 8
このマシンをクライアントとして動作させる宣言です。 | |
ネットワークデバイスを指定します。クライアントとサーバの両方で、同じデバイスを使用しなければなりません。 | |
プロトコルを指定します。こちらもクライアントとサーバの両方で、同じプロトコルを設定しなければなりません。 | |
こちらはクライアント向けのセキュリティオプションで、接続先のコンピュータが目的のサーバかどうかを確認することができます。 | |
IP_OR_HOST_NAME の箇所を OpenVPN サーバのホスト名もしくは IP アドレスに置き換えてください。ホスト名もしくは IP アドレスの後ろには、サーバ側のポート番号を指定します。複数の VPN サーバのうちのいずれかを選択して接続したい場合は、 | |
セキュリティ上の理由から、 OpenVPN に対する権限は制限しておくことをお勧めします。権限を制限するには、ユーザおよびグループを | |
クライアント向けに発行された鍵を指定します。セキュリティ上の理由から、クライアントごとに異なる鍵を使用してください。 | |
圧縮を有効化しています。このパラメータは、サーバ側でも有効化しておかなければなりません。 |
YaST を使用することで、 VPN サーバの設定を行うことができます。ただし、残念ながら YaST のモジュールは OpenVPN に対応していません。その代わり、 IPsec プロトコル (StrongSwan ソフトウエアで実装されています) を使用することができます。 OpenVPN と同様に、 IPsec は幅広く使用されている VPN 方式です。
YaST の VPN モジュールを起動するには、
› を選択します。まずは
内にある を選択します。新しく VPN を作成するには、
を押して、接続に対して設定する名前を入力します。では を選択します。
あとは用途に合わせて下記を実施します:
Linux クライアントを接続する場合は、
と が最適な選択となります。Android, iOS, macOS などの新しいバージョンでネイティブに対応している設定を行いたい場合は、
を選択します。この設定では、事前共有鍵をベースにした設定となり、必要であればユーザ名/パスワードによる認証も行うことができます。Windows や BlackBerry デバイスでネイティブに対応する設定を行いたい場合は、
を選択します。こちらは証明書をベースにした設定となり、必要であればユーザ名/パスワードによる認証も行うことができます。この例では、
を選択したものとします。鍵を指定するには、
を押します。あとは を押してから、共有鍵を入力します。入力が終わったら を押します。https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing をお読みください。
では、 VPN を利用した場合のアクセス制限を設定することができます。特定の IP 範囲のみを許可したい場合は、 内に、 CIDR 形式かつカンマ区切りで指定します。 CIDR 形式に関する詳細は、では、 VPN サーバからクライアントに対して提供する、 IP アドレスを指定します。
設定を完了するには、
を押します。これにより、 YaST VPN モジュールは自動的にファイアウオールのルールを追加して有効化し、クライアント側から接続できるように設定します。接続の状態を確認したい場合は、表示される確認ウインドウで systemctl status
が表示され、 VPN が有効化されているかと正しく設定されているかを確認することができます。
NetworkManager を利用した VPN 接続の設定方法については、 28.3.4項 「NetworkManager と VPN」 をお読みください。
VPN に関する情報をご希望の場合は、下記をご覧ください:
https://openvpn.net : OpenVPN の Web ページ
man
openvpn
/usr/share/doc/packages/openvpn/sample-config-files/
: 様々な用途に対応した設定ファイルの例があります。
/usr/src/linux/Documentation/networking/tuntap.txt
: TUN/TAP インターフェイスの説明 (英語) です。なお、このファイルは kernel-source
パッケージ内に含まれています。