本文へ移動

ホーム / SRE / 第3部 コンピュータとネットワークの基礎

第3部 コンピュータとネットワークの基礎・第5章

ネットワーク(TCP/IP・DNS・TLS)

★★★ 必須17トピック・面接 7問

定番は「URLを打ってから表示されるまで」。どの層までどれだけ深く話せるかで、基礎体力を一問で測られる。

別のページで開く →

ネットワーク図を読み込んでいます…

  1. DNS名前解決:ブラウザ・OSキャッシュ → リゾルバ → ルート → TLD → 権威DNS。TTLとキャッシュの影響

  2. TCP接続:3ウェイハンドシェイク(SYN → SYN/ACK → ACK)

  3. TLSハンドシェイク:証明書の検証、鍵交換、TLS 1.3 は 1-RTT

  4. HTTPリクエスト:CDN → ロードバランサ(L4 / L7) → Webサーバ → アプリ

  5. アプリ処理:認証、キャッシュ参照、DB クエリ

  6. レスポンスとレンダリング:HTML解析、追加リソース取得、Keep-Alive / HTTP/2 の多重化

1回の表示の裏でDNS・TCP・TLS・HTTPが順に動くブラウザURLを入力し、まずDNSでIPを解決DNSリゾルバ → TLD → 権威DNSCDN(CloudFront)静的ファイルはここで返すロードバランサ(ALB)TLS終端、ターゲットへ振り分けアプリケーション認証、ビジネスロジックキャッシュ(Redis)まずここを参照データベースキャッシュになければ取得TCP接続 → TLSハンドシェイク → HTTPキャッシュにないものはオリジンへパスやホスト名でルーティング
URL入力から表示までの経路

各箱と矢印が「壊れる可能性のある場所」。面接では上から順に、それぞれの障害と調べ方まで話す。

各ステップで「ここが壊れたら何が起きるか、どう調べるか」まで話せると強い。

第6章「Web技術(HTTP・URI・REST)」:URIとHTTPの仕組みを図で詳しく

通信は、役割ごとに「層(レイヤー)」に分けて考えます。OSI参照モデルは7つの層に分けた教科書の型、TCP/IPは実際のインターネットで使われている4つの層の型です。下の層(ケーブルや IP の経路)が動いていなければ、上の層(HTTP など)の設定をいくら直しても通信はできません。

障害の切り分けを「どの層の問題か」で話せると説得力が増します。たとえば「ping は通るのに curl が失敗する」なら、第3層(IP)までは届いているので、第4層より上(ポート・TLS・アプリ)を疑う、というように順に絞り込めます。表では、実務で話題になりにくい第1層(物理)と第5層(セッション)は省いています。

OSI層TCP/IP主なプロトコル・機器障害の例確認コマンド
7 アプリケーションアプリケーションHTTP、DNS、gRPC、ALB5xxエラー、認証失敗curl -v、アプリログ
6 プレゼンテーションアプリケーションTLS証明書期限切れ、プロトコル不一致openssl s_client
4 トランスポートトランスポートTCP、UDP、NLBポート未開放、接続タイムアウト、再送ss、nc、tcpdump
3 ネットワークインターネットIP、ルーター、VPCルーティング誤り、SG / NACLping、traceroute、ip route
2 データリンクネットワークインターフェースEthernet、ARPMTU不一致ip link、arp

下の「ブラウザで試す」の図では、第4層(トランスポート)の TCP が、SYN・SYN-ACK・ACK の3回のやりとりで接続を作り、データを送って ACK で確かめ、FIN と ACK で切断するまでを順に見られます。SYN_SENT・ESTABLISHED・CLOSE_WAIT・TIME_WAIT のような状態は ss の出力でも ESTAB・TIME-WAIT などの形で見られるので、どの段階の状態が溜まると障害になるかに注目してください。

別のページで開く →

ネットワーク図を読み込んでいます…

テーマ押さえる点
TCP と UDP信頼性・順序保証・輻輳制御の有無。UDPはDNS、動画、QUIC(HTTP/3)
TIME_WAIT接続を能動的に閉じた側に残る状態。大量発生でポート枯渇。Keep-Alive や接続プールで回避
L4 と L7 ロードバランサL4はIP・ポートで振り分け(NLB)。L7はHTTPの中身で振り分け(ALB)、TLS終端やパスルーティング
DNS レコードA / AAAA / CNAME / MX / TXT / NS。CNAMEはゾーン頂点に置けない(ALIASで代替)
HTTPステータス502(上流からの不正応答)、503(受付不可)、504(上流のタイムアウト)の違いは障害調査で頻出
CIDR とサブネット/24 は 256 アドレス。VPC設計でアドレス枯渇や重複(ピアリング不可)に注意
HTTP/1.1・2・32はストリーム多重化、3はQUIC(UDP)でTCPのHead-of-Line Blockingを解消

5.4ポート番号

用語★★★ 必須
ひとことで

1台のサーバーの中で、どのプログラムに届けるかを示す番号。IPアドレスが建物なら、ポートは部屋番号。

ポートは0〜65535の番号で、TCPとUDPそれぞれにあります。サーバーのプログラムは決まったポートで待ち受け(listen)し、クライアントは自分の側に一時的な番号(エフェメラルポート)を割り当てて接続します。1本の接続は「送信元IP・送信元ポート・宛先IP・宛先ポート・プロトコル」の5つの組で区別されるので、同じサーバーの443番に何万人もが同時に接続できます。

