【構築】CentOS7+VPN+docker：Nuxt.js+wordpress開発/公開環境(VPSセットアップ編)

# これはなに？
こんにちわ！ナギちゃんだよー☆
きょーはさくらのVPSにかんたんコピペですぱっとインスタ映えしそうなブログサーバをたてるよー！

はい。

長いので

- VPSセットアップ編（いまここ）
- コンテナ構築編
- Nuxt+Wordpress編

に分割しました。今回はまずVPSサーバのセットアップを行います。
めんどうな方は巻末袋とじの**わくわく初心者シェル芸人デビューセット**をスタートアップスクリプトでチンすれば５分くらいで起動します。

#なにができるの？
- 複数プロジェクトを開発しているけど、開発中のは公開したくない開発用サーバ
- でもbasic認証とかで非公開にするのはアホっぽいのでヤダな開発サーバ
- でも開発がめんどくさくなるのもヤダな開発サーバ
- 開発箇所に直でsshできてほしい開発サーバ（VScodeてきに）
- ブログエンジンはwordpressそのままのブログサーバ
- サービスの「開発者ブログ☆」みたいなやつ生WPだと萎えるのでどうにかしたいサーバ
- そこまで強固なセキュリティではないサーバ
- dockerのお勉強
- クラウドよりやすい（ばあいによります）

などにつかえなくもなくもないかもしれないしつかえるときがなくもないかもしれますん。

# なんで？
さくらのVPSであそんでいたところ、まちがえてWordpress用サーバをOSごとふきとばしてしまったので（エラー事故だ･･･）せっかくならと勉強がてらにいろいろ構築することにしました

>- docker：なんかすごいらしい
>- Nuxt.js：なんかすごいらしい
>- nginx：アパッチ族なので今日まで葱エックスだとおもってた
>- wordpress：NuxtからAPI叩く＋エディタ目的
>- mariadb：wordpress用

あたりをさわってみることとして

>- インターネットから見れるWeb公開用コンテナがある
>- 外からみられない開発用コンテナもつくれる
>- VPN接続時のみ各コンテナにsshで接続できる（VScode用）
>- VPN接続時のみ開発中プロジェクトが見れる
>- VPNはWindos/Mac/Android/iPhoneから接続可能
>- k8sはまだいらないかなぁ

というかんじのやつを構築したいきがしてきました。人類はwordpressから脱却できないのだ･･･。

### 備考
さくらのVPSにはdockerやk8sスタートアップスクリプトがあるので、普通にdocker/k8s環境がほしい場合は１クリックで終了します。こちらを考慮にいれてもよいでしょう。

# じゅんび？
### 環境
>・[サーバ] さくらのVPS 2CORE/1G　/ CentOS7
>・[クライアント] Windows10　/ Teraterm

### 変数
以下をきめておいてください。以降コマンド内部の変数部分も以下のように記述しています。

| param        | description    |sample    |
|:--------------|:---------------------------------|:-----------------------|
|${IPアドレス}|インターネットから接続するときのサーバIPアドレス|111.222.333.444|
|${ホスト名}|VPSサーバにつけたい名前|testserver001|
|${ローカルIPアドレス}|VPN接続時のサーバのローカルIPアドレス|192.168.1.254|
|${ローカルIPアドレスレンジ}|VPN接続時にクライアントに割り振られるIPアドレスレンジ|192.168.1.1-192.168.1.128|
|${サーバsshポート}|サーバにsshするときのポート番号|20000|
|${サーバユーザ名}|サーバにsshするときのユーザ名|yourname|
|${ユーザパスワード}|suするときのパスワード|yourpassword|
|${サーバssh公開鍵}|サーバにsshするときの公開鍵|ssh-rsa AAA...=passphrase|
|${サーバsshパスフレーズ}|ssh鍵のパスフレーズ|yourpassphrase|
|${VPN事前共有キー}|VPN事前共有キー|yourpresharedkey|
|${VPNユーザ名}|ssh鍵のパスフレーズ|yourname|
|${VPNパスワード}|ssh鍵のパスフレーズ|yourpassword|

