Last Updated on 2022年3月13日 by かんりにん
会社のWindowsVPNが不調になったので、原因を調べつつLinuxでの構築を試してみる。
サーバーはRedHat Enterprise 4系。
構築要件 †
- WindowsPCからの接続が可能
- WindowsDCのユーザー認証を使用してテスト
社内のActive Directoryで管理しているユーザアカウントでの認証とログインのテスト - グローバルIP割り当て
- PPTP通信の暗号化
PPTPで使用するというMPPE(Microsoft Point-to-Point Encryption) の適用 - WindowsDCのユーザー認証を使用してテスト
・プライベートIPの割り当て範囲を決める
【前提条件】
- ネットワークIFを二つ持ち、片方はグローバルIPを割り当てている。
あるいはNATで割り当ててている。 - 各IFにそれぞれルーティングテーブルを設定している。
【使用するパッケージ】
- ppp
最新版にバージョンアップ - dkms
カーネルモジュールの追加をするためのパッチ - kernel_ppp_mppe
mppeのカーネルモジュール - pptpd
pptpサーバ
【本家サイト】
Poptop – The PPTP Server for Linux
http://www.poptop.org/
【参考サイト】
お世話になっています!
- LinuxでPPTPを使う
http://www.komoto.org/vpn/pptp-linux.html
- LinuxでWindows用VPNサーバを立ち上げる
http://www.pluto.ai.kyutech.ac.jp/plt/matumoto/PPTP/pptp.html
1)インストール †
カーネルモジュールとソフトウェアのインストール。
WindowsVPNの接続を許可する場合、MPPE(Microsoft Point-to-Point Encryption)への対応が
必要となる。
VPNサーバにLinuxを用いる場合、カーネルにmppeのパッチを当てるか、mppeモジュールを用意して
読み込ませてmppe対応にするかの選択肢がある。
今回はカーネルへmppeモジュールを追加する方向で作業を進める。
PPP †
- 1-1.パッケージのビルド
- ダウンロード
# cd /usr/src/redhat/SRPMS/ # wget http://downloads.sourceforge.net/poptop/ppp-2.4.3-5.src.rpm?use_mirror=jaist
- ソースRPMの展開とビルド
# rpm -Uvh ppp-2.4.3-5.src.rpm # cd ../SPECS/ # rpmbuild -bb ppp.spec
完了すると、/usr/src/redhat/RPMS/i386/に以下のファイルが作成される。
ppp-2.4.3-5.rhel3.i386.rpm ppp-debuginfo-2.4.3-5.rhel3.i386.rpm
- ダウンロード
- 1-2.インストール
- 古いソースのバックアップ
# cd /usr/src/ # cp -pR linux-2.6.**-**.EL/ linux-2.6.**-**.EL.old
- インストール
# cd /usr/src/redhat/RPMS/i386/ # rpm -ivh --test ppp-2.4.3-5.rhel4.i386.rpm
そのままインストールしようとすると、既にインストール済みのpppとコンフリクトするので
- 古いソースのバックアップ
- Uvhに変更してアップデートする。
dkms †
# wget http://downloads.sourceforge.net/poptop/dkms-2.0.10-1.src.rpm?modtime=1142591697&big_mirror=1 # rpm -Uvh dkms-2.0.10-1.src.rpm # cd ../SPECS/ # rpmbuild -bb dkms.spec
完了すると、/usr/src/redhat/RPMS/noarch/dkms-2.0.10-1.noarch.rpmが作成される。
インストールはmppeモジュールと同時に行うので、次項に記載。
mppeのkernelモジュール †
- 2-1.パッケージのビルド
- ダウンロード
# pwd /usr/src/redhat/SRPM # wget http://downloads.sourceforge.net/poptop/kernel_ppp_mppe-1.0.2-3dkms.src.rpm?modtime=1128679004&big_mirror=1
- ソースRPMの展開とビルド
# rpm -Uvh kernel_ppp_mppe-1.0.2-3dkms.src.rpm # cd ../SPECS/ # rpmbuild -bb kernel_ppp_mppe.spec
完了すると、/usr/src/redhat/RPMS/noarch/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpmが作成される。
- ダウンロード
- 2-2.dkmsとmppeモジュールをインストール
上記で作成したdkmsと同時にまとめてインストール。# cd /usr/src/redhat/RPMS/noarch/ # rpm -ivh --test dkms-2.0.10-1.noarch.rpm kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
問題なければインストール実施。
そのままカーネルのコンパイルまで実行される。# rpm -ivh dkms-2.0.10-1.noarch.rpm kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm Preparing... ########################################### [100%] 1:dkms ########################################### [ 50%] 2:kernel_ppp_mppe ########################################### [100%] Creating symlink /var/lib/dkms/kernel_ppp_mppe/0.0.5/source -> /usr/src/kernel_ppp_mppe-0.0.5 DKMS: add Completed. Kernel preparation unnecessary for this kernel. Skipping... Running the pre_build script: Using /var/lib/dkms/kernel_ppp_mppe/0.0.5/source/ppp_generic/2.6.5-1.358/ppp_generic.c applying patch linux-2.6.2-pad.patch...patching file ppp_generic.c Hunk #1 succeeded at 1066 (offset 21 lines). Hunk #3 succeeded at 1615 (offset 25 lines). applying patch 02-ppp_generic.c.patch...patching file ppp_generic.c applying patch 03-ppp_mppe_compress.c.patch...patching file ppp_mppe_compress.c applying patch 04-ppp_mppe_compress.c_license.patch...patching file ppp_mppe_compress.c Hunk #1 succeeded at 654 (offset 1 line). Building module: cleaning build area.... make KERNELRELEASE=2.6.9-42.ELsmp -C /lib/modules/2.6.9-42.ELsmp/build M=/var/lib/dkms/kernel_ppp_mppe/0.0.5/build..... Running the post_build script: cleaning build area.... DKMS: build Completed. Running module version sanity check. ppp_generic.ko: - Original module - Found /lib/modules/2.6.9-42.ELsmp/kernel/drivers/net//ppp_generic.ko - Storing in /var/lib/dkms/kernel_ppp_mppe/original_module/2.6.9-42.ELsmp/i686/ - Archiving for uninstallation purposes - Installation - Installing to /lib/modules/2.6.9-42.ELsmp/kernel/drivers/net// ppp_mppe.ko: - Original module - Installation - Installing to /lib/modules/2.6.9-42.ELsmp/kernel/drivers/net// depmod....... DKMS: install Completed. #
pptpd †
VPNサーバのデーモンとして動作するpptpdをインストール。
# cd /usr/src/redhat/SRPMS/ # wget http://downloads.sourceforge.net/poptop/pptpd-1.3.3-1.src.rpm?modtime=1157464935&big_mirror=1 # rpm -Uvh pptpd-1.3.3-1.src.rpm # cd ../SPECS/ # rpmbuild -bb pptpd.spec
コンパイルに成功すると../RPMS/i386にパッケージが出来る。
# cd ../RPMS/i386/ # rpm -ivh --test pptpd-1.3.3-1.i386.rpm
問題なければインストール。
# rpm -ivh pptpd-1.3.3-1.i386.rpm
2)環境設定 †
2-1.pptpdの基本設定 †
- /etc/pptpd.conf
# cd /etc/ # vi pptpd.conf
- [設定箇所]
localip 192.168.1.100 ←自ホストのIPアドレス remoteip 192.168.1.101-110 ←VPNクライアントに割り当てるIPアドレス
- [設定箇所]
- /etc/ppp/options.pptpd
# cd /etc/ppp/ # vi options.pptpd --''[設定箇所]'' 18a19 > domain hogecompany.local 66,67c67,68 < #ms-dns 10.0.0.1 < #ms-dns 10.0.0.2 --- > ms-dns 192.168.1.11 ←DNSサーバの指定1 > ms-dns 192.168.1.12 ←DNSサーバの指定2 128c129 < --- > nodefaultroute
2-2.ログインアカウントの設定 †
VPN接続に使用するユーザーアカウントを設定。
※最終的にはsambaでWindowsドメイン認証を利用したいが、テストなので一時的に設定。
設定ファイルは/etc/ppp/chap-secrets。
# pwd /etc/ppp # cp chap-secrets chap-secrets.org # vi chap-secrets
- [設定内容]
接続アカウント(client)、サーバ名、パスワード(secret)、IPアドレスを設定する。
パスワードを平文で記入するのが微妙。
IPアドレスを指定しない場合は*とする。
指定すると、接続元を制限することができる。# Secrets for authentication using CHAP # client server secret IP addresses # クライアント名 サーバ名 パスワード 接続元IP user VPNsvr password *
2-3.ログ出力の設定 †
デフォルトではpptpdのログは/var/log/messagesへ出力されるが
pptpdのみのログを出力するため/etc/syslog.confへ出力設定を追加。
- /etc/syslog.conf
# vi /etc/syslog.conf
- [設定箇所]
daemon.debug;local2.debug /var/log/ppp/pptpd.log
- [設定箇所]
- /etc/logrotate.d/ppp
# vi /etc/logrotate.d/ppp
- [設定箇所]
# Logrotate file for ppp RPM /var/log/ppp/pptpd.log /var/log/ppp/connect-errors { missingok compress notifempty daily rotate 5 create 0600 root root }
- [設定箇所]
2-4.IPフォワードの設定 †
デフォルトではパケット転送設定が有効になっていないので
これを有効にしておく。
- 事前に設定情報を確認
# cat /proc/sys/net/ipv4/ip_forward 0
無効になっているので、有効にする
# echo 1 > /proc/sys/net/ipv4/ip_forward # cat /proc/sys/net/ipv4/ip_forward 1
このままでは再起動時に設定が無効に戻るので
sysctl.confにも追記しておく。# vi /etc/sysctl.conf
- [変更箇所]
7c7,8 < net.ipv4.ip_forward = 0 --- > #net.ipv4.ip_forward = 0 > net.ipv4.ip_forward = 1
- [変更箇所]
2-5.自動起動設定 †
デーモンの起動は/etc/init.d/pptpdから可能。
ついでにOSリブート時に自動起動するようchkconfigで設定。
# chkconfig pptpd on
3)動作検証 †
自宅からLinuxVPNサーバのグローバルIPへWindowsVPNを設定してログイン。
- vpnログイン:成功
- ipconfig確認
VPNログイン後、ローカルPCにてipconfigを実行。
通常のコンフィグのほか、PPPの設定が表示されることを確認。PPP adapter hogenetwork1: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 192.168.1.101 Subnet Mask . . . . . . . . . . . : 255.255.255.255 Default Gateway . . . . . . . . . : 192.168.1.100
- ping確認
LAN内のホストへping疎通を確認→成功 - DNS解決
nslookupで社内ホストのIPアドレスをリクエスト→失敗 - リモートデスクトップ
ホスト名(FQDN)でのアクセス→失敗
IPアドレス指定でのアクセス→成功
4)課題 †
社外(WAN)からのVPNアクセスは成功したが、現在利用できるのは
IPアドレス指定でも利用できるサービスのみ(リモートデスクトップも同様)。
実運用にフェーズをあげるにあたって、以下の設定の検証が必要。
- セキュリティ強化
- 外部からのアクセス制限
iptablesなどで制限。 - 接続元を制限する
chaps-secretで設定
パスワードをハッシュ化して記載しておけば尚グッド。 - Windowsドメインアカウントでのログインを可能にする
- DNSを参照可能にする
- ファイル共有を有効にする
現在はリモートデスクトップで社内のPC上での使用は問題なし。
※逆にある程度機能が限定されていても問題無いか?