ポートプロトコルメモ
22SSH外部に公開しない。Session Managerで代替
25 / 587SMTP(メール送信)AWSでは25番の送信に制限がある
53DNSUDPとTCPの両方
80 / 443HTTP / HTTPS443はHTTP/3ならUDPも
3306MySQLDBは外部に公開しない
5432PostgreSQL同上
6379Redis認証なしで公開して乗っ取られる事故が多い
9090 など監視・管理画面管理系は内側だけに
よくある問題原因と確認
外から繋がらない127.0.0.1で待ち受けている(ss -tlnp で確認)、SG・NACL・FWで閉じている
Address already in use同じポートを別のプロセスが使っている。古いプロセスが残っている
1024未満で起動できないrootかCAP_NET_BIND_SERVICEが必要。コンテナでは8080などで待ち受けてLBで443に
接続が作れない(大量接続時)エフェメラルポートの枯渇。TIME_WAITの多さ、接続の再利用を確認
IPアドレスが「建物」なら、ポートは「部屋番号」サーバー 10.0.1.522SSH25SMTP53DNS80HTTP443HTTPS3306MySQL5432PostgreSQL6379Redisクライアント送信元ポートは自動(例 51234)宛先 :443どこで待ち受けるか(bind)0.0.0.0:443 … 外からも届く127.0.0.1:443 … 自分の中だけ0〜1023:ウェルノウンポート(rootが必要) 1024〜49151:登録済み 49152〜:エフェメラル(送信元で一時的に使う)接続は「送信元IP・送信元ポート・宛先IP・宛先ポート・プロトコル」の5つの組で区別される
ポートと待ち受けの仕組み

「どのIPの、どのポートで、誰に向けて待ち受けているか」を ss -tlnp で確認する習慣をつける。

面接ではこう答える

ポートは1台のサーバーの中でどのプログラムに届けるかを示す番号で、サーバーは決まったポートで待ち受け、クライアントは一時的なエフェメラルポートから接続します。接続は送信元と宛先のIP・ポートとプロトコルの組で区別されます。0.0.0.0で待ち受ければ外から届き、127.0.0.1なら自分の中だけです。DBや管理系のポートは外部に公開しません。

5.5TCPの接続と切断

★★★ 必須
段階やりとり面接での論点
接続(3ウェイハンドシェイク)SYN → SYN/ACK → ACK接続確立に1往復かかる。遠い相手ほど遅い。接続の再利用が重要な理由
データ転送シーケンス番号と ACK、再送パケットロスで再送が発生し遅延する
輻輳制御スロースタート、ウィンドウ制御新しい接続は最初遅い
切断(4ウェイ)FIN → ACK → FIN → ACK能動的に閉じた側に TIME_WAIT が約60秒残る
接続に1往復、切断した側にTIME_WAITが残るクライアントサーバーSYNSYN / ACKACK接続確立(1 RTT)HTTPリクエストHTTPレスポンスFINACKFINACKクライアント側に TIME_WAIT(約60秒)。短い接続を大量に張るとポートが枯渇
TCPの接続と切断

接続の確立に1往復かかるため、接続の再利用(Keep-Alive・接続プール)が効く。

状態発生する状況大量にあるときの意味対処
TIME_WAIT自分から接続を閉じた側短い接続を大量に張っている。ポート枯渇の恐れKeep-Alive、接続プール
CLOSE_WAIT相手が閉じたのに自分が閉じていないアプリのバグ(ソケットを close していない)アプリ修正
SYN_RECVSYNを受けてACK待ちSYN Flood 攻撃、バックログ不足SYN Cookie、バックログ調整

5.7IPアドレスとCIDR

用語★★★ 必須
ひとことで

IPv4アドレスは32ビットの数。/24のような表記は「先頭から何ビットがネットワークを表すか」を示す。

10.0.1.0/24 は、先頭24ビット(10.0.1)が共通のネットワークで、残り8ビットで256個のアドレスを表します。数字が1減るごとにアドレス数は2倍になり、/16なら65,536個です。VPCやサブネットを設計するときは、将来の拡張と、他のVPCやオンプレミスとアドレスが重ならないことを最初に考えます。重なっていると、後からピアリングやVPN接続ができません。

CIDRアドレス数用途の目安
/1665,536VPC全体
/204,096大きめのサブネット(EKSのPod用など)
/24256(AWSでは251)一般的なサブネット
/2816(AWSでは11)小さな用途
/24は「先頭24ビットが共通」という意味。残り8ビットで256個10010ネットワーク部(24ビット・固定)ホスト部(8ビット)10.0.1.0/24 → 10.0.1.0〜10.0.1.255 の256個。/16なら65,536個、/28なら16個AWSのサブネットは各5個を予約するので、/24で実際に使えるのは251個VPC同士をピアリングするなら、アドレス範囲が重ならないように最初に設計する
CIDR表記の読み方

EKSなどPodにVPCのIPを割り当てる構成では、アドレスがすぐ枯渇するので大きめに取る。

面接ではこう答える

CIDRは、IPアドレスの先頭何ビットがネットワーク部かを表す表記で、/24なら残り8ビットで256個のアドレスになります。VPC設計では将来の拡張と、他のネットワークとの重複を避けることを最初に考えます。

5.8IPv4とIPv6

用語★★★ 必須
ひとことで

IPv4は約43億個しかなくNATで足りない分をしのいでいる。IPv6は桁違いの数があり、全員に直接アドレスを配れる。移行期は両方を使う。

IPv4のアドレスは32ビット(約43億個)で、すでに新規の割り当てはほぼ枯渇しています。そのため、社内や家庭ではプライベートアドレス(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)を使い、インターネットに出るときにNATで1つの公開アドレスに変換しています。携帯回線などでは、事業者側でさらにNATをかけるCGNATもあり、多数の利用者が同じIPに見えます。

IPv6は128ビットで事実上無限にあり、端末ごとに世界で一意なアドレスを持てます。NATが不要になる一方、「NATの内側だから外から届かない」という暗黙の守りもなくなるので、ファイアウォールやセキュリティグループで明示的に守ります。