### ssh鍵
サーバにsshするときのrsa鍵を作成しておきます。
Teratermにて作成する場合は以下です。

>・[Setup] → [SSH KeyGenerator]
>
>・[RSA]：チェック
>・[Key Bits]："2084"
>・[Generate]：クリック
>・[Passphrase]：好きなパスフレーズを入力
>・[Confirm passphrase]：好きなパスフレーズを再入力
>
>・[Save public key]：PCに保存
>・[Save private key] ：PCに保存

---
#VPSサーバ基本設定
さてさてはじめていきましょう。
さくらのVPSコントロールパネルから、`[スタートアップスクリプトなし]`で`CentOS7`をインストール完了した状態とします。
まずはサーバ諸々の設定から。お好みな部分はお好みで調整してください。
なお初期sshは、`VPSサーバIPアドレス`＋`Port：22`+`User：root`＋`Password：OSインストール時に入力したパスワード`です。

### アップデート
```shell:ssh
[root@IK1234SAKURA ~]# 	yum -y update
```

###ホスト名変更
```shell:ssh
[root@IK1234SAKURA ~]# 	hostnamectl set-hostname ${好きなホスト名}
```

####ユーザ追加
サーバにログインする人数ぶん作成してください。
[コンテナだけにログインできればいい人]のアカウントは、ここで作成する必要はありません。

```shell:ssh
[root@IK1234SAKURA ~]# 	useradd -mG wheel ${サーバユーザ名}
[root@IK1234SAKURA ~]# 	passwd ${サーバユーザ名}
[root@IK1234SAKURA ~]# 	${ユーザパスワード}
[root@IK1234SAKURA ~]# 	${ユーザパスワード}
```
	
###SELinux無効化	
Edgeちゃんなみに不憫な子。さくらは標準でdisabledですがいちおう確認

```shell:ssh
[root@IK1234SAKURA ~]# 	getenforce
>	Disabled
```

###swap無効化
dockerがイヤがるためswapを停止します。最終行をコメントアウト
	
```shell:ssh
[root@IK1234SAKURA ~]# 	swapoff -a
[root@IK1234SAKURA ~]# 	vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Sep 14 01:16:44 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=c9321269-7178-43b4-b696-4de4e92a4518 /                       xfs     defaults        0 0
UUID=babdb772-614a-4bc8-8ee1-ccf2739a7bb6 /boot                   xfs     defaults        0 0
#UUID=6a383227-8a0f-4415-8c25-846f0c01717c swap                    swap    defaults        0 0
```

### 不要サービス停止
お好みでどうぞ

```shell:ssh
[root@IK1234SAKURA ~]# 	systemctl stop postfix
[root@IK1234SAKURA ~]# 	systemctl disable postfix
[root@IK1234SAKURA ~]# 	systemctl stop chronyd
[root@IK1234SAKURA ~]# 	systemctl disable chronyd
```

### Port111サービス停止
いらない機能なので止めます。Socketの３行をコメントアウト。お好みでどうぞ。

```shell:ssh
[root@IK1234SAKURA ~]# 	cp -a /usr/lib/systemd/system/rpcbind.socket /etc/systemd/system/
[root@IK1234SAKURA ~]# 	vi /etc/systemd/system/rpcbind.socket
	
[Unit]
Description=RPCbind Server Activation Socket	
[Socket]
ListenStream=/var/run/rpcbind.sock
#ListenStream=[::]:111
#ListenStream=0.0.0.0:111
#BindIPv6Only=ipv6-only
[Install]
WantedBy=sockets.target
```

### 必要そうなサービス追加＋git update
お好みでどうぞ

