harumaki.net

インフラ屋の覚書や、ラーメン食べある記とか。

VPNサーバ構築検証(PPTP)

   


会社の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/

【参考サイト】
お世話になっています!

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上での使用は問題なし。

※逆にある程度機能が限定されていても問題無いか?

 - infra, network, メモ