観点IPv4IPv6
長さ32ビット(例:203.0.113.10)128ビット(例:2001:db8::10)
数約43億約3.4×10の38乗
足りない分NAT・CGNATで共有不要
ヘッダー可変長、チェックサムあり固定長で単純
設定DHCPSLAAC(自動設定)またはDHCPv6
SREとして気にすること内容
公開IPv4の料金AWSでは2024年2月から公開IPv4アドレスに時間課金。使っていないElastic IPやパブリックIPの棚卸し
デュアルスタックALBやCloudFrontをIPv4とIPv6の両方で受ける。DNSにAとAAAAを登録
IPv6だけのサブネットIPv4枯渇対策。外向きだけならEgress-Only Internet Gateway
ログ・WAF・レート制限IPv6アドレスを扱えるか。1人が大量のIPv6アドレスを使えるので、IP単位の制限は/64単位で考える
CGNATの影響同じIPから大量の利用者が来るので、IP単位のブロックで巻き添えが出る
IPv4はNATで足りない数をしのぎ、IPv6は全員に直接アドレスを配るIPv4(32ビット・約43億個)10.0.1.1010.0.1.1110.0.1.12NAT1つの公開IPに公開IP外から内側のサーバーへ直接は届かないIPv6(128ビット・事実上無限)2001:db8::102001:db8::112001:db8::12インターネットNATなしで直接届く。守りはFWとSGでAWSでは2024年2月から公開IPv4アドレスに料金がかかる。外向き専用ならEgress-Only IGWでIPv6を使う選択肢も移行期は両方を併用するデュアルスタックが一般的。ログやWAFのIPルールがIPv6に対応しているかも確認する
IPv4とIPv6の違い

NATがなくなる分、守りは「明示的に閉じる」設計にする。

面接ではこう答える

IPv4は約43億個で枯渇しているため、プライベートアドレスとNATで共有しています。IPv6は128ビットで全端末に一意なアドレスを配れ、NATが不要ですが、その分ファイアウォールで明示的に守ります。移行期はデュアルスタックで両方を受け、AWSでは公開IPv4に料金がかかるので棚卸しや、外向きだけならEgress-Only IGWでIPv6を使うことも検討します。

5.9DHCP

用語★★★ 必須
ひとことで

ネットワークにつないだ端末に、IPアドレスやDNSサーバーなどの設定を自動で配る仕組み。

端末は最初、自分のIPアドレスを知りません。DHCPでは、端末がネットワーク全体に「アドレスをください」と呼びかけ(Discover)、DHCPサーバーが候補を提示し(Offer)、端末が申し込み(Request)、サーバーが確定(Ack)します。頭文字をとってDORAと呼びます。アドレスは期限つきのリースで貸し出され、期限が近づくと更新します。

配られる主な設定意味
IPアドレスとサブネットマスク自分のアドレスと、同じネットワークの範囲
デフォルトゲートウェイ外のネットワークへの出口
DNSサーバー名前解決の問い合わせ先
リース期間いつまで使ってよいか

AWSのVPCでは、DHCPはAWSが自動で提供し、DHCPオプションセットでDNSサーバーやドメイン名を変えられます。オンプレミスのDNSを使いたいときなどに設定します。IPv6では、ルーターの情報から端末が自分でアドレスを作るSLAACもよく使われます。

DHCPは4往復(DORA)で、IPアドレスなどの設定を自動で配る新しい端末DHCPサーバーDiscover:誰かアドレスをください(全員に送る)Offer:10.0.1.25 はどう?Request:それをくださいAck:どうぞ(期限つきで貸し出し)一緒に配るもの:サブネットマスク・デフォルトゲートウェイ・DNSサーバー・リース期間
DHCPの4往復(DORA)

DHCPのリース切れやアドレスの枯渇は、オフィスやオンプレの「急に繋がらない」の定番原因。

面接ではこう答える

DHCPは、端末にIPアドレス、サブネットマスク、デフォルトゲートウェイ、DNSサーバーなどを自動で配る仕組みで、Discover・Offer・Request・Ackの4往復でアドレスを期限つきで貸し出します。AWSのVPCではAWSが提供し、DHCPオプションセットでDNSの設定を変えられます。

DNSは、example.com のような名前を IP アドレスに変える仕組みです。ほとんどの通信は最初に名前を引くので、DNS が止まったり古い答えが残ったりすると、サーバーが正常でも「サイトにつながらない」障害になります。

名前を引くときに働くのは、問い合わせを代わりに回ってくれるリゾルバ(キャッシュDNS)と、そのドメインの正しい答えを持つ権威DNSサーバーです。リゾルバは答えを TTL(キャッシュしてよい秒数)の間覚えておきます。下の手順は、どこにもキャッシュがないときの流れです。

  1. ブラウザのキャッシュ、OSのキャッシュ(/etc/hosts も含む)を確認

  2. フルサービスリゾルバ(ISPやVPCのDNS)に問い合わせ

  3. リゾルバがルートサーバーに問い合わせ → .com のTLDサーバーを教わる

  4. TLDサーバーに問い合わせ → example.com の権威DNSサーバーを教わる

  5. 権威DNSサーバーが IP アドレスを返す

  6. リゾルバが TTL の間キャッシュし、クライアントに返す

