Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

これはなに?

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

はい。

長いので

  • VPSセットアップ編(いまここ)
  • コンテナ構築編
  • Nuxt+Wordpress編

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

なにができるの?

  • 複数プロジェクトを開発しているけど、開発中のは公開したくない開発用サーバ
  • でも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環境がほしい場合は1クリックで終了します。こちらを考慮にいれてもよいでしょう。

じゅんび?

環境

・[サーバ] さくらの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:rootPassword:OSインストール時に入力したパスワードです。

アップデート

ssh
[root@IK1234SAKURA ~]#  yum -y update

ホスト名変更

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

ユーザ追加

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

ssh
[root@IK1234SAKURA ~]#  useradd -mG wheel ${サーバユーザ名}
[root@IK1234SAKURA ~]#  passwd ${サーバユーザ名}
[root@IK1234SAKURA ~]#  ${ユーザパスワード}
[root@IK1234SAKURA ~]#  ${ユーザパスワード}

SELinux無効化

Edgeちゃんなみに不憫な子。さくらは標準でdisabledですがいちおう確認

ssh
[root@IK1234SAKURA ~]#  getenforce
>   Disabled

swap無効化

dockerがイヤがるためswapを停止します。最終行をコメントアウト

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

不要サービス停止

お好みでどうぞ

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

Port111サービス停止

いらない機能なので止めます。Socketの3行をコメントアウト。お好みでどうぞ。

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

お好みでどうぞ

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コントロールパネル][コンソール]から接続できます
※もっとかっこいい設定を知っている方はぜひご教示ください・・・

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を許容したい場合は塞ぐ)

インターネットむけに許容するポートを開けたい場合

以下コマンドで穴をふやしてください

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

VPN接続時のみ許容するポートを開けたい場合

以下コマンドで穴をふやしてください

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

同時に複数人がVPN接続する場合

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

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

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鍵設置

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

ssh起動

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インストール

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

xl2tpd設定:基本設定

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

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のみ許容していますが、ダメなやつなきがするのでどうにかできないかは調査中・・・

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接続するユーザぶん記述してください

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設定

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が死ぬようです

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が死ぬようです

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

EOF

パラメータ追加

もし違うVPSなどでif名が違う場合は「eth0」を該当のif名に書き換えてください

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を利用したレイヤー2トンネリングプロトコル
  • [詳細設定]→[認証に事前共有キーを使う]→${事前共有キー}
  • [OK]
  • [データの暗号化]:[最強の暗号化(サーバーが拒否する場合は切断します]
  • [認証]:[次のプロトコルを許可する]
  • [チャレンジハンドシェイク認証プロトコル](チェックする)
  • [Microsoft CHAP Version 2](チェックする)

VPN接続時、インターネットとの通信はVPSサーバを通さないようにします
- [ネットワーク接続]→[${上で設定した接続名}]→[右クリック]→[プロパティ]
- [ネットワーク]:[インターネットプロトコルバージョン4]→[プロパティ]
- [全般]:[詳細設定]→[リモートネットワークでデフォルトゲートウェイを使う]のチェックを外す

再起動

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

dockerインストール

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

dockerインストール

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フォワーディングを追加+永続化

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推奨になっているようです

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コマンドできるようにしておきます

ssh
systemctl start docker
systemctl enable docker

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

docker-compose

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

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

再起動

ssh
reboot

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


おまけ

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

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インストール時のスタートアップスクリプトに投入してください

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ができたら随時修正していきます。

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

norisionori
まずしいネットワークエンジニア
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away