はじめに
こんにちは。ネットワークエンジニアの「だいまる」です。
前回の「【WordPress・ブログ構築】初めてのブログ構築はレンタルサーバ・自前環境どっちがお得?(AWS・ラズパイ編)」に続き、マンションタイプの方向けに対するAWS(EC2)をリバースプロキシとして利用する方法をまとめていきたいと思います。
そもそもリバースプロキシとは?
リバースプロキシとは「外部からのアクセスに対するプロキシサーバ」となります。
リバースプロキシを利用しない場合、自宅のLAN内で構築するWebサーバに直接アクセスされる構成になり不正アクセスや乗っ取りの可能性が高まります。
リバースプロキシを利用する場合、自宅のLAN内に直接アクセスされることはなくなり、不正アクセスや乗っ取りの被害を最小限に抑えることができます。
しかし、今回リバースプロキシを利用した1番の目的は、「グローバルIPアドレスの確保」です。
プラスアルファで「セキュリティ向上」も目的となります。
AWS(EC2)を利用しましたが、Xserver等でも代用可能です!
AWS(EC2)のインスタンスタイプと契約形態
今回利用したAWS(EC2)は「T2.nano」を利用し、3年全額前払いのリザーブドインスタンスで契約しました。
全額前払いによる割引率が高くなり、費用を抑えた上でブログ構築・運用が可能となります。
項目 | 費用($1=140円) | 月額 |
T2.nano(1コア/0.5GB) | $86 (¥12,040) | ¥0 |
EBS(ストレージ) | ¥0 | $1(¥140) |
T2.nanoの性能は一見不足してそうに見えますが、1秒間に同時アクセス数が40越えしなければ、十分に性能を発揮します。(実証で確認済)
最初のブログ運営では、ここまでアクセスが来ることはないと思うので、この性能で十分だと思います。
サーバの性能よりも実はネット回線の方がボトルネックになることは多々あるため、要注意です。
EC2でリバースプロキシの構築方法
Nginxのインストール
今回、リバースプロキシとして利用するWebサーバは「Nginx」となります。
Nginxはリバースプロキシでもよく利用されており、設定も簡潔のため、今回利用することにしました。
サーバへのインストールコマンドは以下の通りとなります。(OSによっては異なります)
sudo apt install nginx
※Debian系以外のサーバの場合:yum等を利用します。
Nginxの設定方法
設定ファイルの保存場所は、etc配下のnginxディレクトリ配下にあることが多く「nginx.conf」がファイル名となります。
ただし、サーバやOSによって異なる場合があるので、「sudo find / -name “nginx.conf”」のコマンドで検索をかけてみるのもありだと思います。
今回は1つのリバースプロキシから「本ブログ(だいまる)」と「妻のブログ(えのきだけブログ)」の2つのブログへ分散させる方法を共有します。
設定ファイルにはグローバルな部分(全体向け)と各ホスト向けの部分(個別向け)に分かれています。
今回のように複数ブログに分散させる場合、チューニングが大事だよ
グローバルな部分(全体向け)の設定
グローバルの編集内容はデフォルトで記載されている値を少し変えてあげるだけで大丈夫です。
worker_processes 1;
error_log logs/error.log notice;
#pid logs/ nginx.pid;
- worker_process:CPUコア数(CPUコア数以上の数字にしても問題ないらしい)
- error_log:エラーログの出力場所・出力レベルの指定
- 出力レベル:syslogの7段階のレベルに準拠
- pid:process IDのログ保存
この部分はデフォルトのままでも問題はないと思いますが、worker_processの部分だけは変更してあげた方がいいでしょう。
Event(グローバル)
events {
worker_connections 40;
}
- worker_connections:同時にアクセス可能となるセッション数
- テストした結果から1秒あたりではなくその瞬間に繋がっているセッション数
この設定の値が大きすぎる場合、DDOS攻撃によるサーバダウンにつながる場合も考えられるため、ある程度のチューニングが必要になると思います。
HTTP(グローバル+ローカル)
HTTPの設定では「server配下の部分」が各サーバ向けの設定となります。
ここではサーバ名やproxyのアクセス方法、アクセス先等の設定の簡単な説明をします。
「server_name」ではサーバ名を指定しアクセスURLの条件付けとなります。
proxy_set_header系はリバースプロキシを利用する際に必要となる設定となるので、コピペで問題ないと思います。
肝心な設定のlocation配下ではDNSサーバの指定とアクセス先(Webサーバのアドレス)の指定を行います。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server_names_hash_bucket_size 128;
keepalive_timeout 65;
server {
server_name daimaru-tech-blog.com; #サーバ名
#プロキシヘッダの各フィールドの値追加・変更の設定
proxy_set_header X-Forwarded-Proto $scheme; #アクセスメソッド(HTTP or HTTPS)
proxy_set_header X-Real-IP $remote_addr; #送信元アドレスを1つ格納
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #送信元のIPアドレスを複数格納
proxy_set_header Host $host; #ホスト名
proxy_redirect off;
proxy_max_temp_file_size 0;
location / {
resolver 8.8.8.8; #DNSサーバ(Google)
proxy_pass http:<アクセス先アドレス or URL>;
}
}
}
Nginxの再起動方法
上記設定が完了したら、Nginxの再起動(設定再読み込み)を実施します。
既にNginxによるリバースプロキシ経由でのブログ運営を行なっている場合、いきなり再起動を実施し、起動に失敗するとブログへのアクセス断になるので、テストコマンドで最低限問題ないかを確認してからの実施が望ましいです。
コマンド:sudo nginx -t
(成功時の出力結果)
nginx: the configuration file ~~~~ syntax is ok
nginx: configuration file ~~~~~ test is successful
(失敗時の出力結果(例))
nginx: [emerg] location "/50x.html" is outside location "/serverA_blog/" in nginx.conf:66
nginx: configuration file nginx.conf test failed
テストコマンドの出力が問題なければ、以下コマンドで再起動を実行します。
sudo systemctl restart nginx
これでエラーがなければ再起動完了となります。
OpenVPNを利用したVPN環境の構築
次にOpenVPNを利用したVPN環境構築について説明していきたいと思います。
OpenVPNのインストール方法
まず、OpenVPNのインストールを行います。
インストールコマンドは以下の通りとなっております。
sudo apt install openvpn
今回、OpenVPNを選択した理由は「無料かつ安全性が高いVPN構築が可能なため」です。
やはり、何事も費用削減はとても大事なことなので無料で質の高いものが使えるのであれば、もちろん選びます。
OpenVPNのインストール後は、サーバ側の設定に入ります。
まずは、認証局(サーバ)の設定と鍵の生成が必要!!
以下コマンドでVPNに必要な認証局の初期化を行います。
# cd /usr/share/easy-rsa/3 #ここはバージョンにより異なる
# ./easyrsa init-pki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /usr/share/easy-rsa/3.0.3/pki
以下コマンドで認証局の作成を行います。
./easyrsa build-ca
このコマンド実行後、認証局のパスワードと認証局名を聞かれます。
ここは各自設定してください。
設定後、認証局鍵である「ca.key」と証明書である「ca.crt」が作成されます。
この2つは非常に重要なファイルのため、漏洩だけは気をつけてください。
クライアント認証に利用する秘密鍵と証明書の作成を行います。
作成のコマンドは以下の通りです。
./easyrsa build-server-full server nopass
コマンド実行後、秘密鍵に登録するパスワードを聞かれます。
万が一があるので、登録しておいた方が安全でしょう。
上記コマンドの実行後、VPNサーバの秘密鍵である「server.key」と証明書である「server.crt」が作成されます。
最後にTLS鍵の生成を行います。
コマンドは以下の通りです。
openvpn --genkey --secret ta.key
コマンド実行後、TLS-AUTHに利用するTLS鍵(ta.key)が生成されます。
ここまでのステップでVPNサーバ側の設定はほぼ完了したと言えるでしょう。
鍵の生成後は、サーバのConfigファイルを作成しよう!!
一通りの鍵の生成が完了したら、OpenVPNの認証局(サーバ)側のConfigファイルを修正していきます。
Configファイルは、「/etc/openvpn/server.conf」か「/etc/openvpn/server/server.conf」となります。
Configの変数と例は以下に記載しますので、ぜひ参考にしてみてください。
- port <port番号>:利用するポート番号
- proto [udp|tcp]:利用プロトコル(一般的にはUDP)
- dev [tun|tap]:Routingする場合はTunを利用し、ブリッジ利用する場合はTapとなる
- ca <ディレクトリ>:認証局の鍵の保管場所
- cert <ディレクトリ>:証明書の保管場所
- key <ディレクトリ>:鍵の保管場所
- dh <ディレクトリ>:DH交換鍵方式で利用する鍵の保管場所
- server <Networkアドレス> <Subnet>:アサインするアドレス(プライベートアドレスの利用推奨・LANとは異なる方が安全)
- push
- rediect-gateway:全てのインターネット向けのトラフィックがVPN経由となる
- route:クライアント側に経路情報を付与
- dhcp-option:DNSサーバの指定
- client-to-client:クライアント間の接続可否
- tls-auth:TLS Authで利用する鍵の指定
- data-cipher:鍵交換方式の指定
port xxxx
proto udp
dev tun
ca /usr/share/easy-rsa/XXXX
cert /usr/share/easy-rsa/XXXX
key /usr/share/easy-rsa/XXXX
dh /usr/share/easy-rsa/XXXX
server XX.XX.XX.XX 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "route XX.XX.XX.XX 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
client-to-client
keepalive 10 120
tls-auth ta.key 0 # This file is secret
data-ciphers AES-256-GCM
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 5
Config作成後にやることはVPNサーバの起動
最後に、VPNサーバの起動を行います。
systemctl start openvpn@server
VPNサーバを落とすことはあまりないかもしれませんが、再起動した際に自動起動するためのコマンドは以下の通りとなります。
systemctl enable openvpn@server
サーバの設定後は、VPNクライアント(Webサーバ)側の設定
クライアント認証を行うためには、鍵と証明書の作成が必要となります。
作成には以下コマンドで作成できます。
./easyrsa build-client-full (鍵名)
作成時に、鍵に付与するパスワードが聞かれるので万が一を考慮し、設定した方が安全といえます。
Step1のコマンド実行後、指定した鍵名で「鍵名.crt」と「鍵名.key」が作成されます。
その2つのファイルとサーバ設定時の手順で作成された「ca.crt」と「ta.key」もクライアント側にSCPやFTP等で転送し保存してください
2つのファイルを転送、保存した後は、「/etc/openvpn/client.conf」を作成します。
各サーバで異なってくる部分がありますが、以下をコピペし一部修正すれば利用できると思います。
# Specify that we are a client and that we
# will be pulling certain config file directives
# from the server.
client
# Use the same setting as you are using on
# the server.
# On most systems, the VPN will not function
# unless you partially or fully disable
# the firewall for the TUN/TAP interface.
;dev tap
dev tun
# Are we connecting to a TCP or
# UDP server? Use the same setting as
# on the server.
;proto tcp
proto udp
push "dhcp-option DNS 8.8.8.8"
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote <VPNサーバアドレス> <ポート番号>
# Keep trying indefinitely to resolve the# host name of the OpenVPN server. Very useful
# on machines which are not permanently connected
# to the internet such as laptops.
resolv-retry infinite
# Most clients don't need to bind to
# a specific local port number.
nobind
# Try to preserve some state across restarts.
persist-key
persist-tun
# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
ca /etc/openvpn/ca.crt
cert /etc/openvpn/(鍵名).crt
key /etc/openvpn/(鍵名).key
remote-cert-tls server
# If a tls-auth key is used on the server
# then every client must also have the key.
tls-auth ta.key 1
# If the cipher option is used on the server
# then you must also specify it here.
# Note that 2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
cipher AES-256-GCM
# Enable compression on the VPN link.
# Don't enable this unless it is also
# enabled in the server config file.
;comp-lzo
# Set log file verbosity.
verb 3
# Silence repeating messages
;mute 20
pull
float
#redirect-gateway def1
クライアント側でOpenVPNを起動する方法は、以下のコマンドになります。
sudo systemctl start openvpn
こちらもサーバの再起動時に自動でVPNを接続する場合はenableにします。
sudo systemctl enable openvpn
上記コマンド実施後、「ip route」や「ifconfig/ipconfig/ip a」等でVPNレンジのアドレスが設定されていたら設定は完了です。
最後に
今回は、リバースプロキシの構築方法についてまとめました。
次回の記事は独自ドメインの取得と設定になります。ぜひご参照ください
-
ブログ・サーバ構築
【WordPress・ブログ構築】AWS(EC2)をリバースプロキシとして構築してみた(NGINX/OPENVPN構築)
-
ブログ・サーバ構築
【ESXiインストール】CPU Mismatch・No Network Adapter
-
WordPress
【WordPress・ブログ構築】AWS(Route53)を利用し、独自ドメインと紐づけてみた
-
ブログ・サーバ構築
【自作Google Drive】バックアップサーバの外付けHDDを暗号化してみた
-
ブログ・サーバ構築
【WordPress・ブログ構築】初めてのブログ構築はレンタルサーバ・自前環境どっちがお得?(AWS・ラズパイ編)
-
WordPress
【WordPress・ブログ構築】リバースプロキシ環境をSSL/TLS化してみた