DNSの論点要点
TTL切り替え前に TTL を短くしておくのが移行の定石。長いと古いIPが残り続ける
ネガティブキャッシュ存在しない応答もキャッシュされる。レコード作成前に引くと一定時間引けない
DNSが障害点になるDNS障害で全サービスが止まることがある。リゾルバのキャッシュ、冗長化
Route 53 の機能ヘルスチェック、フェイルオーバー、加重ルーティング、レイテンシベース
リゾルバが上から順に聞きに行き、結果をTTLの間キャッシュするクライアントリゾルバルートTLD (.com)権威DNSexample.com は?問い合わせ.comはこちら問い合わせ権威はこちら問い合わせIPアドレスIPを返すリゾルバはTTLの間キャッシュ。切り替え前にTTLを短くするのが定石
DNSの名前解決

リゾルバのキャッシュがあるので、2回目以降はルートやTLDまで問い合わせない。

下の「ブラウザで試す」の図では、リゾルバがルート → TLD → 権威DNSの順に聞きに行き、ルートとTLDは答えではなく「次に聞く先」(NSレコード)を紹介するだけ、という流れを順に見られます。最後に権威DNSが返す答えに付いた TTL と、2回目の問い合わせではリゾルバがキャッシュから即答してルートやTLDに行かないところに注目してください。

別のページで開く →

ネットワーク図を読み込んでいます…

5.11DNSのレコードと運用

用語★★★ 必須
ひとことで

DNSは名前からIPアドレスなどを引く分散データベース。レコードの種類、TTL、キャッシュの性質を知っていると、移行や障害の判断を誤らない。

レコード用途例・注意点
A / AAAA名前 → IPv4 / IPv6アドレスexample.com → 192.0.2.10
CNAME名前 → 別の名前(別名)ゾーンの頂点には置けない。他のレコードと共存不可
ALIAS(Route 53)頂点でもAWSのリソースを指せる独自機能CloudFrontやALBを example.com に向けるとき
NSそのゾーンを管理するネームサーバー委任に使う
SOAゾーンの管理情報ネガティブキャッシュの時間にも関係
MXメールの受信サーバー優先度つきで複数指定
TXT任意の文字列SPF・DKIM・DMARC(なりすましメール対策)、ドメインの所有確認
CAA証明書を発行してよい認証局を限定意図しない証明書の発行を防ぐ
PTRIPアドレス → 名前(逆引き)メールサーバーの信頼性などで使う

TTLは、そのレコードをキャッシュしてよい秒数です。長いとDNSへの問い合わせが減って安定しますが、変更の反映が遅れます。切り替えの予定があるなら、事前にTTLを短くしておきます。また「存在しない」という応答もキャッシュされる(ネガティブキャッシュ)ので、レコードを作る前に問い合わせてしまうと、しばらく引けないことがあります。

調査コマンドわかること
dig example.com返ってくる値とTTL(残り秒数)
dig @8.8.8.8 example.com特定のリゾルバに聞いた結果(キャッシュの違いを比べる)
dig +trace example.comルートから順に委任をたどる様子
dig example.com NS / TXT / MX種類を指定して確認

SREとして押さえておきたい落とし穴もあります。Kubernetesでは、Podの設定(ndots:5 と検索ドメイン)により、外部の名前を引くたびに検索ドメインを付けた余計な問い合わせが何度も発生し、DNSの負荷や遅延の原因になることがあります。VPC内の名前解決はVPCのDNS(Route 53 Resolver)が担い、問い合わせ数に上限があるので、アプリ側でのキャッシュも検討します。DNSが止まると全サービスが止まって見えるので、DNSは最も重要な依存先の1つとして扱います。

CNAMEは「別名」。ゾーンの頂点には置けないのでALIASで代用するwww.example.comd123.cloudfront.netIPアドレス群CNAMEAexample.com(頂点)d123.cloudfront.net×頂点にはSOA・NSが必要で、CNAMEと共存できないRoute 53 の ALIAS なら頂点でも向けられるCNAMEの先のサービスを削除したまま放置すると、第三者に同じ名前を取られる「サブドメイン乗っ取り」の危険がある
CNAMEとALIAS

ドメインの頂点をCDNやロードバランサに向けるときはALIASを使う。

DNSの切り替えは、TTLを先に短くしておくのが定石1 TTLを短く切り替えの数日前に例:3600秒→60秒2 元のTTL分待つ古い長いTTLのキャッシュが消える3 レコード変更新しい宛先へ多くは数分で反映4 旧環境を残すTTLを守らない端末に備える5 TTLを戻す安定を確認後元の長さへ
DNS切り替えの手順

TTLを短くするのは「切り替えの前」。当日では間に合わない。

面接ではこう答える

DNSには、名前をIPに対応させるA、別名のCNAME、委任のNS、メールのMX、SPFなどに使うTXTなどのレコードがあります。CNAMEはゾーンの頂点に置けないので、Route 53ではALIASを使います。TTLは長いほど安定し短いほど変更が早く反映されるので、切り替えの前にTTLを短くしておきます。調査はdigで、TTLやリゾルバごとの違い、+traceで委任の流れを確認します。

別のページで開く →

ネットワーク図を読み込んでいます…

5.12ドメインの仕組み

用語★★★ 必須
ひとことで

ドメイン名は右から左へ木構造でたどる住所。自社のドメインは「レジストラで登録」し、「どのDNSサーバーに任せるか」を委任して初めて使える。

ドメイン名は、右端のルート(.)から、TLD(.com、.jpなど)、その下の名前へと、木構造で枝分かれしています。example.co.jp なら、jpがTLD、coは企業向けの区分、exampleが取得した名前です。取得した名前より左(shop.example.co.jp、api.shop.example.co.jp など)は、持ち主が自由に作れるサブドメインです。

ドメインを使うには2つの手続きがあります。1つは登録で、登録者(自社)がレジストラ(お名前.com、Route 53など)を通じて申し込み、レジストラがレジストリ(.jpならJPRS、.comならVerisign)に登録します。もう1つは委任で、TLDのDNSサーバーに「example.co.jp のことは、このネームサーバーに聞いて」というNSレコードを登録してもらいます。これで世界中のリゾルバが自社の権威DNSにたどり着けるようになります。

