LoginSignup
19
20

More than 3 years have passed since last update.

CentOS7でl2tp方式のVPNサーバーを建てる

Last updated at Posted at 2017-11-10

options.xl2tpdのオプションで引っかかったのでかきかき

  1. SELinuxを無効にする
    セキュリティ系の何かで、いつも切られてるやつを例によって無効化。なにに使うんだろうこれ。/etc/sysconfig/selinuxを編集。

    /etc/sysconfig/selinux
        # This file controls the state of SELinux on the system.
        # SELINUX= can take one of these three values:
        #     enforcing - SELinux security policy is enforced.
        #     permissive - SELinux prints warnings instead of enforcing.
        #     disabled - No SELinux policy is loaded.
        #SELINUX=enforcing <- コメントアウト
        SELINUX=disabled   <- 追記
        # SELINUXTYPE= can take one of three two values:
        (後略)
    

    編集後再起動で反映される。

  2. epelリポジトリを追加
    必要なパッケージのあるリポジトリが標準で追加されていないので追加。

      $ sudo yum install epel-release
      $ sudo yum update
    
  3. パッケージのインストール
    必要なパッケージは xl2tplibreswan、検証用に lsof(これはすでに入ってる可能性あり)

      $ sudo yum install xl2tpd libreswan lsof
    
  4. xl2tpの設定
    ここからはrootになっていたほうが都合がいい

    1. 設定ファイルのバックアップ

      # cp /etc/xl2tpd/xl2tpd.conf /etc/xl2tpd/xl2tpd.conf.origin
      # cp /etc/ppp/options.xl2tpd /etc/ppp/options.xl2tpd.origin
      # cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.origin
      
    2. 設定の編集 以下は自分の場合

      • xl2tpd.conf
      xl2tpd.conf
      (前略)
      [global]
      listen-addr = (サーバーのグローバルip)
      (中略)
      [lns default]
      ip range = 192.168.11.201-192.168.11.221 (クライアントに割り当てるローカルip)
      local ip = (サーバーのローカルip)
      require chap = yes
      refuse pap = yes
      require authentication = yes
      name = xl2tpd <- ここはこうした方が安心らしい?
      (後略)
      
      • options.xl2tpd

      最近のアップデートでcrtsctslockというオプションがなくなったらしく、これをコメントアウトしないとxl2tpが起動に失敗してしまう。

      options.xl2tpd
      (前略)
      #crtscts
      (中略)
      #lock 
      (中略 末尾に追加)
      name xl2tpd
      refuse-pap
      refuse-chap
      refuse-mschap
      require-mschap-v2
      persist
      logfile /var/log/xl2tpd.log
      

      ついでにこのログファイルも作っておく

      # touch /var/log/xl2tpd.log
      
      • chap-secrets
      chap-secrets
      # Secrets for authentication using CHAP
      # client        server  secret                  IP addresses
      "ユーザー名" "xl2tpd" "シークレット" *
      
  5. IPsecの設定
    上と同じ感じ。

    1. 設定ファイルのバックアップ

      $ sudo cp /etc/ipsec.conf /etc/ipsec.conf.origin
      
    2. 設定の編集

      • ipsec.conf

        ipsec.conf
        (前略)
        include /etc/ipsec.d/*.conf <- コメントアウトされていた場合は外す
        
      • /etc/ipsec.d/l2tp-ipsec.conf (新規作成)

        /etc/ipsec.d/l2tp-ipsec.conf
        conn L2TP-PSK-NAT
            rightsubnet=0.0.0.0/0
            dpddelay=10
            dpdtimeout=20
            dpdaction=clear
            forceencaps=yes
            also=L2TP-PSK-noNAT
        conn L2TP-PSK-noNAT
            authby=secret
            pfs=no
            auto=add
            keyingtries=3
            rekey=no
            ikelifetime=8h
            keylife=1h
            type=transport
            left=(サーバーのローカルip)
            leftprotoport=17/1701
            right=%any
            rightprotoport=17/%any
        
      • /etc/ipsec.d/default.secrets (新規作成)

         : PSK "事前共有鍵"
        
  6. ファイヤウォールの設定
    必要なサービスとポートを解放する。
    環境がNATの中の場合はこれとは別にルーターでポート開放設定の必要あり

      # firewall-cmd --permanent --add-service=ipsec
      # firewall-cmd --permanent --add-port=1701/udp
      # firewall-cmd --permanent --add-port=4500/udp
      # firewall-cmd --permanent --add-masquerade
      # firewall-cmd --reload
    
  7. カーネルパラメータの変更
    この設定がないとipsecが怒る(無知)。/etc/sysctl.d/60-ipsec.confを作成して内容を以下の様にする。ただし、np63s0の箇所はそれぞれのネットワークアダプタ名に置換する必要がある。ネットワークアダプタ名は$ip aで調べられる

      net.ipv4.ip_forward = 1
      net.ipv4.conf.all.accept_redirects = 0
      net.ipv4.conf.all.rp_filter = 0
      net.ipv4.conf.all.send_redirects = 0
      net.ipv4.conf.default.accept_redirects = 0
      net.ipv4.conf.default.rp_filter = 0
      net.ipv4.conf.default.send_redirects = 0
      net.ipv4.conf.np63s0.accept_redirects = 0
      net.ipv4.conf.np63s0.rp_filter = 0
      net.ipv4.conf.np63s0.send_redirects = 0
      net.ipv4.conf.lo.accept_redirects = 0
      net.ipv4.conf.lo.rp_filter = 0
      net.ipv4.conf.lo.send_redirects = 0
    

    (2020/08/07 追記)
    構成によっては下記の設定が有効or必要なようです
    net.ipv4.ip_nonlocal_bind = 1

    ちなみにこの設定は下記のような設定項目です。ルーターによる静的なIP割当をしているときや構成によってはこの設定がなのかもです。

    /proc/sys/net/ipv4/ip_nonlocal_bind
    アプリケーションを自分のシステムには属していないデバイスにバインドさせたければ、 これを設定してください。 これはマシンの接続が永続的でない (あるいは動的な) 場合、 接続が切れたときにもサービスが起動して特定のアドレスに バインドできるようにするのに便利です。
    出典: Linux Advanced Routing & Traffic Control HOWTO 日本語訳版
    (https://linuxjf.osdn.jp/JFdocs/Adv-Routing-HOWTO/lartc.kernel.obscure.html)

(追記ここまで @yaztak1227 さんありがとうございます!)
作成後適用する。

  ```
  # sysctl --system
  ```
  1. サービスの有効化と再起動
    以下のコマンドでサービスを有効化&再起動

      # systemctl enable ipsec
      # systemctl enable xl2tpd
      # systemctl restart ipsec
      # systemctl restart xl2tpd
    
  2. 起動の確認
    lsofを実行して、1701ポートをLISTENしていればサービスは動いてる。

      # lsof -i:1701
      COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      xl2tpd  3505 root    3u  IPv4  33488      0t0  UDP hostname:l2tp
    

参考:
L2TP/IPsec VPNサーバの構築
http://d.hatena.ne.jp/xlc/20170804/1501857811
CentOS6/7 で VPN 構築
http://mix3.github.io/blog/2015/05/09/20150509/
CentOS7のL2TP仕様が若干変わっていた
https://ameblo.jp/j-drucker/entry-12240489746.html

19
20
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
20