tun
(IP レベルトンネル用) と tap
(イーサネットレベルトンネル用) インターフェースをサポートします。実際には、VPN クライアントをイーサネットブリッジ経由でサーバのローカルネットワークに参加させる場合を除いて、tun
インターフェースが最もよく使われます。
openssl
コマンドを使うスクリプト群として実装されています。
$
make-cadir pki-falcot
$
cd pki-falcot
vars
ファイルに保存します。パラメータには特に KEY_
接頭辞が付けられています。これらの変数は環境変数に組み込まれます。
$
vim vars
$
grep KEY_ vars
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` export KEY_DIR="$EASY_RSA/keys" echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR export KEY_SIZE=2048 export KEY_EXPIRE=3650 export KEY_COUNTRY="FR" export KEY_PROVINCE="Loire" export KEY_CITY="Saint-Étienne" export KEY_ORG="Falcot Corp" export KEY_EMAIL="admin@falcot.com" export KEY_OU="Certificate authority" export KEY_NAME="Certificate authority for Falcot Corp" # If you'd like to sign all keys with the same Common Name, uncomment the KEY_CN export below # export KEY_CN="CommonName" $
. ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/roland/pki-falcot/keys $
./clean-all
keys/ca.crt
と keys/ca.key
に保存されます)。
$
./build-ca
Generating a 2048 bit RSA private key ...................................................................+++ ...+++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [FR]: State or Province Name (full name) [Loire]: Locality Name (eg, city) [Saint-Étienne]: Organization Name (eg, company) [Falcot Corp]: Organizational Unit Name (eg, section) [Certificate authority]: Common Name (eg, your name or your server's hostname) [Falcot Corp CA]: Name [Certificate authority for Falcot Corp]: Email Address [admin@falcot.com]:
vpn.falcot.com
で識別されます。ここで指定した DNS 名は作成される鍵ファイルの名前としても使われます (keys/vpn.falcot.com.crt
は公開鍵証明書、keys/vpn.falcot.com.key
は秘密鍵です)。
$
./build-key-server vpn.falcot.com
Generating a 2048 bit RSA private key .....................................................................................................................+++ ...........+++ writing new private key to 'vpn.falcot.com.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [FR]: State or Province Name (full name) [Loire]: Locality Name (eg, city) [Saint-Étienne]: Organization Name (eg, company) [Falcot Corp]: Organizational Unit Name (eg, section) [Certificate authority]: Common Name (eg, your name or your server's hostname) [vpn.falcot.com]: Name [Certificate authority for Falcot Corp]: Email Address [admin@falcot.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /home/roland/pki-falcot/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'FR' stateOrProvinceName :PRINTABLE:'Loire' localityName :T61STRING:'Saint-\0xFFFFFFC3\0xFFFFFF89tienne' organizationName :PRINTABLE:'Falcot Corp' organizationalUnitName:PRINTABLE:'Certificate authority' commonName :PRINTABLE:'vpn.falcot.com' name :PRINTABLE:'Certificate authority for Falcot Corp' emailAddress :IA5STRING:'admin@falcot.com' Certificate is to be certified until Mar 6 14:54:56 2025 GMT (3650 days) Sign the certificate? [y/n]:
y
1 out of 1 certificate requests certified, commit? [y/n]
y
Write out database with 1 new entries Data Base Updated $
./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time […]
$
./build-key JoeSmith
Generating a 2048 bit RSA private key ................................+++ ..............................................+++ writing new private key to 'JoeSmith.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [FR]: State or Province Name (full name) [Loire]: Locality Name (eg, city) [Saint-Étienne]: Organization Name (eg, company) [Falcot Corp]: Organizational Unit Name (eg, section) [Certificate authority]:
Development unit
Common Name (eg, your name or your server's hostname) [JoeSmith]:
Joe Smith
[…]
keys/ca.crt
) はすべてのマシン (サーバもクライアントも) に /etc/ssl/certs/Falcot_CA.crt
という名前で保存されます。サーバの証明書はサーバにだけインストールされます (keys/vpn.falcot.com.crt
は /etc/ssl/vpn.falcot.com.crt
へ、keys/vpn.falcot.com.key
は管理者だけが読めるようなパーミッション制限を掛けるために /etc/ssl/private/vpn.falcot.com.key
へインストールされます)。同時に、対応する Diffie-Hellman パラメータ (keys/dh2048.pem
) は /etc/openvpn/dh2048.pem
へインストールされます。クライアント証明書は対応する VPN クライアントに同様の方法でインストールされます。
/etc/openvpn/*.conf
で定義されたすべての仮想プライベートネットワークを開始します。このため、VPN サーバをセットアップする場合、このディレクトリ内に対応する設定ファイルを配置することになります。設定ファイルの良い足掛かりとして /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
が用意されています。これはどちらかと言えば標準的なサーバを作るためのものです。もちろん、一部のパラメータを適切に設定しなければいけません。具体的に言えば、ca
、cert
、key
、dh
パラメータを対応するファイルが設置されている場所に設定する必要があります (それぞれ、/etc/ssl/certs/Falcot_CA.crt
、/etc/ssl/vpn.falcot.com.crt
、/etc/ssl/private/vpn.falcot.com.key
、/etc/openvpn/dh2048.pem
に設定します)。server 10.8.0.0 255.255.255.0
指示文は VPN によって使われるサブネットを定義します。サーバにはこの範囲に含まれる最初の IP アドレス (10.8.0.1
) が割り当てられ、クライアントには残りの IP アドレスが割り当てられます。
tun0
という名前の仮想ネットワークインターフェースが作成されます。しかしながら、ファイアウォールは OpenVPN の開始前に実ネットワークインターフェースと同時に設定される場合が多いです。このため、永続的な仮想ネットワークインターフェースを作成し、OpenVPN が事前に作成された仮想インターフェースを使うように設定することを推奨します。この追加的設定により、インターフェースの名前を選ぶことが可能になります。この目的を達成するには、openvpn --mktun --dev vpn --dev-type tun
を使って tun
型の vpn
と名付けられた仮想ネットワークインターフェースを作成します。さらに、このコマンドをファイアウォール設定スクリプトの中で使えば、簡単に設定を統合できます。つまり /etc/network/interfaces
ファイルの up
指示文を使います。OpenVPN 設定ファイルをファイアウォール設定に対応させるためには dev vpn
と dev-type tun
指示文を使います。
10.8.0.1
アドレスの VPN サーバにアクセスできるだけです。クライアントをローカルネットワーク (192.168.0.0/24) へアクセスできる状態にするには、push route 192.168.0.0 255.255.255.0
指示文を OpenVPN 設定に追加します。こうすることで、VPN クライアントは自動的にネットワーク経路を取得し、VPN 経由でローカルネットワークに到達できるようになります。さらに、ローカルネットワークにいるマシンに対して VPN サーバに通じる VPN への経路を知らせる必要もあります (VPN サーバがゲートウェイにインストールされている場合、これは自動的に動きます)。別の方法として、VPN サーバが IP マスカレードを動かすように設定する方法があります。そうすれば、VPN クライアントからの接続はあたかもクライアントが VPN サーバからアクセスしたかのように見えます (第 10.1 節「ゲートウェイ」を参照してください)。
/etc/openvpn/
に設定ファイルを置きます。標準的な設定の良い足掛かりとして /usr/share/doc/openvpn/examples/sample-config-files/client.conf
が用意されています。remote vpn.falcot.com 1194
指示文は OpenVPN サーバのアドレスとポート番号を表します。さらに ca
、cert
、key
も鍵ファイルの場所に合わせて設定が必要です。
/etc/default/openvpn
ファイルの AUTOSTART
指示文に none
を設定してください。VPN 接続の開始と停止は service openvpn@name start
と service openvpn@name stop
コマンドを使えばいつでも可能です (ここで、接続名 name は /etc/openvpn/name.conf
で定義したものにマッチします)。
tun*
) を作り、仮想インターフェースをあたかも物理インターフェースのように設定することが可能です。このトンネルシステムを有効化するにはまず、SSH サーバの設定ファイル (/etc/ssh/sshd_config
) の中で PermitTunnel
を「yes」に設定しなければいけません。SSH 接続を確立する際には、-w any:any
オプションを使って明示的にトンネルの作成を要求しなければいけません (ここで any
は必要な tun
デバイス番号で置き替えます)。トンネルを作成するには、サーバおよびクライアント側でそのユーザが管理者権限を持っていることが必要です。そうすればネットワークデバイスを作成することが可能です (言い換えれば、接続は root で確立されなければいけません)。
/etc/ipsec-tools.conf
にはホストが接続する IPsec トンネル (IPsec 用語で Security Association) のパラメータが含まれます。/etc/init.d/setkey
スクリプトを使うことで、トンネルを開始したり停止することが可能です (それぞれのトンネルは仮想ネットワークに接続された他のホストと安全なリンクを確立しています)。このファイルは setkey(8) マニュアルページに含まれる文書を使って手作業で作ることも可能です。しかしながら、多数のマシン群にすべてのホスト用のパラメータを明示的に書くことはすぐに難しい作業になります。なぜなら、トンネルの数はすぐに増えるからです。たとえば racoon や strongswan などの IKE (IPsec Key Exchange の略語) デーモンをインストールすることで、一元管理による作業の簡素化と鍵の定期的な切り替えによる作業の安全化が可能になります。
/etc/ppp/options.pptp
、/etc/ppp/peers/falcot
、/etc/ppp/ip-up.d/falcot
、/etc/ppp/ip-down.d/falcot
を作成しました。
例 10.3 /etc/ppp/peers/falcot
ファイル
# vpn.falcot.com は PPTP サーバです pty "pptp vpn.falcot.com --nolaunchpppd" # "vpn" ユーザで本人確認して接続します user vpn remotename pptp # 暗号化を有効にします require-mppe-128 file /etc/ppp/options.pptp ipparam falcot
pptpd
は Linux 用の PPTP サーバです。主設定ファイル /etc/pptpd.conf
にはいくつかの変更が必要です。すなわち localip (ローカル IP アドレス) と remoteip (リモート IP アドレス) を変更する必要があります。以下の例では、PPTP サーバは常に 192.168.0.199
アドレスを使い、PPTP クライアントは 192.168.0.200
から 192.168.0.250
までの IP アドレスを受け取ります。
例 10.6 /etc/pptpd.conf
ファイル
# TAG: speed # # PPTP デーモンの通信速度を指定します。 # speed 115200 # TAG: option # # PPP オプションファイルの場所を指定します。 # PPP はデフォルトで '/etc/ppp/options' を使います # option /etc/ppp/pptpd-options # TAG: debug # # syslog に詳細なデバッグ情報を出力します # # debug # TAG: localip # TAG: remoteip # # ローカルとリモートの IP アドレス範囲を指定します。 # # コンマで区切ることで、単独の IP アドレスおよび # IP アドレス範囲を指定できます。以下は利用例です。 # # 192.168.0.234,192.168.0.245-249,192.168.0.254 # # 以下の重要な制約事項に注意してください。 # # 1. コンマ間およびアドレス内部で空白文字を使わないでください。 # # 2. MAX_CONNECTIONS よりも多くの IP アドレス を指定した場合、 # 使われる IP アドレスはリストの先頭から MAX_CONNECTIONS # 個までの IP アドレスです。それ以外は使われません。 # # 3. アドレス範囲を略記しないでください! たとえば 234 から 238 の範囲を指定するために # 234-8 と記述するのは間違いです。その代わり 234-238 と記述してください。 # # 4. ローカル IP は 1 つだけでも構いません。この場合、すべてのローカル IP は # 指定したものになります。しかしながら、同時接続中のクライアントには # 必ず異なるリモート IP を割り振らなければいけません。 # #localip 192.168.0.234-238,192.168.0.245 #remoteip 192.168.1.234-238,192.168.1.245 #localip 10.0.1.1 #remoteip 10.0.1.2-100 localip 192.168.0.199 remoteip 192.168.0.200-250
/etc/ppp/pptpd-options
を編集して、PPTP サーバの使う PPP 設定を変更します。重要なパラメータはサーバ名 (pptp
)、ドメイン名 (falcot.com
)、DNS と WINS サーバの IP アドレスです。
例 10.7 /etc/ppp/pptpd-options
ファイル
## pppd の syslog デバッグを有効化します #debug ## 「サーバ名」を chap-secrets 内の自分のサーバ名として指定したものに変更します name pptp ## ドメイン名をローカルドメインに変更します domain falcot.com ## 以下は WinXXXX クライアントに対して ## 適当とされるデフォルトセキュリティ関連設定です # Debian の pppd パッケージは MSCHAP と MPPE の両方をサポートしています。そのため # ここでは両方を有効化しています。カーネルの MPPE サポートが必須という点にも注意してください! auth require-chap require-mschap require-mschap-v2 require-mppe-128 ## サービスに対応するアドレスを指定してください ms-dns 192.168.0.1 ms-wins 192.168.0.1 ## ネットマスクを指定してください netmask 255.255.255.0 ## 一部のデフォルト設定 nodefaultroute proxyarp lock
vpn
ユーザ (と対応するパスワード) を /etc/ppp/chap-secrets
ファイルに登録します。サーバ名だけは、アスタリスク (*
) を使える他のインスタンスと異なり、明示的に指定しなければいけません。さらに、Windows PPTP クライアントはユーザ名ではなく DOMAIN\\USER
という形を認証を行います。このため、/etc/ppp/chap-secrets
ファイルに FALCOT\\vpn
ユーザが追加されています。ユーザに割り当てる IP アドレスを明記することも可能です。IP アドレスフィールドのアスタリスクは動的にアドレスを割り当てることを意味します。