運用上のリスク対策
更新忘れでドメインが失効自動更新、支払い方法の管理、期限の監視、複数人への通知
ドメインの乗っ取り・不正な移管レジストラのアカウントにMFA、移管ロック(レジストラロック)
サブドメイン乗っ取り削除したサービスを指すCNAMEを放置しない。定期的に棚卸し
DNSサーバー移行時の不通新旧どちらのNSでも同じ内容を返す状態で切り替え、TTLを考慮する
DNSの応答の偽装必要に応じてDNSSECで署名し、応答の正しさを検証できるようにする

サブドメインを別のチームやAWSアカウントに任せたいときは、親ゾーンにそのサブドメイン用のNSレコードを置いて委任します(例:dev.example.com を開発用アカウントのRoute 53に任せる)。

ドメイン名は右から左へ、木の根から枝へ向かって読むapiホスト名shopサブドメインexample取得したドメイン名co.jpTLD(jp)と属性(co).ルートDNSはこの向きにたどる(ルート → jp → co.jp → example.co.jp → …)自分で管理できるのは、取得した example.co.jp から左側。サブドメインは自由に作れる末尾の「.」はルートを表し、普段は省略される
ドメイン名の構造

自分たちが自由にできるのは、取得した名前から左側。

ドメインは「登録」と「どのDNSサーバーに任せるか(委任)」の2つで成り立つ登録者(自社)ドメインの持ち主レジストラお名前.com・Route 53 などレジストリJPRS(.jp)・Verisign(.com)申し込み登録TLDのDNSexample.co.jp のNSレコード自社の権威DNS(Route 53 など)A・CNAME・MX などの実際のレコード委任更新を忘れてドメインが失効すると、全サービスが止まり、第三者に取られる危険もある。自動更新と期限の監視が必須DNSサーバーを移すときは、レジストラ側のNS設定を書き換える。TLD側のNSのTTLは長いので反映に時間がかかる
ドメインの登録と委任

登録(レジストラ)とDNSの運用(権威DNS)は別物。どちらが止まってもサービスは見えなくなる。

面接ではこう答える

ドメイン名は右から左へたどる木構造で、TLDの下に取得した名前があり、その左は自由にサブドメインを作れます。使うには、レジストラ経由でレジストリに登録し、TLDのDNSにNSレコードで自社の権威DNSへ委任します。運用では、失効防止の自動更新、レジストラアカウントの保護、放置CNAMEによるサブドメイン乗っ取りの防止が重要です。

ひとことで

メールは、送信サーバーが宛先ドメインのMXレコードを引き、受信サーバーへSMTPで渡す。受信側はSPF・DKIM・DMARCで「本物か」を確かめる。

アプリやメーラーは、まず自分の送信サーバー(Amazon SESなど)にSMTPでメールを渡します。送信サーバーは宛先アドレスのドメイン(例:gmail.com)のMXレコードをDNSで引き、そこに書かれた受信サーバーへSMTPで転送します。受信者はIMAP(またはPOP3)やWebメールでメールボックスから読みます。

メールはもともと送信者を偽れる仕組みなので、受信側はなりすましを見抜くために3つの確認をします。SPFは送信元サーバーのIPがドメインの許可リストにあるか、DKIMはメールに付いた電子署名をドメインの公開鍵で検証できるか、DMARCはSPFかDKIMが送信元ドメインと一致して合格したか、を確認し、失敗時の扱いを指示します。2024年からGmailやYahoo!は、大量に送る送信者にSPF・DKIM・DMARCの設定やワンクリックでの配信停止などを求めています。

設定・運用内容
SPF(TXT)v=spf1 include:amazonses.com ~all のように、送ってよいサーバーを宣言
DKIM(TXT/CNAME)SESなどが作った公開鍵をDNSに登録し、署名つきで送る
DMARC(TXT)_dmarc.example.com に p=none から始め、レポートを見て quarantine・reject へ
バウンス・苦情の処理届かなかったアドレスや迷惑メール報告を受け取り、以後送らない(送らないと評価が下がる)
送信ドメインを分けるマーケティングメールと、パスワードリセットなどの重要メールでドメインやIPを分ける
監視到達率、バウンス率、苦情率。SESは高すぎると送信停止になる
メールは送信サーバーが宛先ドメインのMXを引き、受信サーバーへSMTPで渡す送信者アプリ・メーラー送信サーバーSES など(MTA)受信サーバーGmail など(MTA)受信者IMAPで読むSMTPSMTP宛先ドメインのMXレコードをDNSで引く受信側が確かめること(なりすまし対策)SPF送ってきたサーバーのIPが、そのドメインの許可リスト(TXT)にあるかDKIMメールに付いた署名を、ドメインの公開鍵(TXT)で検証できるかDMARCSPFかDKIMが送信元ドメインと一致して合格したか。失敗時の扱い(none・quarantine・reject)
メールが届くまでの流れと認証

「メールが届かない」は、DNSの設定(SPF・DKIM・DMARC)か、送信元の評価の低下を疑う。

送信と受信で使うプロトコル

段階プロトコルポート役割
メーラー → 送信サーバー(投稿)SMTP(Submission)+ STARTTLS + SMTP AUTH587(465 は SMTPS)ログインして送信を依頼する
送信サーバー → 受信サーバー(配送)SMTP25宛先ドメインの MX レコードのサーバーへ届ける。サーバー間は認証がないので SPF・DKIM・DMARC で確かめる
受信サーバー → メールボックスLMTP など(MDA)—振り分けて保存する
メーラー ← メールボックス(受信)IMAP(IMAPS)993サーバーに残したまま読む。複数の端末で既読・フォルダを同期
〃POP3(POP3S)995端末にダウンロードして読む(基本はサーバーから消す)