```shell:ssh
# sshやVPN接続を検知したらslack通知とかしたいのでswatchもいれました
[root@IK1234SAKURA ~]# 	yum -y install swatch
# めんどうなのでyumでできる範囲でgitをupdateしておきます
[root@IK1234SAKURA ~]# 	yum -y remove git
[root@IK1234SAKURA ~]# 	yum -y install https://centos7.iuscommunity.org/ius-release.rpm
[root@IK1234SAKURA ~]# 	yum -y install git2u yum-utils
[root@IK1234SAKURA ~]# 	yum-config-manager --disable ius
```

---
#firewalld設定
dockerやk8sいれてる例ではだいたい平然と停止されていますが普通につかいます。特に困ることもありません。インストール直後のssh:Port22のまま放置しているとめちゃくちゃ攻撃をうけているのが確認できますので、ドメインとってなくても油断しないほうがよさそうです。

VPSのeth0は、dropゾーンをアクティブとし（publicとか編集してもよいのですが）インターネットむけに許容するポートのみを開放します。
また、VPN接続時には仮想IFとしてpppが立ち上がるので、これには広く許容するvpnゾーンを適用します。こちらは適時開放してもよいですし、そんなに気にしないなら全部ぶちあけてもいいかもしれません。

※このタイミングでどのようにfirewalldを設定/reloadしても、すでに接続中の通信は切断されません
※万が一しんでしまった場合は`[さくらのVPSコントロールパネル]`の`[コンソール]`から接続できます
※もっとかっこいい設定を知っている方はぜひご教示ください･･･

```shell:ssh
#デフォルトゾーンをdropに
[root@IK1234SAKURA ~]# 	firewall-cmd --set-default-zone=drop

#インターネットからの接続時の設定
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-interface=eth0 --zone=drop
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=${サーバsshポート}/tcp --zone=drop
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=80/tcp --zone=drop
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=443/tcp --zone=drop
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=1701/udp --zone=drop
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=500/udp --zone=drop
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=4500/udp --zone=drop
[root@IK1234SAKURA ~]# firewall-cmd --reload

#VPN接続用ゾーン作成
[root@IK1234SAKURA ~]# firewall-cmd --new-zone vpn --permanent
[root@IK1234SAKURA ~]# firewall-cmd --reload
[root@IK1234SAKURA ~]# firewall-cmd --permanent --zone=vpn --set-target=ACCEPT

#VPN接続時の設定
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-interface=ppp0 --zone=vpn
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-source=192.168.0.0 --zone=vpn
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=20-60000/tcp --zone=vpn

#いちおうポートスキャン対策
[root@IK1234SAKURA ~]# firewall-cmd --permanent --direct --add-chain ipv4 filter port-scan
[root@IK1234SAKURA ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 400 -i eno16777736 -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j port-scan
[root@IK1234SAKURA ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter port-scan 450 -m limit --limit 1/s --limit-burst 4 -j RETURN
[root@IK1234SAKURA ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter port-scan 451 -j LOG --log-prefix "IPTABLES PORT-SCAN:"
[root@IK1234SAKURA ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter port-scan 452 -j DROP
	
[root@IK1234SAKURA ~]# firewall-cmd --reload
```

### インターネットむけに許容するポートについて
以下用途からお好みで調整してください。VPN用のudpポートのみ必須です。

>- 80/tcp：インターネットからブログ見る用
>- 443/tcp：インターネットからブログ見る用
>- 1701/udp：VPN：xl2tpd用です。変更はできません
>- 500/udp：VPN：IPSec用です。変更はできません
>- 4500/udp：VPN：IPSec用です。変更はできません
>- ${サーバsshポート}/tcp：サーバへsshする用（VPN接続時のみsshを許容したい場合は塞ぐ）

### インターネットむけに許容するポートを開けたい場合
以下コマンドで穴をふやしてください

```shell:ssh
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=${使うポート}/tcp --zone=drop
[root@IK1234SAKURA ~]# firewall-cmd --reload
```

### VPN接続時のみ許容するポートを開けたい場合
以下コマンドで穴をふやしてください

