これはなに?
こんにちわ!ナギちゃんだよー☆
きょーはさくらの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:root
+Password:OSインストール時に入力したパスワード
です。
アップデート
[root@IK1234SAKURA ~]# yum -y update
###ホスト名変更
[root@IK1234SAKURA ~]# hostnamectl set-hostname ${好きなホスト名}
####ユーザ追加
サーバにログインする人数ぶん作成してください。
[コンテナだけにログインできればいい人]のアカウントは、ここで作成する必要はありません。
[root@IK1234SAKURA ~]# useradd -mG wheel ${サーバユーザ名}
[root@IK1234SAKURA ~]# passwd ${サーバユーザ名}
[root@IK1234SAKURA ~]# ${ユーザパスワード}
[root@IK1234SAKURA ~]# ${ユーザパスワード}
###SELinux無効化
Edgeちゃんなみに不憫な子。さくらは標準でdisabledですがいちおう確認
[root@IK1234SAKURA ~]# getenforce
> Disabled
###swap無効化
dockerがイヤがるためswapを停止します。最終行をコメントアウト
[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
不要サービス停止
お好みでどうぞ
[root@IK1234SAKURA ~]# systemctl stop postfix
[root@IK1234SAKURA ~]# systemctl disable postfix
[root@IK1234SAKURA ~]# systemctl stop chronyd
[root@IK1234SAKURA ~]# systemctl disable chronyd
Port111サービス停止
いらない機能なので止めます。Socketの3行をコメントアウト。お好みでどうぞ。
[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や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コントロールパネル]
の[コンソール]
から接続できます
※もっとかっこいい設定を知っている方はぜひご教示ください・・・
#デフォルトゾーンを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を許容したい場合は塞ぐ)
インターネットむけに許容するポートを開けたい場合
以下コマンドで穴をふやしてください
[root@IK1234SAKURA ~]# firewall-cmd --permanent --add-port=${使うポート}/tcp --zone=drop
[root@IK1234SAKURA ~]# firewall-cmd --reload
VPN接続時のみ許容するポートを開けたい場合
以下コマンドで穴をふやしてください
[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接続が想定される場合は以下のようにすきなだけ増やしていってください。(ここを変数対応にする方法はわかりませんでした・・・)
[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
[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鍵設置
sudo su - ${すきなユーザ名} <<EOF
mkdir .ssh
chmod 700 .ssh
cat <<EOS > ~/.ssh/authorized_keys
${SSH公開鍵}
EOS
chmod 600 ~/.ssh/authorized_keys
EOF
###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インストール
[root@IK1234SAKURA ~]# yum -y install xl2tpd libreswan
###xl2tpd設定:基本設定
VPN接続されたクライアントに割り振られるローカルIPアドレスと、VPN接続時のサーバ側IPアドレスを指定しておきます
[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のみ許容していますが、ダメなやつなきがするのでどうにかできないかは調査中・・・
[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接続するユーザぶん記述してください
[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設定
[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が死ぬようです
[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が死ぬようです
[root@IK1234SAKURA ~]# cat <<EOF > /etc/ipsec.d/default.secrets
: PSK ${VPN事前共有キー}
EOF
###パラメータ追加
もし違うVPSなどでif名が違う場合は「eth0」を該当のif名に書き換えてください
[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インストール
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フォワーディングを追加+永続化
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推奨になっているようです
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コマンドできるようにしておきます
systemctl start docker
systemctl enable docker
groupadd docker
usermod -aG docker {$user}
systemctl restart docker
###docker-compose
docker composeもインストールします
curl -L $DOCKERCOMPOSE_URL
chmod +x /usr/local/bin/docker-compose
#再起動
reboot
起動してsshしてvpnして各サービス起動していれば無事完了です。
おつかれさまでした!
#おまけ
##この作業でつかう確認コマンド集
#ソフトウェアの動作状態を確認したい
[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インストール時のスタートアップスクリプトに投入してください
#!/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ができたら随時修正していきます。
次回はコンテナ内の設定をおこないます。
ここまでだとタイトル詐欺すぎる・・・!