0. 完成形はこんなネットワーク構成
1. ネットワークを構築する
-
IP アドレス
-
パブリック IP アドレス
インターネットに接続する際に用いる IP アドレスのこと -
プライベート IP アドレス
インターネットで使われない IP アドレスのことIP アドレスの範囲 10.0.0.0 ~ 10.255.255.255 172.16.0.0 ~ 172.31.255.255 192.168.0.0 ~ 192.168.255.255 -
IP アドレス範囲と表記方法
「ネットワーク部」と「ホスト部」があるが、「ホスト部」に割り当てる IP アドレスの範囲は 「2の n 乗個で区切る」 ルールがある。よく使われるのは「256 個(後ろから 8 ビット分)」「65536 個(後ろから 16 ビット分)」。
-
-
CIDR 表記とサブネットマスク表記
「ネットワーク部」と「ホスト部」がどこで区切られているかを簡単に表す。-
普通の表記
192.168.0.0 ~ 192.168.255.255 (16 ビットがネットワーク部)
192.168.1.0 ~ 192.168.1.255 (24 ビットがネットワーク部) -
CIDR 表記
192.168.0.0/16 (16 ビットがネットワーク部)
192.168.1.0/24 (24 ビットがネットワーク部) -
サブネットマスク表記
192.168.0.0/255.255.0.0 (16 ビットがネットワーク部)
192.168.1.0/255.255.255.0 (24 ビットがネットワーク部)
-
-
VPC を作る
- AWS management console から VPC を 選択
- リージョン northeast を選択
- VPC の作成を押下
- ネームタグに名前をつける
- CIDR block 「10.0.0.0/16」で作成する
-
サブネット
- 割り当てられた CIDER ブロックを、そのまま使わずに、小さな CIDER ブロックに分割して利用する
- 上記の VPC は 「/16」でネットワークを区切った(10.0.0.0 ~ 10.0.255.255、つまり 65,536 個の IP アドレスがある)けれど、今回、サブネットは「/24」で区切る、つまり、256 アドレス * 256 個サブネット
- サブネットに分ける目的は、障害発生時に備えた「物理的な隔離」と「セキュリティ上の理由(サブネットでセキュリティの強弱をつけたい場合など)」があげられる
-
パブリックサブネットを作る
- サブネットに作成する
- 名前をつける(パブリックサブネット、とか)
- 分割したい VPC を選択する
- CIDR ブロックを設定する(10.0.1.0/24)← 8 bit がホスト部
- 作成押下
-
インターネットゲートウェイの作成
- 作成した VPC とインターネットが繋がるためのポイントが「インターネットゲートウェイ」
- インターネットゲートウェイが無いと、そもそも外界と繋がれないから大事な存在
-
ルーターとルートテーブル
- ルーターは沢山あって、受け取ったパケットの中にある「宛先 IP アドレス」確認して、転送先ネットワークを決める
- 「宛先 IP アドレス」に最短で到達させるためにはどのネットワークに飛ばせばいいかを考える
- その時に使うのが「ルートテーブル」で、そこにはどのネットワークに流すかの設定が書いてある
- ルートテーブルにネットワーク情報が無いと、うまいこと転送できないから、事前に設定する必要あり
- EGP (Exterior Gateway Protocol)
ISP(インターネットサービスプロバイダー)などの「ある程度お大きなネットワーク」は、そのネットワークを管理する「AS 番号(Autonomous System 番号)」を持っていて、それをやりとりして、「どのネットワークの先に、どのネットワークが接続されているか」を、大まかにやりとり把握する。- BGP (Border Gateway Protocol)
- IGP (Interior Gateway Protocol)
EGP 内部のルーター同志で、ルートテーブルの情報をやりとりする。- OSPF (Open Shortest Path First)
- RIP (Routing Information Protocol)
- EGP (Exterior Gateway Protocol)
-
デフォルトゲートウェイをインターネットに向けて設定する
- ルートテーブルの作成
- ネームタグで名前をつける(パブリックルートテーブル、とか)
- 作成済み VPC を選択する
- 作成ボタン押下
- ルートテーブルをサブネットに割り当てる
- 作成済みルートテーブルを選択
- サブネットの関連付けから編集
- 割り当てたいサブネットにチェックを付けて保存
- デフォルトゲートウェイをインターネットゲートウェイに設定する
- 作成済みルートテーブルを選択
- ルートから編集
- 送信先に「0.0.0.0/0」を入力、ターゲットに「igw-xxxx」を選択して保存
- (確認1)サブネットから、「パブリックサブネット」の「ルートテーブル」を確認する
- (確認2)「0.0.0.0/0」が、インターネットゲートウェイに設定されていることを確認する
- ルートテーブルの作成
-
デフォルトゲートウェイとかその辺の知識
同一ネットワーク内に存在しない外部ネットワークと通信する必要がある際に、どのゲートウェイ(ルータ)を使用したらよいかをあらかじめ指定しておきます。 ネットワーク内部のホストから見ると、「デフォルト(既定)」のゲートウェイさえ知っておけば、外部ネットワークとの通信はゲートウェイが取り持ってくれるわけです。
コンピュータネットワークにおいてデフォルトゲートウェイ(default gateway)とは、内部ネットワークと外部ネットワークを接続するためのノードである。IP ネットワークにおいて、経路が分からない IP アドレス宛のパケットは、デフォルトゲートウェイ又はデフォルトルートに転送される。一般的に、デフォルトゲートウェイはルーターである。
参考:デフォルトルート
宛先のコンピュータが同じスイッチングハブに接続されている場合など、経路が明確な場合、コンピュータはその経路情報を使用して通信を行うため、デフォルトルートの設定は無視される。しかし、それ以外の場合は、全てのパケットはデフォルトルートの設定に従って、デフォルトゲートウェイに転送される。
参考:0.0.0.0
IPv4 において、0.0.0.0 は全ビットが 0 の IP アドレスであり、無効、不明、または適用外の対象を指定するために使用されるルーティング不可のメタアドレスである。このアドレスには、いくつかの特別な意味が割り当てられている。
2. サーバーを構築する
-
EC2 インスタンスを作成
- リージョンの確認
- インスタンス作成開始
- AMI の選択
- インスタンスタイプの選択
- インスタンス詳細情報の設定
- ネットワークに「作成済み VPC」を選択
- サブネットに作成済み「パブリックサブネット」を選択
- 自動お割り当てパブリック IP は「有効化」
- ネットワークインターフェイスのオプライマリ IP に「10.0.1.10」を入力
- 「ストレージの追加」へ
- ストレージ
- デフォルトのままで OK。仮想ハードディスク(EBS:Elastic Block Store)が設定される。
- 「Add Tags」へ
- Add Tags
- キーに「Name」、値に「Web サーバー」と入力
- 「セキュリティグループの設定」へ
- セキュリティグループの設定
- セキュリティグループ名に「WEB-SG」と入力
- 「確認と作成」へ
- 確認と作成
- 「作成」押下
- キーペアを作成&ダウンロード
- インスタンスを作成し起動する
- 「インスタンス表示」へ
- インスタンス表示
- status が running とか起動中とかになるのを確認する
- status check が「2/2 チェックに合格しました。」となるのを確認する
-
SSH で EC2 インスタンスに接続する
$ ssh -i my-key.pem ec2-user@xx.xx.xx.xx (EC2インスタンスのパブリックIP)
もし pem ファイルのパーミッションで怒られたら、、、
$ chmod 400 my-key.pem
最初の質問には
yes [enter]
で答えると、ウェルカムメッセージが表示され、接続完了。 -
パブリック IP アドレスを固定化する
- Elastic IP メニューから、「新しいアドレスの割り当て」押下し、アドレスを割り当てする
- 確保したアドレスをインスタンスに割り当てる(アクションからインスタンスを選択)
- 「関連付け」押下
-
ファイアウォールで接続制限
- AWS では「セキュリティグループ」がファイアウォールの役割を担う
- デフォルトでは「SSH・ポート 22」に対して、全ての通信(0.0.0.0/0)を許可している
- このままではそれ以外の通信ははじかれる為、必要に応じてセキュリティグループの設定を調整する必要がある。
- 「インバウンドルール」は外から中(インスタンス)にアクセスしようとする通信に対する制限
- 「アウトバウンドルール」は中(インスタンス)から外にアクセスしようとする通信に対する制限
3. Web サーバーソフトをインストール
-
Apache HTTP Server を インストールする
-
SSH で AWS のインスタンスに接続
$ ssh -i my-key.pem ec2-user@xx.xx.xx.xx(パブリックサブネットに立てたサーバーのパブリックDNS)
-
install Apach
$ sudo yum -y install httpd # -y means that user will not check the instalation detail and install it instantly
-
start Apach
$ sudo service httpd start
-
configure Apach will be started when the server starts
$ sudo chkconfig httpd on
-
check if the configuration has been set properly
$ sudo chkconfig --list httpd
-
check processes
$ ps -ax | grep httpd
-
check network status
$ sudo lsof -i -n -P
-
check DNS server
$ nslookup ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com(パブリックサブネットに立てたサーバーのパブリックDNS)
-
-
ファイアウォールの設定
今の状態では http 通信はできない。なぜならポート80番がファイアウォールで拒否されているから!
セキュリティグループの設定を編集してポート80番への通信を許可するようにしよう。- セキュリティーグループ・WEB-SG の設定画面へ
- インバウンドルールを選択して、タイプ:「カスタムルール」、ポート範囲:「80」、送信元:「0.0.0.0/0」(全てのホスト)で保存。
- Web サーバーのパブリック IP アドレスをブラウザから叩いてみて疎通確認する。(http://xx.xx.xx.xx)
- Apach のウェルカムページが表示されれば成功!
-
VPC 内の EC2 インスタンスへ DNS(Domain Name System)名 が自動で割り振られる設定
IP アドレスでの表記は覚えづらいから、DNS 名が便利。EC2 インスタンスへ DNS 名を割り当てる設定をしよう。- VPC を選択
- 「アクション」から「DNS ホスト名の編集」を選択
- 「はい」を選択すると、設定完了
- 選択した VPC 内に立てた EC2 インスタンスを洗濯
- パブリック/プライベート DNS を確認すると、割り当てられているのが確認できるはず
- パブリック DNS を使ってブラウザから Web サーバー(EC2 インスタンス)にアクスしてみよう
-
DNS <-> IP アドレス を確認できる
nslookup
コマンド$ nslookup <DNS> # IPアドレスが返却される
$ nslookup <IPアドレス> # DNSが返却される
4. HTTP の動きを確認する
telnet
コマンドを使って HTTP リクエストを投げてみる実験をする
-
実験用の EC2 インスタンスをパブリックサブネットに立てる
-
インバウンドルールでポート8080番への通信を許可する
-
実験用サーバーに接続する
-
Node.js をインストールする
AWS のチュートリアルからインストール方法がわかります!$ cd ~ $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash $ . ~/.nvm/nvm.sh $ nvm install node $ node -e "console.log('Running Node.js ' + process.version)" # Running Node.js VERSION ← のように表示されたら成功!
-
app.js を作成して以下のコードをはる
$ vi app.js # app.jsを作る
var http = require('http'); http .createServer(function (req, res) { console.log('Hello World!'); var data = { RequestHeader: req.headers, }; if (req.method == 'GET') { response(res, data); } else { req.on('data', function (body) { data.RequestBody = body.toString(); req.on('end', function () { response(res, data); }); }); } }) .listen(8080); function response(res, data) { console.log('request is coming!!'); var json = JSON.stringify(data); res.writeHead(200, { 'Content-Type': 'application/json', 'Content-Length': json.length, }); res.end(json); }
$ cat app.js # ちゃんとファイル出来てるか確認。 $ node app.js # nodeサーバーを起動する
-
ローカルに別のターミナルを開いて、
telnet
で通信してみる!-
まずは GET request
$ telnet <ec2インスタンスのIP> 8080 Trying 18.179.53.166... Connected to <ec2インスタンスのIP>. Escape character is '^]'. GET / HTTP/1.1[enter] # 入力後enter User-Agent: OreOreGetRequest[enter][enter] # 入力後enter HTTP/1.1 200 OK # 結果が返ってくる!! Content-Type: application/json Content-Length: 51 Date: Wed, 10 Feb 2021 10:20:42 GMT Connection: keep-alive Keep-Alive: timeout=5 {"RequestHeader":{"user-agent":"OreOreGetRequest"}}
-
続いて POST request
$ telnet <ec2インスタンスのIP> 8080 Trying 18.179.53.166... Connected to <ec2インスタンスのIP>. Escape character is '^]'. POST / HTTP/1.1 User-Agent: OreOrePostRequest Content-Length: 4 test HTTP/1.1 200 OK Content-Type: application/json Content-Length: 94 Date: Wed, 10 Feb 2021 10:24:29 GMT Connection: keep-alive Keep-Alive: timeout=5 {"RequestHeader":{"user-agent":"OreOrePostRequest","content-length":"4"},"RequestBody":"test"}
-
-
5.で app.js を起動していたが、そのターミナルには以下のようにログがあるはず
[ec2-user@ip-10-0-1-20 ~]$ node app.js Hello World! request is coming!!
5. プライベートサブネットを構築する
インターネットから隠された(接続出来ない)サブネットを構築する!セキュリティを高められるよ。そこに DB サーバーを立てる。パブリックサブネットは「10.0.1.0/24」だったけど、プライベートサブネットは「10.0.2.0/24」にする。
-
プライベートサブネットを作る
作り方は基本的にパブリックサブネットを作るときと一緒。「CIDR ブロック」に「10.0.2.0/24」を設定する。ルートテーブルはデフォルトの状態で、「自身のネットワーク(送信先:10.0.0.0/16)」に対してのルーティングがされているように設定する。なぜならインターネットに接続しないから。 -
DB サーバーを構築する
EC2 タブで Web サーバーを構築したように、DB サーバーを構築する。サブネットは 1.で作成したプライベートサブネットを選択して、自動割り当てパブリック IP は「無効化」とする。またプライベート IP は「10.0.2.10」に設定。セキュリティグループ名は「DB-SG」とし、タイプには SSH に加えて、「MYSQL/Aurora」を選択、送信元を 「任意の場所」に設定。 -
ping
コマンドで疎通確認!
ping
コマンドはサーバー間での疎通を確認するときに使うコマンドで、「ICMP(Internet Control Message Protocol)」を用いている。- この ICMP が通るように「DB-SG」の設定を編集(「全ての ICMP」を許可するように設定)する。
- Web サーバーに接続
$ ssh -i my-key ec2-user@<WebサーバーのパブリックIP>
- 接続後、DB サーバーに疎通確認!
$ ping 10.0.2.10(<DBサーバーのプライベートIP>)
6. NAT を構築する
-
NAT(Network Address Translation)の仕組み
- NAT は IP アドレスを変換する装置(パブリック IP アドレス ⇄ プライベート IP アドレス)
- プライベートサブネット側からインターネットへアクセスを可能にする!
- インターネットからプライベートサブネット側にはプライベート IP アドレスは公開されていない
- NAT と似たものに NAPT (Network Address and Port Translation)がある
-
NAT インスタンス
NAT ソフトウェアがあらかじめインストールされた AMI から起動した EC2 インスタンス -
NAT ゲートウェイ(今回はこっちを使ってみる)
NAT 専用に構成された仮想的なコンポーネントで、配置するサブネットを設定するだけで構成できるから簡単! -
パブリックサブネットとプライベートサブネットを NAT でつなげる
-
VPC メニューから「NAT ゲートウェイ」を選択して、「NAT ゲートウェイの作成」を押下
-
サブネットはパブリックサブネットで、Elastic IP を割り当てる
-
プライベートサブネットからインターネットに対して通信するとき、パケットが NAT ゲートウェイの方向に流れるようにルートテーブルを更新する
- NAT ゲートウェイ ID を確認する
- プライベートサブネットのデフォルトゲートウェイを NAT ゲートウェイに向ける設定にする
- 疎通確認するよ
プライベートサブネットに立てた DB サーバーに踏み台サーバーを利用して接続して、curl
コマンドでインターネットと疎通できているか確認してみよう。HTML を取得出来ていれば成功!!$ curl https://www.yahoo.co.jp
- NAT ゲートウェイを使う必要がないなら削除しよう!課金されるぞ!
-
7. DB を用いたブログシステムの構築
-
DB サーバーに MySQL をインストールして、WordPress からデータを保存できるようにデータベースを作成する
-
MySQL のインストール
Web サーバーを踏み台にして DB サーバーに接続してAWS EC2 AmazonLinux2 MySQL をインストールする -
MySQL の起動と初期設定
$ sudo service mysqld start
-
MySQL の管理者の初期パスワードを確認
/var/log/mysqld.log
に temporary password が記述されてる。以下のような箇所にxyz
っていう風に初期パスワードが記載されている$ sudo less /var/log/mysqld.log **************** 省略 ************************** 〜〜〜 A temporary password is generated for root@localhost: xyz **************** 省略 ************************** ***
-
MySQL の管理者パスワードを設定
上記で確認したパスワードで mysql に接続$[ec2-user@ip-10-0-2-10 ~]$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 Server version: 8.0.23 Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
接続できたら、初期パスワードを変更しとく
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '大文字、小文字、特殊文字(アスタリスク等)を含む新しいrootユーザのパスワード';
※ 認証プラグインを
mysql_native_password
にしておかないと死ぬ。デフォルトはcaching_sha2_password
なんだけど、PHP がこのデフォルトの認証プラグインに対応していないから、一生認証で失敗する。(PHP 7.3 以上なら問題なかったようだ。後述 2-(i)では PHP8.0 をインストールするように記述した。)じゃないと怒られる
mysql> なんかのsqlコマンド ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
-
WordPress 用のデータベースを作成
-
(root の初期パスワード変更後)データベースを作成する。DB 名は「wordpress_db」とする。
mysql> CREATE DATABASE wordpress_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
※ 文字セット(charset_name)と照合順序(collation_name)指定はこの辺を参考にして
→ MySQL:文字セットと照合順序) -
ユーザーを作成する。ユーザー名は「wordpress_user」とする。
mysql> CREATE USER wordpress_user IDENTIFIED BY '大文字、小文字、特殊文字(アスタリスク等)を含む新しいwordpress_userの為のパスワード';
※ ユーザーの作成はこの辺を参考にして
→ MySQL:ユーザーを作成する(CREATE USER 文)) -
「wordpress_user」に「wordpress_db」に対する全てのアクセス権を与える。
mysql> GRANT ALL ON wordpress_db.* TO wordpress_user;
※ アクセス権限周りについてはこの辺を参考にして
→ MySQL:ユーザーに権限を設定する(GRANT 文) -
権限設定を反映させるコマンドを実行
mysql> flush privileges;
-
wordpress_user が登録されたかの確認
mysql> SELECT user, host FROM mysql.user;
wordpress_user の host が%となっていれば、全てのホストから接続可能になっていることになる。
-
DB サーバーが起動したタイミングで MySQL も起動するように設定しておく
mysql> exit $ sudo systemctl enable mysqld $ sudo systemct is-enabled mysqld # enabled ってなってたら設定できてる
※
systemctl
のコマンドはこの辺を参考に
→ systemctl コマンド
-
-
-
Web サーバーに WordPress をインストールする
-
PHP とそのライブラリをインストール
$ sudo amazon-linux-extras install -y php8.0 $ sudo yum -y install php php-mysql php-mbstring
-
MySQL コマンドをインストール
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm $ sudo yum install --enablerepo=mysql80-community mysql-community-server
-
MySQL に接続
$ mysql -h 10.0.2.10 -u wordpress_user -p [パスワード聞かれるので入力する] # 接続確認したら、まずはOK mysql> exit
-
WordPress のダウンロード
$ cd ~ $ wget https://ja.wordpress.org/latest-ja.tar.gz
-
WordPress の展開とインストール
$ tar xzvf latest-ja.tar.gz $ cd wordpress $ sudo cp -r * /var/www/html # Webサーバーソフトである Apache から WP プログラム一式が見えるようにコピーする $ sudo chown apache:apache /var/www/html -R # ファイルの所有者/グループを、apache / apache に変更する
※ Linux コマンド
tar
については以下を参照する
→ tar コマンドについて詳しくまとめました 【Linux コマンド集】
-
-
WordPress の初期設定をして、1.のデータベースを使うように構成する
-
Apach の起動 (既に起動している場合、インストールした PHP を有効化させるために再起動)
$ sudo service httpd start (restart)
-
WordPress 初期設定
-
/var/www/html/wp-config-sample.php
をコピーして/var/www/html/wp-config.php
を作る -
データベースと秘密鍵の設定
// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** // /** WordPress のためのデータベース名 */ define( 'DB_NAME', 'ここにデータベース名' ); /** MySQL データベースのユーザー名 */ define( 'DB_USER', 'ここに作成したユーザー名' ); /** MySQL データベースのパスワード */ define( 'DB_PASSWORD', 'ここに作成したユーザーのパスワード' ); /** MySQL のホスト名 */ define( 'DB_HOST', '10.0.2.10' ); /** データベースのテーブルを作成する際のデータベースの文字セット */ define( 'DB_CHARSET', 'utf8' ); /** データベースの照合順序 (ほとんどの場合変更する必要はありません) */ define( 'DB_COLLATE', '' ); /**#@+ * 認証用ユニークキー * * それぞれを異なるユニーク (一意) な文字列に変更してください。 * {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org の秘密鍵サービス} で自動生成することもできます。 * 後でいつでも変更して、既存のすべての cookie を無効にできます。これにより、すべてのユーザーを強制的に再ログインさせることになります。 * * @since 2.6.0 */ # 以下は、https://api.wordpress.org/secret-key/1.1/salt/ からコピペ!!! define('AUTH_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); define('SECURE_AUTH_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); define('LOGGED_IN_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); define('NONCE_KEY', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); define('AUTH_SALT', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); define('SECURE_AUTH_SALT', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); define('LOGGED_IN_SALT', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); define('NONCE_SALT', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); /**#@-*/
-
-
ブラウザから
http://<WebサーバーのパブリックIPアドレス>
に接続するとウェルカムページが表示されるはず!
-
8. TCP / IP による通信の仕組みを理解する
-
TCP / IP モデル
層 役割 代表的なプロトコル 7:アプリケーション層 ソフトウェア同士が会話する HTTP, SSH, SMTP 4:トランスポート層 データのやり取りの順番を制御したり、エラー訂正したりするなど、信頼性を高めたデータの転送を制御する TCP, UDP 3:ネットワーク層 IP アドレスの割り当て、ルーティングをする IP, ICMP, ARP 2:データリンク層 ネットワーク上で接続されている機器同士で通信する Ethernet, PPP -
ARP(Address Resolution Protocol)
Ethernet では、MAC アドレスを頼りにデータを送信する。MAC アドレスというのは「05:0c:ce:d8:1b:a1」のようなもの。Ethernet は、Ether フレームだけをみて、中身の IP までは確認することなく通信ができる。ここで、「どの MAC アドレスをもつホストが、どの IP アドレスに対応しているか」という対応表が必要になる。- 『「10.0.1.10」という IP アドレスを持っているホストさーん!MAC アドレス教えて〜(ARP 要求)』
- 『はい!僕です!MAC アドレスは「05:0c:ce:d8:1b:a1」だよー(ARP 応答)』
- 「10.0.1.10」と「05:0c:ce:d8:1b:a1」が紐付けされる
- ただし、ARP 要求は自分が所属するサブネット内にとどまる。別のネットワークに ARP 要求するには、まずルーターまで届けて、その後にルーターがパケットの IP を取り出して、別ネットワークに再送出する。
-
3ウェイハンドシェークのフラグたち
- SYN: 通信を開始したいことを示す『ねぇ!通信したいんだけど!』
- ACK: 受領の合図『おう、いいよ!』 → ACK 返すとき「次欲しいシーケンス番号」を「応答番号」として返す。
- URG: 緊急データが入っていることを示す『急ぎの通信!!』
- PSH: 即時通信データがあることを示す『ちょ、速攻で送れるデータあんねんけど!』
- RST: エラーなどで通信をリセットしたいことを示す『エラーっぽいな、一旦リセットしよや!』
- FIN: 通信を終了したいことを示す『もう通信切りたい!』
※ 3ウェイハンドシェークをこちら側からしか始められないようにするには、「SYN が付いたパケットは通さない」という設定にしておく。
-
Wireshark でパケットキャプチャ
UDP や TCP のパケットを見ることができる。-
nslookup aws.amazon.com
とかすると画面に大量の通信パケット情報が流れる - UDP 見るとき、Filter: のところで、「upp.port==53」で絞り込むといい
- HTTP 見るとき、Filter: のところで、「tcp.port==80 and ip.dst_host==<探したい IP>」で絞り込むといい
-
-
なんでネットワークを管理するのか?
問題が起きた時の原因の発見や対処、その後の再発防止策を取るため。そのために以下の2つが必要。-
ネットワーク構成の把握する
- ネットワーク全体のトポロジ
- ネットワークに割り当てられている IP アドレスブロック(CIDR のことか?)
- ネットワーク内に存在するサブネットと、それぞれの IP アドレスブロック
- 各サブネット内に存在するインスタンス
- インスタンスが持つプライベート IP アドレスとパブリック IP アドレス
- ルートテーブルの設定
- セキュリティグループやネットワーク ACL(Access Control List)
※ ACL(Access Control List:通信に対するアクセス可否の設定のこと
※ ドキュメント管理にはChefやPuppetのようなツールが便利で、もちろんCloudFormationも使えるツールの一つ
-
ネットワーク状態の把握する
-
ping
で疎通確認 -
traceroute
で経路確認 -
telnet
でポート番号を指定した TCP 到達性の確認 -
nslookup
,dig
で名前解決を確認 - 運用の時に使えるネットワーク監視ツール
- Zabbix:構築から設定までが簡単
- New Relic:SaaS 型モニタリングサービス
- CloudWatch:AWS の各サービスの情報が得られる
-
-