```shell:ssh
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=${VPN時のみ使うポート}/tcp --zone=vpn
[root@IK1234SAKURA ~]# firewall-cmd --reload
```

### 同時に複数人がVPN接続する場合
前述しましたが、VPN接続時には接続に応じてppp仮想インターフェイス(eth0みたいなもの)がたちあがります。１回線目はppp0、２回線目はppp1...というかんじにふえていくので、同時に複数のVPN接続が想定される場合は以下のようにすきなだけ増やしていってください。（ここを変数対応にする方法はわかりませんでした･･･）

```shell:ssh
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-interface=ppp1 --zone=vpn
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-interface=ppp2 --zone=vpn
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-interface=ppp3 --zone=vpn
[root@IK1234SAKURA ~]# firewall-cmd --reload
```

---
#SSH設定
### ssh.conf

```shell:ssh
[root@IK1234SAKURA ~]# 	cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
[root@IK1234SAKURA ~]# 	cat <<EOF >  /etc/ssh/sshd_config
Protocol 2
Port $SSH_PORT
ListenAddress 0.0.0.0

AllowUsers　${サーバユーザ名}
SyslogFacility AUTHPRIV
PermitRootLogin no
PubKeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
ChallengeResponseAuthentication no
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UsePrivilegeSeparation sandbox

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

Subsystem sftp /usr/libexec/openssh/sftp-server
EOF
```

###SSH鍵設置
```shell:ssh
sudo su - ${すきなユーザ名} <<EOF
  mkdir .ssh
  chmod 700 .ssh
  cat <<EOS > ~/.ssh/authorized_keys
    ${SSH公開鍵}
EOS
  chmod 600 ~/.ssh/authorized_keys
EOF
```

###ssh起動
```shell:ssh
[root@IK1234SAKURA ~]# systemctl restart sshd
```
---
#VPN設定
標準的なL2TP/IPSecを用いたVPNを設定します。L2TP：Layer 2 Tunneling Protocolというと「インターネットの中にトンネル（チューブ）のようなものができて専用線ができる！」みたいなイメージになってしまいますが、トンネル＝カプセル化を意識したほうがイメージしやすくなります。

カプセル化といっても
「192.168.0.1さんに送るデータ」を「111.222.333.444さんに送るデータ（192.168.0.1さんに送るデータ）」というように包み込むことで、違うネットワークにいるノード間でもLANのような通信ができる、というものです。

L2TPはVPNを構築するために作られたものなので、秘匿性はもっていません。カプセルが透明なので中身が見えてしまうような状態であり、これを不透明にするためにIPSecを用います。
古来LinuxむけIPSecとしてOpenswanがつくられ、RedHat系はLibreswanに、Debian系はStrongswanになったそうです。なのでほとんど選択肢はありません。

###xl2tpd+IPSecインストール

```shell:ssh
[root@IK1234SAKURA ~]# yum -y install xl2tpd libreswan
```

###xl2tpd設定：基本設定
VPN接続されたクライアントに割り振られるローカルIPアドレスと、VPN接続時のサーバ側IPアドレスを指定しておきます

```shell:ssh
[root@IK1234SAKURA ~]# cp /etc/xl2tpd/xl2tpd.conf /etc/xl2tpd/xl2tpd.conf.origin
[root@IK1234SAKURA ~]# cat <<EOF >  /etc/xl2tpd/xl2tpd.conf
[global]
[lns default]
  ip range = ${ローカルIPアドレスレンジ}
  local ip = ${ローカルIPアドレス}
  require chap = yes
  refuse pap = yes
  require authentication = yes
  name = xl2tpd
  ppp debug = yes
  pppoptfile = /etc/ppp/options.xl2tpd
  length bit = yes
  
EOF
```

###xl2tpd設定：ppp設定
とりあえずmschap-v2のみ許容していますが、ダメなやつなきがするのでどうにかできないかは調査中･･･

