VPN Server for Fedora
背景変更 ENV
※お断り
  • 基本的に無保証です。自己責任にてお試しください。
  • ご質問や問題点のご指摘は大歓迎です。何かありましたらお気軽にご連絡ください。

VPNとは

VPN(VirtualPrivateNetwork:仮想プライベートネットワーク) は、
2点間のネットワークを仮想的な回線を用いて接続し、相互に通信可能にする技術です。
一般に、2点間のネットワークを結ぶ際に用いられる仮想的な回線は暗号通信に対応したものが用いられますので、
インターネット経由であっても安全に任意の場所からプライベートネットワークへ接続可能です。

WindowsXPやWindowsMobileにはVPNへ接続する手段として、「PPTP」「L2TP/IPsec」の2つが標準で搭載されています。
今回は、このWindowsに標準搭載のVPNクライアントで接続可能なVPNサーバをLinux(Fedora8)で構築し、
高価なWindowsServerを用いずにVPNセッションを張れる環境の構築を目標とします。

必要なもの


インストール

  1. [既にLinuxが構築済みの方向け] インストールが必要なソフトウエアとその設定

[既にLinuxが構築済みの方向け] インストールが必要なソフトウエアとその設定

※既にFedora8以上がインストール済みであることが前提です。
※yum -y updateしてシステムを最新にした上で行うことをお勧めします。

インストール/設定が必要なソフトウエア