送るのは SMTP、受け取るのは IMAP / POP3。「送信」と「受信」で別のプロトコル・別のサーバーを使う。

メール障害のときに見るところ

症状まず見るところコマンド・ログの例
送れない(メーラーでエラー)送信サーバーへの接続と認証(587/465 の疎通、パスワード、TLS)、送信制限・アカウントの停止openssl s_client -starttls smtp -connect smtp.example.com:587、SES の送信統計・停止状態
送ったのに届かない送信サーバーのキューとログ(deferred / bounced)、返ってきたバウンスメールの応答コードpostqueue -p、/var/log/maillog、SES のバウンス通知(SNS)
特定のドメインだけ届かない宛先の MX レコード、相手サーバーの拒否理由(4xx / 5xx)、ブロックリストへの掲載dig MX gmail.com、応答コード 550 / 421
迷惑メールに入る・拒否されるSPF・DKIM・DMARC の結果、送信元 IP・ドメインの評価受信したメールのヘッダー Authentication-Results、dig TXT _dmarc.example.com、Google Postmaster Tools
受信できない(メーラー)IMAP / POP3 への接続と認証、メールボックスの容量openssl s_client -connect imap.example.com:993
遅れて届く4xx(一時エラー)で再送待ち、グレイリスティング、送信レートの制限キューの滞留数と再送の間隔

よく見る SMTP の応答コード

コード意味送信側の動き
250受け付けた完了
421 / 450 / 451一時的に受け付けられない(混雑・グレイリスティングなど)時間をおいて自動で再送する
550宛先がない・ポリシーで拒否あきらめてバウンスを返す(以後そのアドレスには送らない)
552容量超過バウンス
554拒否(迷惑メール判定・認証失敗など)バウンス。SPF・DKIM・DMARC と評価を確認

調べる順番は「送信側のキューとログ → バウンスの応答コード → DNS(MX・SPF・DKIM・DMARC)→ 受信側」。どこで止まっているかを切り分ける。

面接ではこう答える

送信サーバーは宛先ドメインのMXレコードをDNSで引き、受信サーバーへSMTPで渡します。受信側はSPFで送信元IPが許可されているか、DKIMで署名が正しいか、DMARCでそれらがドメインと一致しているかを確かめます。運用ではバウンスや苦情を処理して送信元の評価を保ち、重要メールとマーケティングメールを分けて送ります。

別のページで開く →

ネットワーク図を読み込んでいます…

TLSは、HTTPS などの通信を暗号化し、接続先が本物かを証明書で確かめる仕組みです。データを送る前に、使う暗号方式を決めて共通の鍵を作る「ハンドシェイク」というやりとりをします。TLS 1.3 では、このやりとりが TLS 1.2 より1往復少なくなりました。

SRE にとっては、証明書の期限切れや中間証明書の不足のような「設定と監視で防げたはずの障害」が多い分野です。ハンドシェイクのどの段階で何を確かめているかを知っておくと、openssl s_client の出力やエラーメッセージから、失敗した段階を絞り込めます。

手順内容
1 ClientHello対応する暗号方式、鍵交換の材料、SNI(接続先ホスト名)を送る
2 ServerHello暗号方式を決定し、鍵交換の材料を返す。続けて証明書などを暗号化して送る
3 証明書検証クライアントがルート証明書まで辿って検証、ホスト名の一致を確認
4 暗号通信開始共通鍵で暗号化。TLS 1.3 は 1往復(1-RTT)で完了、再接続なら 0-RTT も可能
TLSでよくある障害原因
証明書の期限切れ更新漏れ。ACM の自動更新や期限監視で防ぐ
一部クライアントで失敗中間証明書の不足、古い TLS バージョンの非対応
違うサイトの証明書が返るSNI の設定誤り
TLS 1.3は1往復で暗号化通信を始められるクライアントサーバーClientHello(暗号方式・鍵共有・SNI)ServerHello + 証明書 + Finishedクライアントが証明書チェーンとホスト名を検証Finished暗号化されたHTTP暗号化されたHTTP
TLS 1.3のハンドシェイク

証明書の期限切れや中間証明書の不足は、この検証の段階で失敗する。

下の「ブラウザで試す」の図では、ClientHello と ServerHello で鍵交換の材料(key_share)を交わした時点で共通鍵が決まり、そこから先の証明書や Finished はもう暗号化されて送られる、という順番を見られます。クライアントが証明書の信頼の連鎖・ドメイン名・有効期限を確かめる段階と、Finished のあとで HTTP のデータが流れ始めるところに注目してください。

別のページで開く →

ネットワーク図を読み込んでいます…

5.15暗号と証明書

用語★★★ 必須
ひとことで

公開鍵暗号で相手を確かめて鍵を受け渡し、共通鍵暗号で実際のデータを暗号化する。証明書は「この公開鍵は本当にこのサイトのもの」という証明。

共通鍵暗号は暗号化と復号に同じ鍵を使い、高速です。ただし鍵を安全に相手へ渡す方法が問題になります。公開鍵暗号は、公開してよい鍵と秘密の鍵のペアを使い、鍵の受け渡しや署名ができますが、遅いです。TLSは両方の良いところを組み合わせ、最初に公開鍵暗号で相手を確かめて共通鍵を決め、以降は共通鍵で通信します。

証明書は、サーバーの公開鍵とドメイン名に、認証局(CA)が署名したものです。ブラウザやOSには信頼できるルートCAの証明書が最初から入っていて、サーバー証明書から中間CA、ルートCAへと署名をたどれれば信頼します。