```shell:ssh
[root@IK1234SAKURA ~]# cp /etc/ppp/options.xl2tpd /etc/ppp/options.xl2tpd.origin
[root@IK1234SAKURA ~]# cat <<EOF >  /etc/ppp/options.xl2tpd
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
auth
idle 1800
mtu 1280
mru 1280
nodefaultroute
debug
proxyarp
connect-delay 5000

name xl2tpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
persist
logfile /var/log/xl2tpd.log

EOF
```

###secrets設定
VPN接続するユーザぶん記述してください

```shell:ssh
[root@IK1234SAKURA ~]# cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.origin
[root@IK1234SAKURA ~]# vi /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
"${VPNユーザ名}" "xl2tpd" "${VPN接続パスワード}" *
"${VPNユーザ名}" "xl2tpd" "${VPN接続パスワード}" *
"${VPNユーザ名}" "xl2tpd" "${VPN接続パスワード}" *

```

###IPSec設定

```shell:ssh
[root@IK1234SAKURA ~]# cp /etc/ipsec.conf /etc/ipsec.conf.origin
[root@IK1234SAKURA ~]# cat <<EOF >  /etc/ipsec.conf
config setup
  protostack=netkey
  plutodebug=none
  virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10
  nat_traversal=yes

include /etc/ipsec.d/*.conf

EOF
```

###IPSec設定
インデントがないとIPSecが死ぬようです

```shell:ssh
[root@IK1234SAKURA ~]# cat <<EOF >  /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=%defaultroute
  leftprotoport=17/1701
  right=%any
  rightprotoport=17/%any

EOF
```

###secrets設定
なぜか最後に改行ないとIPSecが死ぬようです

```shell:ssh
[root@IK1234SAKURA ~]# cat <<EOF >  /etc/ipsec.d/default.secrets
: PSK ${VPN事前共有キー}

EOF
```

###パラメータ追加
もし違うVPSなどでif名が違う場合は「eth0」を該当のif名に書き換えてください

```shell:ssh
[root@IK1234SAKURA ~]# cat <<EOF >  /etc/sysctl.d/60-ipsec.conf
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.eth0.accept_redirects = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.lo.send_redirects = 0

EOF

[root@IK1234SAKURA ~]# sysctl --system
```

#接続試験＋再起動

###VPN接続試験
WindowsでVPN接続をセットアップしてみましょう。

###Windows10の場合
基本設定をします

- [スタート]→[設定]→[ネットワークとインターネット]→[VPN接続を追加する]	
- 接続名：${すきな接続名}
- サーバ名またはアドレス：${サーバIPアドレス}	
- VPNの種類：事前共有キーを使ったL2TP/IPsec	
- 事前共有キー ${VPN事前共有キー}	
- サインイン情報の種類：ユーザ名とパスワード	
- ユーザー名(オプション)：${VPN接続ユーザ名}
- パスワード(オプション)：${VPN接続パスワード}
- 保存		[保存]	

詳細設定をします

- 詳細設定→[アダプターのオプションを変更する]	
- 詳細設定→[ネットワーク接続]→[${上で設定した接続名}]→[右クリック]→[プロパティ]			
- VPN接続設定：[セキュリティ]→[VPNの種類]：IPSecを利用したレイヤー２トンネリングプロトコル	
- [詳細設定]→[認証に事前共有キーを使う]→${事前共有キー}
- [OK]	
- [データの暗号化]：[最強の暗号化（サーバーが拒否する場合は切断します]	
- [認証]：[次のプロトコルを許可する]	
- [チャレンジハンドシェイク認証プロトコル]（チェックする）
- [Microsoft CHAP Version 2]（チェックする）
			
VPN接続時、インターネットとの通信はVPSサーバを通さないようにします
- [ネットワーク接続]→[${上で設定した接続名}]→[右クリック]→[プロパティ]	
- [ネットワーク]：[インターネットプロトコルバージョン4]→[プロパティ]	
- [全般]：[詳細設定]→[リモートネットワークでデフォルトゲートウェイを使う]のチェックを外す

