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

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

  1. SELinuxを無効にする
    セキュリティ系の何かで、いつも切られてるやつを例によって無効化。なにに使うんだろうこれ。`/etc/sysconfig/selinux`を編集。
    
      ```bash:/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:
        (後略)
      ```
      
      編集後再起動で反映される。    
  1. epelリポジトリを追加
    必要なパッケージのあるリポジトリが標準で追加されていないので追加。
    
      ```
      $ sudo yum install epel-release
      $ sudo yum update
      ```
      
  1. パッケージのインストール
    必要なパッケージは **xl2tp**と **libreswan**、検証用に **lsof**(これはすでに入ってる可能性あり)
    
      ```
      $ sudo yum install xl2tpd libreswan lsof
      ```

  1. 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
        ```
        
     1. 設定の編集 以下は自分の場合
		* 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
        
        最近のアップデートで`crtscts`と`lock`というオプションがなくなったらしく、これをコメントアウトしないと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" "シークレット" *
        ```
        
  1. IPsecの設定
    上と同じ感じ。
	  1. 設定ファイルのバックアップ
        
        ```
       	$ sudo cp /etc/ipsec.conf /etc/ipsec.conf.origin
        ```
            
      1. 設定の編集
	      * 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 "事前共有鍵"
             ```
          
  1. ファイヤウォールの設定
    必要なサービスとポートを解放する。
    環境がNATの中の場合はこれとは別にルーターでポート開放設定の必要あり
    
      ```bash
      # 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
      ```

  1. カーネルパラメータの変更
    この設定がないと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
      ```
  
  1. 起動の確認
    lsofを実行して、1701ポートをLISTENしていればサービスは動いてる。
    
      ```bash
      # 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](http://d.hatena.ne.jp/xlc/20170804/1501857811)
  > CentOS6/7 で VPN 構築 
     [http://mix3.github.io/blog/2015/05/09/20150509/](http://mix3.github.io/blog/2015/05/09/20150509/)
  > CentOS7のL2TP仕様が若干変わっていた 
     [https://ameblo.jp/j-drucker/entry-12240489746.html](https://ameblo.jp/j-drucker/entry-12240489746.html)