ブラウザは、信頼済みのルートまで署名をたどって証明書を信じるルートCA証明書OS・ブラウザに最初から入っている中間CA証明書ルートCAが署名サーバー証明書example.com・中間CAが署名署名署名サーバーが送るもの・クライアントが確かめること・サーバーは「サーバー証明書+中間CA証明書」を送る・中間を送り忘れると、一部の端末だけで接続が失敗する・有効期限、ホスト名(SNI)の一致、失効していないか・署名をたどって手元のルートCAに行き着けば信頼暗号の役割分担公開鍵暗号:相手の確認と鍵の受け渡し(遅い)共通鍵暗号:実際のデータの暗号化(速い)TLSは最初に公開鍵暗号で共通鍵を決め、以降は共通鍵で通信
証明書チェーンと暗号の役割分担

「一部の端末だけ接続できない」は中間証明書の送り忘れが定番の原因。

第11章「セキュリティ」:暗号化と復号、公開鍵と秘密鍵を図で詳しく

面接ではこう答える

TLSでは、公開鍵暗号でサーバーの身元確認と共通鍵の受け渡しを行い、データ自体は高速な共通鍵暗号で暗号化します。証明書はサーバーの公開鍵にCAが署名したもので、クライアントは中間CAからルートCAまで署名をたどって検証します。

ひとことで

プロキシは「代理人」。利用者の代わりに外へ出るのがフォワードプロキシ、サーバーの代わりに受け付けるのがリバースプロキシ。

フォワードプロキシは利用者側に置き、社内からインターネットへの通信をまとめて中継します。アクセス先の制限やログ取得、キャッシュに使います。相手のサーバーからは、すべての社員がプロキシのIPから来たように見えます。

リバースプロキシはサーバー側に置き、利用者からのリクエストを受け付けて後ろのサーバーに振り分けます。Nginx、ALB、CloudFront、API Gatewayなどがこの役割で、TLSの終端、負荷分散、キャッシュ、WAF、圧縮、認証などをアプリの手前でまとめて行えます。ロードバランサは、負荷分散に特化したリバースプロキシと考えると分かりやすいです。

L4ロードバランサ(NLBなど)L7ロードバランサ(ALBなど)
見ている情報IPアドレスとポートHTTPの中身(パス、ホスト名、ヘッダー)
できること高速な転送、固定IP、TCP・UDP全般パスやホスト名での振り分け、TLS終端、リダイレクト
送信元IPそのまま届く(設定による)プロキシのIPになるので X-Forwarded-For で伝える

リバースプロキシを挟むと、アプリから見た接続元はプロキシになります。本当の利用者のIPはX-Forwarded-For、元のプロトコル(httpかhttpsか)はX-Forwarded-Protoヘッダーで伝えます。ただし利用者が自分でX-Forwarded-Forを偽って送ることもできるので、信頼できるプロキシが付けた値だけを使うように設定します。

プロキシで起きやすい問題原因
断続的な502プロキシとアプリのKeep-Aliveのタイムアウトの不一致
504・タイムアウトプロキシの待ち時間より処理が長い。各層のタイムアウトの関係を確認
ログのIPが全部同じX-Forwarded-Forを読んでいない
リダイレクトがhttpになるTLS終端後のアプリがhttpだと思っている。X-Forwarded-Protoを見る
大きなファイルのアップロード失敗プロキシのリクエストサイズ上限(Nginxのclient_max_body_size など)
フォワードは「利用者の代理」、リバースは「サーバーの代理」フォワードプロキシ(社内ネットワークの出口など)社員のPC社員のPC社員のPCプロキシフィルタ・ログインターネット相手からはプロキシに見えるリバースプロキシ(Nginx・ALB・CloudFront など)利用者リバースプロキシTLS終端・負荷分散・キャッシュ・WAF・圧縮アプリ1アプリ2アプリ3利用者からはサーバーが1台に見える。元の送信元IPは X-Forwarded-For ヘッダーで後ろに伝える
フォワードプロキシとリバースプロキシ

リバースプロキシは、アプリに入る前の「共通の玄関」。玄関の設定が原因の障害も多い。

面接ではこう答える

フォワードプロキシは利用者側に置いて外への通信を代理し、リバースプロキシはサーバー側に置いて受け付けを代理します。リバースプロキシではTLS終端、負荷分散、キャッシュ、WAFなどをまとめて行えます。アプリからは接続元がプロキシに見えるので、元のIPはX-Forwarded-Forで伝え、信頼できるプロキシの値だけを使います。

別のページで開く →

ネットワーク図を読み込んでいます…

5.17分散システム

