はじめに
サーバーネットワークの一般的な構成と言えば、Webサーバー、アプリサーバー、データベースサーバーを多層にネットワークを分ける設計がよく用いられます。
この構成はAWS、Azure、GCP などのクラウドでも構築できます。しかし高い。
国内では、さくら、ConoHa、Kagoyaで構築できますが、さくらは月額課金しかなく、ConoHaは性能が低いため、ちょうど良い業者は「Kagoya」になります。
Kagoyaは京都にデータセンターを持つ企業で、主に法人向けのデータセンターのラック貸しなどで稼いでいるのですが、個人向けにもVPSサービスを提供しているという背景を持っています。
さて、なぜ多層にするかというと、これはKagoyaのセキュリティ設定が理由になります。
kagoyaには「セキュリティグループ」というAWSに似たファイアウォールの設定があるのですが、これが各サーバーの入り口に設定されます。(サーバー上でiptablesを設定しているような状態)
このため、サーバー上で特定のポートを空けていると、全世界に晒しっぱなしになってしまいます。
アプリケーションサーバーであれば、APIのエンドポイントのポート(3000とか9000とかがよく使われる)が、データベースサーバーならデータベースのポートが開いた状態になります。
これは流石に宜しくないということで、使用できるネットワークを絞ってしまうのが今回の対応です。
※ ちなみにConoHaやXserverはインターネット直下にFWがあるのか、VPS間はポートが空いている状態となります。インターネット向けのみ制限します。
環境
クラウド:Kagoya VPS (KVM)
OS:Rocky Linux 8.7 (CentOS系)
ネットワーク構成
こんな感じのネットワークを作ります。Webサーバーは1台だけですのでイメージです。
ただし、各サーバーはそれぞれインターネットに接続するグローバルIPを持っているため、完全なクローズドネットワークではない点に注意。管理の都合上、SSHには繋ぎたいので22番ポートだけは空けておきます。
SSHも閉じる場合は、マネジメントネットワークを別途作り、中継サーバー(踏み台サーバーとも呼ばれる)を経由して各サーバーに繋いだりします。ただしここではやらないので割愛。
設定方法
さて、では設定していきます。
基本的には以下の公式マニュアルに記載の通りなのですが、OSなど色々と情報が古いので、私のやった手順を残しておきます。
ちなみに黒塗りはサービス名などが入っているため隠しています。ご了承を。
サーバー
まず、①ロードバランサー(front_lb)、②Webサーバー(server1)、③データベースサーバー(db_master)の3つを作成し、全てシャットダウンしてしまいます。(シャットダウンしないとネットワークを付与できないため)
ネットワーク
ネットワークは以下のように割り当てます。
db_networkとserver_networkの両方にserver1を割り当てる必要がある点に注意。
セキュリティグループ
セキュリティグループは以下のようにしました。
SSHだけはCI/CDで使用したいためグローバルIPでもアクセスできるようにしてあります。
この辺はお好みで。
サーバー内の設定
Webの管理画面からの設定はここまでです。
次に、サーバーを起動し、各インターフェースにIPアドレスを割り当てていきます。
front_lb
まず、追加されたネットワークインターフェースを確認します。eth1が追加されているようです。
# nmcli device
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected System eth0
eth1 ethernet connecting (getting IP configuration) Wired connection 1
lo loopback unmanaged --
eth1に割り当てられているコネクション”Wired connection 1″を指定して、ネットワーク設定を行います。
IPアドレスを指定して、自動的に起動するようにする
# nmcli connection modify "Wired connection 1" ipv4.address 10.0.10.1/24 connection.autoconnect yes
IPアドレスを指定する方式(手動)にする
# nmcli connection modify "Wired connection 1" ipv4.method manual
確認。デバイスがconnectedになっていることを確認し、ipアドレスが割り当てられていることを確認する
# nmcli device
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected System eth0
eth1 ethernet connected Wired connection 1
lo loopback unmanaged --
#
# ip address show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether ****************** brd ff:ff:ff:ff:ff:ff
altname enp0s4
altname ens4
inet 10.0.10.1/24 brd 10.0.10.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 *****************/64 scope link noprefixroute
valid_lft forever preferred_lft forever
以上です。
他のマシンも同様に設定していきます。
server1
# nmcli device
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected System eth0
eth1 ethernet connecting (getting IP configuration) Wired connection 1
eth2 ethernet connecting (getting IP configuration) Wired connection 2
lo loopback unmanaged --
#
# nmcli connection modify "Wired connection 1" ipv4.address 10.0.10.11/24 connection.autoconnect yes
# nmcli connection modify "Wired connection 1" ipv4.method manual
# nmcli connection modify "Wired connection 2" ipv4.address 10.0.20.11/24 connection.autoconnect yes
# nmcli connection modify "Wired connection 2" ipv4.method manual
#
# nmcli device
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected System eth0
eth1 ethernet connected Wired connection 1
eth2 ethernet connected Wired connection 2
lo loopback unmanaged --
db_master
# nmcli device
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected System eth0
eth1 ethernet disconnected --
lo loopback unmanaged --
#
# nmcli connection modify "Wired connection 1" ipv4.address 10.0.20.1/24 connection.autoconnect yes
# nmcli connection modify "Wired connection 1" ipv4.method manual
#
# nmcli device
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected System eth0
eth1 ethernet connected Wired connection 1
lo loopback unmanaged --
動作確認
最後に動作確認をしていきます。pingを打つだけです。
LB -> Server
# ping 10.0.10.11
PING 10.0.10.11 (10.0.10.11) 56(84) bytes of data.
64 bytes from 10.0.10.11: icmp_seq=1 ttl=64 time=0.527 ms
64 bytes from 10.0.10.11: icmp_seq=2 ttl=64 time=0.301 ms
64 bytes from 10.0.10.11: icmp_seq=3 ttl=64 time=0.336 ms
Server -> DB
# ping 10.0.20.1
PING 10.0.20.1 (10.0.20.1) 56(84) bytes of data.
64 bytes from 10.0.20.1: icmp_seq=1 ttl=64 time=0.356 ms
64 bytes from 10.0.20.1: icmp_seq=2 ttl=64 time=0.413 ms
64 bytes from 10.0.20.1: icmp_seq=3 ttl=64 time=0.287 ms
成功すれば完了です。
ローカルネットワークのセキュリティも気になる方は、firewall-cmdなどでローカルネットワークも制限してしまいましょう。
以上!
コメント