ご注意!
  • WindowsXP SP2でL2TP/IPsecをNAT越しに利用する場合の注意点
    WindowsXP SP2のデフォルトではL2TP/IPsecをNAT越しに利用できない設定となっています。
    よってL2TP/IPsecサーバがNATの中にある場合、レジストリの設定を変更し、L2TP/IPsecをNAT越しに利用できるようにする必要があります。

    ■レジストリの設定
    1. regeditを起動
    2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPsec中に、
      「AssumeUDPEncapsulationContextOnSendRule」というキーをつくり、DWORD値を"2"にセットします。
      これで再起動を行うことで、NAT越えL2TP/IPsecが利用可能になります。
      なお、WindowsMobile6ではデフォルトでNAT越えが可能になっているようです(^^;;(Advanced/W-ZERO3[es]で確認)
      詳しくはMicrosoft公式ページhttp://support.microsoft.com/kb/885407/jaをご覧ください。

  • WindowsMobileからPPTPで接続する場合の注意点
    WindowsMobileからPPTP接続しようとすると、なぜか繋がりません(^^;;
    一応、/etc/ppp/option.pptpdに"mppe-stateful"を入れるとつながりはするのですが、通信不能です(^^;;
    もしPPTP+WindowsMobileで通信を可能にする方法をご存知の方、是非ご教授ください。
    ちなみに、L2TP/IPsecは問題なく利用可能ですし、こちらの方が暗号強度も高いですので、
    PPTPは利用せずL2TP/IPsecを利用することをお勧めします。

インストール/設定手順


  1. 事前確認
    • ルータ使用時 IPsec、PPTPパススルーを有効にします。
    • /etc/sysctl.confでIPv4パケットフォワーディングを有効にします。
      このファイルに"net.ipv4.ip_forward = 1"を追記してください。
    • DNSは構築済みであるとします。(DNSはMemo - OCNIPv6を参考に構築すると良いかもしれません)
  2. xl2tpdのセットアップ
    • まず、xl2tpdをインストールします。
      インストールは次のコマンドで可能です。
      コマンド yum -y install xl2tpd
    • /etc/xl2tpd/xl2tpd.confの設定
      /etc/xl2tpd/xl2tpd.confを次のように作成します。ただし、$〜、をそれぞれ以下に置換します。
      • $start_ip - 貸し出し開始IPv4アドレス(プライベートネットと同一ネットワークのアドレスを指定)
      • $end_ip - 貸し出し終了IPv4アドレス(貸し出し開始IPアドレスと同一ネットワークのアドレスを指定)
      • $serv_addr - このサーバのプライベートIPv4アドレス
      ファイル /etc/xl2tpd/xl2tpd.conf [global]
      auth file = /etc/ppp/chap-secrets

      [lns default]
      ip range = $start_ip-$end_ip
      local ip = $serv_addr
      require chap = yes
      refuse pap = yes
      require authentication = yes
      name = LunarVPNserver
      ppp debug = yes
      pppoptfile = /etc/ppp/options.xl2tpd
      length bit = yes
    • /etc/ppp/options.xl2tpdの設定
      /etc/ppp/options.xl2tpdを次のように新規にファイルを作成します。ただし、$〜、をそれぞれ以下に置換します。
      • $dns_addr - DNSのIPv4アドレス
      • $wins_addr - WINSサーバアドレス(このサーバのIPv4アドレス)
      ファイル /etc/ppp/options.xl2tpd ipcp-accept-local
      ipcp-accept-remote
      ms-dns  $dns_addr
      ms-wins $wins_addr
      auth
      refuse-pap
      refuse-chap
      refuse-mschap
      require-mschap-v2
      crtscts
      idle 1800
      nodefaultroute
      debug
      lock
      proxyarp
      connect-delay 5000
      logfile /var/log/xl2tpd.l2tp-ipsec.log
      novj
      novjccomp
    • VPNアクセスユーザーのアカウントを定義したファイル/etc/ppp/chap-secretを次のように作成します。
      ただし、$〜、をそれぞれ以下に置換します。
      • $userid - VPNユーザアカウント
      • $password - VPNパスワード
      ※このアカウントはLinuxとは別体系です。自由に追加できます。
      ファイル /etc/ppp/chap-secret $userid * "$password" *
  3. IPSecのセットアップ(L2TP/IPSec向け)
    • 今回はyumからインストール可能なIPsecスタック「OpenS/WAN」のopenswanパッケージをインストールします。
      インストールは次のコマンドで可能です
      コマンド yum -y install openswan
    • /etc/ipsec.d/l2tp-psk.confの設定
      今回はNAT越え可能なL2TP/IPsec-PSK(事前共有キー使用タイプ)を構築しますので、それにあわせた設定ファイルを作成します。
      openswanの場合、/etc/ipsec.d/以下に接続設定ファイルを置くことで置いてある設定ファイル全て読み込んでくれますので、
      設定ファイルのファイル名は分かり易い名前をつけてください。
      ここでは/etc/ipsec.d/l2tp-psk.confというファイル名で接続設定ファイルを作成します。
      ただし、$〜、をそれぞれ以下に置換します。
      • $serv_addr - このサーバのIPv4アドレス
      • $route_addr - デフォルトゲートウエイのIPv4アドレス
      ファイル /etc/ipsec.d/l2tp-psk.conf conn L2TP-PSK-NAT
              rightsubnet=vhost:%priv
              also=L2TP-PSK-noNAT

      conn L2TP-PSK-noNAT
              #
              # Configuration for one user with any type of IPsec/L2TP client
              # including the updated Windows 2000/XP (MS KB Q818043), but
              # excluding the non-updated Windows 2000/XP.
              #
              #
              # Use a Preshared Key. Disable Perfect Forward Secrecy.
              #
              # PreSharedSecret needs to be specified in /etc/ipsec.secrets as
              # YourIPAddress  %any: "sharedsecret"
              left=$serv_addr
              leftnexthop=$route_addr
              authby=secret
              pfs=no
              auto=add
              keyingtries=3
              # we cannot rekey for %any, let client rekey
              rekey=no
              type=transport
              #
              #left=%defaultroute
              # or you can use: left=YourIPAddress
              #
              # For updated Windows 2000/XP clients,
              # to support old clients as well, use leftprotoport=17/%any
              leftprotoport=17/1701
              #
              # The remote user.
              #
              right=%any
              rightprotoport=17/1701


    • /etc/ipsec.secretsの設定
      今回はL2TP/IPsec-PSK(事前共有キー使用タイプ)を構築しますので、事前共有キーを登録します。
      事前共有キーを定義するファイル/etc/ipsec.secretsを次のように作成します。
      ただし、$〜、をそれぞれ以下に置換します。
      • $ipsec_psk - IPsec暗号化用事前共有キー(任意の文字列)
      ファイル /etc/ipsec.secrets include /etc/ipsec.d/*.secrets
      : PSK "$ipsec_psk"
  4. Poptopのセットアップ(PPTP向け)
    • まず、Poptopをインストールします。
      http://sourceforge.net/projects/poptop/より最新のFedora向けpptpd RPMパッケージをダウンロードします。
      その後、yumでインストールを行います。
      コマンド wget http://downloads.sourceforge.net/poptop/pptpd-1.3.3-1.fc6.i386.rpm?modtime=1157464682&big_mirror=1
      yum -y install pptpd-1.3.3-1.fc6.i386.rpm
    • /etc/pptpd.confの設定
      /etc/pptpd.confを次のように作成します。ただし、$〜、をそれぞれ以下に置換します。
      • $serv_addr - このサーバのIPv4アドレス
      • $start_ip - VPNクライアントに貸し出すIPv4アドレスの開始アドレス
      • $end_ippart - VPNクライアントに貸し出すIPv4アドレスの終了アドレス
      ※終了アドレスはIPv4アドレスの最後のパートのみを記述します。
      ファイル /etc/pptpd.conf option /etc/ppp/options.pptpd
      localip $serv_addr
      remoteip $start_ip-$end_ippart
    • /etc/ppp/options.pptpdの設定
      /etc/ppp/options.pptpdを次のように作成します。ただし、$〜、をそれぞれ以下に置換します。
      • $dns_addr - DNSサーバのIPv4アドレス
      • $wins_addr - WINSサーバのIPv4アドレス(このサーバのIPv4アドレス)
      ファイル /etc/ppp/options.pptpd nodefaultroute
      auth
      refuse-pap
      refuse-chap
      refuse-mschap
      require-mschap-v2
      require-mppe-128
      ms-dns $dns_addr
      ms-wins $wins_addr
      proxyarp
      debug
      lock
      nobsdcomp
      novj
      novjccomp
      logfile /var/log/pptpd.log
  5. WINSサーバのセットアップ
    • WINSサーバはWindowsXPでは必要ないのですが、WindowsMobileから接続する場合、
      無いとSambaへ接続できなくなったり、名前解決に不都合が生じたりしますので、構築しておくことをお勧めします。
      WINSサーバはSambaに一緒に搭載されていますので、今回はSambaをインストールしこれをWINSサーバとして動作させます。
      Sambaはyumでインストールすることが可能です。
      コマンド yum -y install samba
    • /etc/samba/smb.confの設定
      /etc/samba/smb.confを次のように作成します。ただし、$〜、をそれぞれ以下に置換します。
      • $net_addr - プライベートネットワークのIPv4アドレスのネットワークアドレス
      • $net_mask - プライベートネットワークのサブネットマスク
      ファイル /etc/samba/smb.conf [global]

              workgroup      = WORKGROUP
              server string  = "WORKGROUP GatewayServer"

              netbios name   = gateway
              socket options = TCP_NODELAY

              hosts allow    = 127. $net_addr/$net_mask

              log file = /var/log/samba/samba-log.log
              max log size = 50

              encrypt passwords = yes
              security          = user
              passdb backend    = tdbsam

              dns proxy = yes
              load printers = no
              cups options = raw
              wins support = yes
              domain master = yes
  6. IPv4パケットフォワードの設定
    • カーネルパラメータの設定
      次のコマンドを実行し、/etc/sysctl.confにipv4パケットフォワードを許可するカーネルパラメータを追加します
      コマンド sysctl -w net.ipv4.ip_forward=1 > /dev/null
      sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf
      echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
    • ファイヤーウォール(iptables)の設定
      iptablesの設定ファイルiptables.shを任意の場所で作成し、次のように記述します。
      ただし、$〜はそれぞれ次のように置換します。
      • $net_addr - プライベートネットワークのIPv4アドレスのネットワークアドレス
      • $net_mask - プライベートネットワークのサブネットマスク
      ファイル iptables.sh #!/bin/sh

      LOCALNET=$net_addr/$net_mask
      /etc/rc.d/init.d/iptables stop

      #---------------------
      # デフォルト設定
      #---------------------
      iptables -P INPUT   DROP   # 受信はすべて破棄
      iptables -P OUTPUT  ACCEPT # 送信はすべて許可
      iptables -P FORWARD DROP   # 通過はすべて破棄

      #---------------------
      # セキュリティ設定
      #---------------------

      # SYN Cookiesを有効にする
      sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
      sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
      echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf

      # ブロードキャストアドレス宛pingには応答しない
      sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
      sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
      echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf

      # ICMP Redirectパケットは拒否
      sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
      for dev in `ls /proc/sys/net/ipv4/conf/`
      do
          sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
          echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
      done

      # Source Routedパケットは拒否
      sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
      for dev in `ls /proc/sys/net/ipv4/conf/`
      do
          sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
          echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
      done

      # Send Redirectsはしない
      sed -i '/net.ipv4.conf.*.send_redirects/d' /etc/sysctl.conf
      for dev in `ls /proc/sys/net/ipv4/conf/`
      do
          sysctl -w net.ipv4.conf.$dev.send_redirects=0 > /dev/null
          echo "net.ipv4.conf.$dev.send_redirects=0" >> /etc/sysctl.conf
      done

      #---------------------
      # INPUT設定
      #---------------------

      # localhostからの接続は全て許可
      iptables -A INPUT -i lo -j ACCEPT
      iptables -A INPUT -s $LOCALNET -j ACCEPT

      # 接続が確立したコネクションに対する応答は許可
      iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

      # IDENT(ポート113)はReject ※サーバーのレスポンス低下対策
      iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

      #---------------------
      # OUTPUT設定
      #---------------------
      iptables -A OUTPUT -d ! $LOCALNET -p udp --dport 137:139 -j DROP
      iptables -A OUTPUT -d ! $LOCALNET -p tcp --dport 137:139 -j DROP
      iptables -A OUTPUT -d ! $LOCALNET -p tcp --dport 445 -j DROP

      #---------------------
      # FORWARD設定
      #---------------------
      iptables -A FORWARD -s $LOCALNET -j ACCEPT

      #---------------------
      # 各種サーバ設定
      #---------------------

      # DNSサーバー
      #iptables -A INPUT -p tcp --dport 53 -s $LOCALNET -j ACCEPT
      #iptables -A INPUT -p udp --dport 53 -s $LOCALNET -j ACCEPT

      # DHCPサーバー
      #iptables -A INPUT -p udp --dport 67 -s $LOCALNET -j ACCEPT

      # SSHサーバー
      #iptables -A INPUT -p tcp --dport 22 -s $LOCALNET -j ACCEPT

      # NTP Server
      #iptables -A INPUT -s $LOCALNET -p udp --dport 123 -j ACCEPT

      # Samba(WINS) Server
      iptables -A INPUT -s $LOCALNET -p udp --dport 137:139 -j ACCEPT
      iptables -A INPUT -s $LOCALNET -p tcp --dport 137:139 -j ACCEPT
      iptables -A INPUT -s $LOCALNET -p tcp --dport 445 -j ACCEPT

      # L2TP/IPSec
      iptables -A INPUT -p tcp --dport 1701 -j ACCEPT
      iptables -A INPUT -p udp --dport 1701 -j ACCEPT
      iptables -A INPUT -p udp --dport 500 -j ACCEPT
      iptables -A INPUT -p tcp --dport 500 -j ACCEPT
      iptables -A INPUT -p tcp --dport 4500 -j ACCEPT
      iptables -A INPUT -p udp --dport 4500 -j ACCEPT
      iptables -A INPUT -p esp -j ACCEPT

      # PPTP
      iptables -A INPUT -p gre -j ACCEPT
      iptables -A INPUT -p tcp --dport 1723 -j ACCEPT

      #----------------------
      # ログ記録
      #----------------------

      iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
      iptables -A INPUT -j DROP

      iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
      iptables -A FORWARD -j DROP


      #---------------------
      # 設定保存/有効化
      #---------------------

      # 再起動時にも上記設定が有効となるようにルールを保存
      /etc/rc.d/init.d/iptables save

      # ファイアウォール起動
      /etc/rc.d/init.d/iptables start

      最後に、次のコマンドを実行し、IPv4ファイヤーウォールを有効にします。
      コマンド chmod 755 iptables.sh
      ./iptables.sh
      chkconfig iptables on
  7. VPNサーバ自動起動の設定
    • 最後に、VPNサーバを起動し、起動時に自動で起動するよう設定します。
      設定は次のコマンドで可能です。
      コマンド chkconfig iptables on
      chkconfig xl2tpd on
      chkconfig ipsec on
      chkconfig pptpd on
      chkconfig smb on
      chkconfog nmb on
      /etc/rc.d/init.d/xl2tpd start
      /etc/rc.d/init.d/ipsec start
      /etc/rc.d/init.d/pptpd start
      /etc/rc.d/init.d/smb start
      /etc/rc.d/init.d/nmb start

以上でサーバー側の設定は終了です。
各種デーモンが起動時にエラーを出さなければOKです。
WindowsXPやWindowsMobileのL2TP/IPsecクライアントで接続して正しく接続できることを確認してください。
スクリプトのご利用にあたって すべて無保証です。ご利用の際は自己責任でお願いいたします。