###再起動
確認できたら再起動を行い、その後もssh,VPNともに接続できることを確認してください

#dockerインストール
バージョン指定してdockerをインストールします。ほぼ公式通り。

###dockerインストール
```shell:ssh
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate  docker-logrotate  docker-engine
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install $DOCKER_CE_VERSION $DOCKER_CLI_VERSION containerd.io
```

###docker設定
IPv4フォワーディングを追加＋永続化

```shell:ssh
cat <<EOF >  /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

# Use IPx4 forwarding
net.ipv4.ip_forward=1

# Do not accept RA
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.eth0.accept_ra=0
# Do not use IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

EOF

cat <<EOF >  /proc/sys/net/ipv4/ip_farward
1
EOF
```

daemon.jsonを作成し、cgroupをsystemdに、strage-driverをoverray2に設定します。
cgroupは、k8s使う場合も考えここでsystemdに寄せたほうが楽な気がします。
strage-driverについては、以前（？）はCentOS向けはdevicemapper推奨だったようです。過去devicemapperにしたのですがいろいろうまく動きませんでした。[現在はoverray2推奨](https://docs.docker.com/storage/storagedriver/select-storage-driver/#supported-storage-drivers-per-linux-distribution)になっているようです

```shell:ssh
mkdir -p /etc/docker
cat <<EOF >  /etc/docker/daemon.json
{
  "exec-opts": [
    "native.cgroupdriver=systemd"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
```

docker起動し、ユーザグループを指定して、各ユーザでもdockerコマンドできるようにしておきます

```shell:ssh
systemctl start docker
systemctl enable docker

groupadd docker
usermod -aG docker {$user}
systemctl restart docker
```

###docker-compose
docker composeもインストールします

```shell:ssh
curl -L $DOCKERCOMPOSE_URL
chmod +x /usr/local/bin/docker-compose
```

---
#再起動
```shell:ssh
reboot
```

起動してsshしてvpnして各サービス起動していれば無事完了です。
おつかれさまでした！

---
#おまけ

##この作業でつかう確認コマンド集

```shell:ssh
#ソフトウェアの動作状態を確認したい
[root@IK1234SAKURA ~]# systemctl status sshd -l
[root@IK1234SAKURA ~]# systemctl status xlt2pd -l
[root@IK1234SAKURA ~]# systemctl status ipsec -l
[root@IK1234SAKURA ~]# systemctl status firewalld -l
[root@IK1234SAKURA ~]# systemctl status docker -l

#ソフトウェアのエラーを確認したい
[root@IK1234SAKURA ~]# journal -xe

#プロセスとポートの状態を確認したい
[root@IK1234SAKURA ~]# netstat -untap

#ファイアウォール状態を確認したい
[root@IK1234SAKURA ~]# firewall-cmd --list-all-zones
```

##よくあるエラー
### l2tpdが起動しない
・だいたいコンフィグがおかしいです。

### IPSecが起動しない
・だいたいコンフィグがおかしいです。インデントとか末尾改行がないと動作しないconfがあるのでチェック

### L2TPは接続されているがIPSecは接続されていない
netstatでxl2tpdはESTABLISHEDになっているのにplutoに接続がない状態はこれです
・クライアントがほかのVPNに接続中ではないか確認する
・クライアントの再起動で治ることがおおいです
・コンテナ側で500/4500ポート使ってたりしないか確認する

### VPN接続時にインターネットに接続できない
・クライアント側の設定が雑魚いです。上記を参照して設定してください

---
#スタートアップスクリプト
さいきんシェル芸人になりたいなぁと思っているのでshellにしてみました。
パラメータを入力して、shするかOSインストール時のスタートアップスクリプトに投入してください

```shell:ssh
#!/bin/bash
## startup_basic.sh
set -x

# =================================================================================
# ==============================SETTING PARAMS=====================================
# =================================================================================
# general
readonly HOSTNAME="serverhostname001"
readonly USER_NAMES=("user01" "user02")
readonly USER_PASSWORD="su - surutokino_password"

#ssh
readonly SSH_PORT=21234
readonly SSH_PUBLIC_KEY="ssh-rsa AAAAB1234567890== passphrase"

#vpn
readonly VPN_LOCAL_IP_ADDR="192.168.1.254"
readonly VPN_REMOTE_IP_RANGE="192.168.1.1-192.168.1.128"
readonly PRE_SHARED_KEY="sukina_psk"

#portset
readonly PORT_FOR_INTERNET=(80/tcp 443/tcp 1701/udp 500/udp 4500/udp)
readonly PORT_FOR_VPN=(20-60000/tcp)
readonly INTERFACE_FOR_VPN=(ppp0 ppp1 ppp2 ppp3 ppp4 ppp5 ppp6 ppp7 ppp8 ppp9)

#docker
readonly DOCKER_CE_VERSION="docker-ce-18.06.1.ce-3.el7"
readonly DOCKER_CLI_VERSION="docker-ce-cli-18.06.1.ce-3.el7"
readonly DOCKERCOMPOSE_INSTALL="https://github.com/docker/compose/releases/download/1.25.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose"
# =================================================================================
# =================================================================================
# =================================================================================

# update
yum -y update
sleep 5

# Change hostname
hostnamectl set-hostname $HOSTNAME
cat <<EOF >  /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=$HOSTNAME
EOF

# Stop services
systemctl stop postfix
systemctl disable postfix
systemctl stop chronyd
systemctl disable chronyd
sleep 5

cp -a /usr/lib/systemd/system/rpcbind.socket /etc/systemd/system/
cat <<EOF >  /etc/systemd/system/rpcbind.socket
[Unit]
Description=RPCbind Server Activation Socket

[Socket]
ListenStream=/var/run/rpcbind.sock

[Install]
WantedBy=sockets.target
EOF

# Add services
yum -y lsof swatch
yum -y remove git
yum -y install https://centos7.iuscommunity.org/ius-release.rpm
yum -y install git2u yum-utils
yum-config-manager --disable ius

# Add users
for user in ${USER_NAMES[@]}; do
  useradd -mG wheel $user
  echo $USER_PASSWORD | passwd --stdin $user
done

# =================================================================================
# Setup ssh
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.default
cat <<EOF >  /etc/ssh/sshd_config
Protocol 2
Port $SSH_PORT
ListenAddress 0.0.0.0

SyslogFacility AUTHPRIV
PermitRootLogin no
PubKeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
ChallengeResponseAuthentication no
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UsePrivilegeSeparation sandbox

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

Subsystem sftp /usr/libexec/openssh/sftp-server

EOF

# Set key of ssh users
for user in ${USER_NAMES[@]}; do
  sudo su - $user <<EOF
  mkdir .ssh
  chmod 700 .ssh
  cat <<EOS > ~/.ssh/authorized_keys
  $SSH_PUBLIC_KEY
EOS
  chmod 600 ~/.ssh/authorized_keys
EOF
done

systemctl restart sshd
sleep 5


# =================================================================================
# setup VPN
yum install xl2tpd libreswan -y

# setup l2tp
cp /etc/xl2tpd/xl2tpd.conf /etc/xl2tpd/xl2tpd.conf.origin
cat <<EOF >  /etc/xl2tpd/xl2tpd.conf
[global]
[lns default]
  ip range = $VPN_REMOTE_IP_RANGE
  local ip = $VPN_LOCAL_IP_ADDR
  require chap = yes
  refuse pap = yes
  require authentication = yes
  name = xl2tpd
  ppp debug = yes
  pppoptfile = /etc/ppp/options.xl2tpd
  length bit = yes
  
EOF

cp /etc/ppp/options.xl2tpd /etc/ppp/options.xl2tpd.origin
cat <<EOF >  /etc/ppp/options.xl2tpd
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
auth
idle 1800
mtu 1280
mru 1280
nodefaultroute
debug
proxyarp
connect-delay 5000

name xl2tpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
persist
logfile /var/log/xl2tpd.log

EOF

cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.origin
secrets=""
for user in ${USER_NAMES[@]}; do
  secrets=$secrets"\"$user\" \"xl2tpd\" \"$USER_PASSWORD\" *""\n"
done

secrets_string=`echo -e "$secrets"`
cat <<EOF >  /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
$secrets_string

EOF

cp /etc/ipsec.conf /etc/ipsec.conf.origin
cat <<EOF >  /etc/ipsec.conf
config setup
  protostack=netkey
  plutodebug=none
  virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10
  nat_traversal=yes

include /etc/ipsec.d/*.conf

EOF


cat <<EOF >  /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=%defaultroute
  leftprotoport=17/1701
  right=%any
  rightprotoport=17/%any

EOF

cat <<EOF >  /etc/ipsec.d/default.secrets
: PSK "$PRE_SHARED_KEY"

EOF

cat <<EOF >  /etc/sysctl.d/60-ipsec.conf
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.eth0.accept_redirects = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.lo.send_redirects = 0

EOF

sysctl --system
sleep 5

systemctl start xl2tpd
systemctl enable xl2tpd
systemctl start ipsec
systemctl enable ipsec
sleep 5

# =================================================================================
# setup Firewalld
firewall-cmd --set-default-zone=drop
firewall-cmd --add-interface=eth0 --zone=drop --permanent
firewall-cmd --permanent --add-port=$SSH_PORT/tcp --zone=drop
for port in ${PORT_FOR_INTERNET[@]}; do
  firewall-cmd --permanent --add-port=$port --zone=drop
done

firewall-cmd --new-zone vpn --permanent
firewall-cmd --reload

firewall-cmd --permanent --zone=vpn --set-target=ACCEPT
for interface in ${INTERFACE_FOR_VPN[@]}; do
  firewall-cmd --permanent --add-interface=$interface --zone=vpn
done

firewall-cmd --add-source=192.168.0.0
for port in ${PORT_FOR_VPN[@]}; do
  firewall-cmd --permanent --add-port=$port --zone=vpn
done

firewall-cmd --permanent --direct --add-chain ipv4 filter port-scan
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 400 -i eno16777736 -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j port-scan
firewall-cmd --permanent --direct --add-rule ipv4 filter port-scan 450 -m limit --limit 1/s --limit-burst 4 -j RETURN
firewall-cmd --permanent --direct --add-rule ipv4 filter port-scan 451 -j LOG --log-prefix "IPTABLES PORT-SCAN:"
firewall-cmd --permanent --direct --add-rule ipv4 filter port-scan 452 -j DROP

firewall-cmd --reload

sleep 5

#reboot

# =================================================================================
# setup docker-ce18.06
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate  docker-logrotate  docker-engine
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install $DOCKER_CE_VERSION $DOCKER_CLI_VERSION containerd.io

cat <<EOF >  /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).

# Use IPx4 forwarding
net.ipv4.ip_forward=1

# Do not accept RA
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.eth0.accept_ra=0
# Do not use IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

EOF

cat <<EOF >  /proc/sys/net/ipv4/ip_farward
1
EOF

mkdir -p /etc/docker

cat <<EOF >  /etc/docker/daemon.json
{
  "exec-opts": [
    "native.cgroupdriver=systemd"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

systemctl start docker
systemctl enable docker
sleep 5

# =================================================================================
# docker users setup
groupadd docker
for user in ${USER_NAMES[@]}; do
  usermod -aG docker $user
done

systemctl restart docker
sleep 10

# =================================================================================
# install docker-compose
curl -L $DOCKERCOMPOSE_INSTALL
chmod +x /usr/local/bin/docker-compose

reboot
```

---
xl2tpdあたりは特にびみょいので、より良いconfができたら随時修正していきます。

次回はコンテナ内の設定をおこないます。
ここまでだとタイトル詐欺すぎる･･･！