基本情報・応用情報技術者試験を勉強する中で、ネットワーク系の箇所に苦手意識があったので、ネットワークの基礎がわかる・自分で手を動かしながら学べる書籍を探していたところ、『Linuxで動かしながら学ぶTCP/IP入門』を見つけました。
「ネットワークの初歩」的な内容ですが、今まであった所謂解説本とは異なり、実際にpingやtcpdumpコマンドを使いながら疎通を覗くことで、パケットやEthenetヘッダーの動きを知ることができます。
以下、各章で学ぶことができる内容を簡単にまとめました。このあたりの理解に不安がある方は、手を動かしながら学んでみることをおすすめします。
なお、書籍内では、検証に使用するLinux環境(Ubuntu)は実機またはVagrantを紹介していますが、実務でDockerを使用する機会が多かったので、DockerでUbuntu環境を構築しました。
環境構築
-DockerFile
-docker-compose.yml
FROM ubuntu:20.04
# 検証に使用するモジュールのインストールをしておく
RUN apt-get update
RUN apt-get -y install \
bash \
coreutils \
grep \
iproute2 \
iputils-ping \
traceroute \
tcpdump \
bind9-dnsutils \
dnsmasq-base \
netcat-openbsd \
python3 \
curl \
wget \
iptables \
procps \
isc-dhcp-client
[docker-compose.yml]
version: '3'
services:
ubuntu:
build: .
working_dir: /var/tmp
volumes:
- ./work:/var/tmp
# コンテナ起動後、StatusがExitにならないようttyの設定
tty: true
privileged: true
TCP/IPとは
- TCP/IP・プロトコル・パケット・IPアドレス・ヘッダなどの基礎項目のおさらい
- pingの結果が読める
- tcpdumpでping(icmp)の通信をキャプチャできる・その内容がわかる
- 端末からルーターを通してインターネットに繋がるイメージをつかむ
Network Namespace
-
netns
コマンドを利用して、同一セグメント内(ネットワークアドレスが同一)の仮想ネットワークを作成できる -
netns
コマンドを利用して、ルーターを経由し、セグメントが2つのネットワークを作成できる - ルーティングテーブルの内容を理解できる
-
netns
コマンドを利用して、セグメントが3つ(ルーターが2つ)のネットワークを作成できる
イーサネット
- IPのパケット
- トランスポート層
- IPアドレスを使用して送信元・送信先を判定
- イーサネットのフレーム
- データリンク層
- MACアドレスを使用して送信元・送信先を判定
-
netns
コマンドを利用して、MACアドレスを基準としてパケットがイーサネットのフレームで運ばれる様子をtcpdumpでキャプチャできる - 同一セグメント内のイーサネットのフレームの動きを観察できる
- セグメントが2つに増えた場合、イーサネットのフレームが変わる様子を観察できる
- ブリッジの仕組みを理解し、同一のブロードキャストドメインに複数のネットワーク機器をつなげる方法を理解する
- ブリッジ:それぞれのポートに繋がっているMACアドレスを学習して、必要なポートにだけフレームを転送する
トランスポート層のプロトコル
- アプリケーションとポート番号の関係性
-
nc
コマンドを使い、UDPで文字列を送受信する - 信頼性のあるトランスポート層のプロトコルでTCPを使用する。スリーウェイハンドシェイクによってコネクションを確立した上でデータの送受信を行う流れを観察する
アプリケーション層のプロトコル
- HTTPサーバを立てて、疎通・データの流れをキャプチャできる
- DNSでの名前解決の仕組みについて説明できる。OS内部のリゾルバによる挙動によってコンピュータ内部(hostsファイル)と外部(DNSサーバ)で異なる点について理解できる
- DHCPプロトコルでコンピュータのネットワークを自動的に設定する仕組みについて理解できる
NAT
- グローバルIP・ローカルIPアドレスの違いが理解できる
- NAT・NAPTの仕組みを理解できる
-
netns
で仮想LAN・WANを作成し、仮想LANの送信元IPアドレスがグローバルIPアドレス(=ルーターのアドレス)に書き換えられる挙動を仮想WAN側で観察できる(SourceNAT) -
netns
で仮想LAN・WANを作成し、仮想WANの送信先IPアドレスがローカルIPアドレス(=LAN内の特定のパソコン)に書き換えられる挙動を仮想LAN側で観察できる(DestinationNAT)
ソケットプログラミング
- ソケットプログラミングとは
- ソケットの仕組みをPythonスクリプトで再現し、ソフトウェアからTCP/IPをどのように扱っているのかを理解する
最後に
今まで、用語だけ覚えて何となくの理解しかできていなかった部分について、
実際にデータの流れを追うことで、落とし込むことができたかなと思います。