★★★ 必須
テーマ押さえる点
CAP定理ネットワーク分断時に一貫性と可用性のどちらを取るか
一貫性モデル強い一貫性と結果整合性。キャッシュやレプリカは結果整合になりがち
コンシステントハッシュノード増減時に再配置されるキーを最小化する。分散キャッシュで使われる
合意アルゴリズムRaft / Paxos。etcd(Kubernetes)が Raft を使う
時刻の問題サーバー間の時計はずれる。順序付けは時刻に頼らない設計が望ましい

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • 「URL入力から表示まで」を層ごとに、壊れたときの調べ方まで話す
  • TCPの状態(TIME_WAIT、CLOSE_WAIT)とDNSのTTLが実務でよく効く
  • ポート番号:1台のサーバーの中で、どのプログラムに届けるかを示す番号。IPアドレスが建物なら、ポートは部屋番号。
  • IPアドレスとCIDR:IPv4アドレスは32ビットの数。/24のような表記は「先頭から何ビットがネットワークを表すか」を示す。
  • IPv4とIPv6:IPv4は約43億個しかなくNATで足りない分をしのいでいる。IPv6は桁違いの数があり、全員に直接アドレスを配れる。移行期は両方を使う。
  • DHCP:ネットワークにつないだ端末に、IPアドレスやDNSサーバーなどの設定を自動で配る仕組み。
  • DNSのレコードと運用:DNSは名前からIPアドレスなどを引く分散データベース。レコードの種類、TTL、キャッシュの性質を知っていると、移行や障害の判断を誤らない。
  • ドメインの仕組み:ドメイン名は右から左へ木構造でたどる住所。自社のドメインは「レジストラで登録」し、「どのDNSサーバーに任せるか」を委任して初めて使える。
  • メールの基本(どのように届くのか):メールは、送信サーバーが宛先ドメインのMXレコードを引き、受信サーバーへSMTPで渡す。受信側はSPF・DKIM・DMARCで「本物か」を確かめる。
  • 暗号と証明書:公開鍵暗号で相手を確かめて鍵を受け渡し、共通鍵暗号で実際のデータを暗号化する。証明書は「この公開鍵は本当にこのサイトのもの」という証明。
  • プロキシとロードバランサ:プロキシは「代理人」。利用者の代わりに外へ出るのがフォワードプロキシ、サーバーの代わりに受け付けるのがリバースプロキシ。

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1ブラウザでURLを入力してから画面が表示されるまでに何が起きますか?

模範回答

まずDNSで名前を解決し、IPアドレスを得ます。次にTCPの3ウェイハンドシェイクで接続し、TLSハンドシェイクで暗号化の準備をします。その上でHTTPリクエストを送り、CDN、ロードバランサ、アプリ、キャッシュやDBを経てレスポンスが返り、ブラウザがHTMLを解析して追加のリソースを取りに行きます。どこまで深く話すかは面接官の反応を見て決め、各段階の障害例を添えると強くなります。

深掘りされたら

  • DNSの部分をもっと詳しく。
  • HTTP/2になると何が変わりますか?

見られているポイント層ごとの理解と障害への結びつけ

Q2TIME_WAIT が大量にあります。何が起きていて、どう対処しますか?

模範回答

自分から接続を閉じた側に、遅れて届くパケットに備えて一定時間残る状態です。短い接続を大量に張っていると溜まり、エフェメラルポートが枯渇して新しい接続が作れなくなります。Keep-Aliveや接続プールで接続を再利用するのが根本対策です。逆に CLOSE_WAIT が溜まっている場合は、アプリがソケットを閉じていないバグを疑います。

深掘りされたら

  • カーネルパラメータで対処するのはどうですか?

見られているポイントTIME_WAIT と CLOSE_WAIT の区別

Q3DNSの切り替えで気をつけることは?

模範回答

レコードはTTLの間キャッシュされるため、切り替えの数日前にTTLを短くしておき、切り替え後も旧環境をしばらく残します。クライアントやアプリ側のDNSキャッシュがTTLを守らない場合もあるので、旧環境へのアクセスがゼロになったことを確認してから停止します。

深掘りされたら

  • 存在しないレコードを先に引いてしまうとどうなりますか?

見られているポイントTTLとネガティブキャッシュ

Q4CAP定理を説明してください。

模範回答

ネットワーク分断が起きたとき、一貫性(どこから読んでも最新)と可用性(常に応答する)を同時には満たせない、という考え方です。分断は避けられないので、実際の設計では分断時にどちらを優先するかを選びます。たとえば決済は一貫性、SNSのタイムラインは可用性を優先する、といった判断です。

深掘りされたら

  • あなたの扱っているシステムではどちらを優先していますか?

見られているポイント具体例で選択を説明できるか

Q5DNSを別のサービスへ移行する手順を説明してください。

模範回答

新しいDNSに同じレコードをすべて作り、digで新旧が同じ応答を返すことを確認します。変更予定のレコードのTTLは事前に短くしておきます。そのうえでレジストラのNS設定を新しいネームサーバーに切り替えます。TLD側のNSのTTLは長いので、しばらくは新旧どちらにも問い合わせが来る前提で、旧DNSも同じ内容のまま残します。問い合わせが新DNSに移りきったことを確認してから旧DNSを止めます。

深掘りされたら

  • メールが届かなくなるリスクはどこにありますか?

見られているポイントキャッシュとTTLを踏まえた手順

Q6サーバーで起動したアプリに、外部から接続できません。ポートの観点で何を確認しますか?

模範回答

まず ss -tlnp で、そのアプリが本当にLISTENしているか、待ち受けているアドレスが0.0.0.0(全体)なのか127.0.0.1(自分の中だけ)なのかを確認します。次に、ローカルから curl で応答を確かめ、その後ネットワークの経路として、セキュリティグループ、NACL、OSのファイアウォール、LBのターゲットグループのポート設定を順に確認します。1024未満のポートならroot権限の問題で起動に失敗していないかも見ます。

深掘りされたら

  • コンテナの場合はどこを追加で確認しますか?

見られているポイント待ち受け先と経路の両方を順に確認できるか

Q7メールが相手に届かないと問い合わせがありました。どう調べますか?

模範回答

送信サービス(SESなど)の送信ログで、送信できたか、バウンスや拒否になっていないかを確認します。拒否の理由を見て、SPF・DKIM・DMARCの設定がDNSに正しく入っているかをdigで確認し、送信元の評価(バウンス率や苦情率)が悪化していないかも見ます。宛先側の迷惑メールフォルダに入っている可能性もあるので、ヘッダーの認証結果(Authentication-Results)を確認してもらいます。

深掘りされたら

  • DMARCをいきなりrejectにするとどうなりますか?

見られているポイント送信側・DNS・評価の3つを切り分けられるか