CentOS で PPTP-VPN サーバーを構築してみる
SERVER
Poptop をインストールする
Linux で PPTP による VPN サーバーを構築するには、Poptop というソフトウェアをインストールすることによって実現することができます。
今回は CentOS 5.3 や CentOS 6.0 に、この Poptop をインストールして、PPTP-VPN サーバーを構築してみようと思います。
CentOS には Poptop はインストールされていないので、まずは http://sourceforge.net/projects/poptop/files/ から、平成 21 年 12 月 04 日現在の最新版である "pptpd-1.3.4.tar.gz" をダウンロードします。
そして、CentOS の場合、 RPM でインストールした方が良いと思うので、ダウンロードした "pptpd-1.3.4.tar.gz" から RPM ファイルを作成します。
なお、RPM を構築するための rpm-build の準備方法については CentOS で RPM パッケージを作成できるようにする で記していますので、こちらの方をご覧ください。
RPM を作成するために、まずは先ほどダウンロードした "pptpd-1.3.4.tar.gz" を保存します。
保存する場所は、CentOS 5.3 であれば "/usr/src/redhat/SOURCES/" ディレクトリに、CentOS 6.0 であれば "/root/rpmbuild/SOURCES/" ディレクトリになります。
その上で rpm-build コマンドを使用して、Poptop の RPM パッケージを構築します。
# CentOS 5.3 の場合
cd /usr/src/redhat/SOURCES
# CentOS 6.0 の場合
cd /root/rpmbuild/SOURCES
# CentOS 5.3 と 6.0 とで共通
rpmbuild -ta pptpd-1.3.4.tar.gz
これにより、CentOS 5.3 の場合は "/usr/src/redhat/RPMS/x86_64/" ディレクトリに "pptpd-1.3.4-1.x86_64.rpm" が出来上がりました。
CentOS 6.0 の場合は "/root/rpmbuild/RPMS/x86_64/" ディレクトリに "pptpd-1.3.4-1.el6.x86_64.rpm" が出来上がります。
RPM ファイルができたら、続いて、出来上がった RPM を使用して、Poptop のインストールを行います。
# CentOS 5.3 の場合
cd /usr/src/redhat/RPMS/x86_64
rpm -ivh pptpd-1.3.4-1.x86_64.rpm
# CentOS 6.0 の場合
cd /root/rpmbuild/SOURCES
rpm -ivh pptpd-1.3.4-1.el6.x86_64.rpm
これで、Poptop のインストールが完了しました。
インストールが完了すると、プログラム本体が "/usr/sbin/pptpd" に、設定ファイルが "/etc/pptpd.conf" に出来上がります。
Poptop を設定する
Poptop のインストールが完了したら、Poptop の設定を調整します。
設定ファイルは "/etc/pptpd.conf" に保存されています。
この中で、特に意識して設定する必要があるのは、"localip" と "remoteip" の二つです。
まず "localip" は、PPTP で接続した後のネットワークに所属する IP アドレスです。PPTP-VPN サーバー上のこの IP アドレスが割り当てられ、それと VPN 接続先のネットワークとが通信を行うことになるようです。もう一つの "remoteip" は、PPTP-VPN クライアント側に割り当てられる IP アドレスで、この IP アドレスと PPTP-VPN サーバーとの通信を行うことができます。
例えば、VPN 接続先のネットワークが 192.168.1.0/24 のネットワーク空間だった場合に、その 128 番以降を VPN として使用し、VPN クライアントには 192.168.2.0/24 の IP アドレスを割り当てるには、次のような感じになります。
localip 192.168.1.128-254
remoteip 192.168.2.128-254
または、VPN 接続先のネットワークが 192.168.1.0/24 のネットワーク空間として、VPN サーバーに 192.168.1.128 を、残りを VPN クライアントに割り当てたい場合には、次のような感じになります。
localip 192.168.1.128
remoteip 192.168.1.129-254
なお、Poptop は PPP と併用して動作するプログラムのようなのですが、Poptop 1.3.4 の場合は pppd 2.4.3 での利用が想定されているようです。
試してみた環境では CentOS 5.3 には ppp.x86_64 (2.4.4-2.el5) が既にインストールされていて、"yum downgrade ppp" でもそれ以上、ダウングレードすることはできませんでした。
このまま Poptop を利用しようとすると、上手く接続することができずに、"/var/log/messages" ログの中に "Plugin /usr/lib64/pptpd/pptpd-logwtmp.so is for pppd version 2.4.3, this is 2.4.4" というエラーが記録されてしまうようです。
これを解消するためには、Poptop の設定ファイル "/etc/pptpd.conf" の中の "logwtmp" と書かれた行をコメントアウトすることで回避することが可能でした。ただ、この設定を調整した場合、おそらく PPTP-VPN 経由でログインしたログが残らなくなってしまうのではないかと思うので、運用面での安全性が低下してしまうかもしれません。
PPP を設定する
Poptop は PPP と連携して動作するようなので、PPP の方の設定も必要となります。
これは "/etc/ppp/options.pptpd" ファイルを編集することで設定を行うことになります。なお、ここで指定するオプションは PPP に対してのオプションとなるようで、その意味については "man pppd" として PPP のマニュアルを確認することで、調べることができるようでした。
今回の環境では、DNS と WINS の情報を、ネットワーク環境に併せて調整する程度で大丈夫でした。設定の要所を記しておくと、次のような感じです。
lock
name pptpd
# localip と remoteip が LAN 側サブネットに含まれる場合は proxyarp を有効にします。
proxyarp
auth
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 192.168.1.1
ms-wins 192.168.1.1
後は、CHAP 認証のためのパスワードを設定します。
パスワードは "/etc/ppp/chap-secrets" に、次の表に記した形で登録します。
1. client PPTP-VPN 接続で使用するアカウント名を記載します。 2. server サーバー名を記載します。ここには "/etc/ppp/options.pptpd" 内で "name" として設定した値を記載します。 3. secret 1 番で指定したアカウントに対するパスワードを設定します。パスワードはダブルクォーテーション ( " ) で括る感じで記すようです。 4. IP address 接続を許可する IP アドレスを設定します。指定しない場合には "*" を設定します。
ルーティング機能を有効にする
VPN 経由で LAN 内の他のコンピューターと接続させたい場合には、ルーティング機能を有効にする必要があります。
ルーティング機能を有効にする方法については Linux の使い方: CentOS 5.3 でルーティング機能を有効にする の方に記していますので、そちらを参考にしてください。
なお、VPN サーバーまでのアクセスで良い場合には必要ありませんので、安全性も考慮して設定すると良いと思います。
ファイアーウォールを調整する
CentOS 5.3 では、iptables によるファイアーウォールが有効になっている場合も多いかと思います。
PPTP-VPN を利用するためには、GRE パケットと 1723/TCP の通信とを通信可能にする必要があります。また、remoteip と localip とのネットワーク空間が異なる設定になっている場合には、localip 側のネットワークから remoteip 側のネットワークへ入ってくる通信も許可する必要があると思います。
CentOS 5.3 では "/etc/sysconfig/iptables" に iptables の設定が保存されていますので、それを編集します。
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport pptp -j ACCEPT
-A RH-Firewall-1-INPUT -p gre -j ACCEPT
-A RH-Firewall-1-INPUT -p all -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
なお、通常はこのファイルは "system-config-securitylevel" コマンドを使用して編集することになるのですが、GRE パケットの通信を許可するには、このツールでは対応できないようですので、今回は直接変更することにしています。このファイルに手を加えた後で、再度 "system-config-securitylevel" を使ってファイアーウォールを調整すると、手動で編集した分は消えてしまうので注意が必要です。
こういった事故を防ぐための一案として CentOS のファイアーウォール設定を system-config-securitylevel が上書きしないようにする を記してみましたので、必要でしたらこちらも参考にしてみてください。
ちなみに、一般的な Linux での iptables 設定は、次のような感じになるのでしょうか。試してみていないので少し自信がないですけれど。
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p 47 -j ACCEPT
iptables -A INPUT -p all -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT
また、ルーティングにより同一 LAN 内のコンピューター間の通信を行う場合には、これらと併せて、それぞれのコンピューター間の通信を許可するルールを FORWARD チェインに登録する必要があります。
例えば、/etc/pptpd.conf で設定した localip と remoteip とのネットワーク空間が異なる場合には、次のようなイメージでルールを設定する形となります。
-A RH-Firewall-1-INPUT -p all -s LOCALIP -d REMOTEIP -j ACCEPT
-A RH-Firewall-1-INPUT -p all -s REMOTEIP -d LOCALIP -j ACCEPT
このようにすることで、LOCALIP と REMOTEIP 間の通信を全て許可することが可能となります。localip を "192.168.1.2-254" としていた場合には、上記 LOCALIP のところは "192.168.1.0/24" といった形にすれば大丈夫でしょう。
また、LOCALIP と REMOTEIP とのネットワーク空間が同じ場合には、同一ネットワーク間の通信が転送されるように設定しておく感じになると思います。
-A RH-Firewall-1-INPUT -p all -s 192.168.1.0/24 -d 192.168.1.0/24 -j ACCEPT
このような感じでファイアーウォールの値を調整することで、VPN 経由で LAN に参加するといったことが行えるようになるようでした。もっと的確な方法や厳密な設定方法もあるかと思いますので、構築している環境の条件にあった設定を探してみてください。
Poptop を起動する
これで Poptop の準備は完了です。
次の命令を実行して Poptop を起動すれば、PPTP-VPN を使用した接続を受け付けることが可能になります。
service pptpd start
また、CentOS 起動時に Poptop を自動起動させたい場合には、次のようにしておきます。
chkconfig pptpd on