インターフェースとアドレスを読み、サブネットを切る
このラボはVM上で動きます
Ubuntu 24.04のVMが1台です。rootで、カーネルの権限があるので、インターフェースを作成してアドレスを付けられます。最初の起動には1–2分かかります(パッケージをインストールするためです)。
目標
自分のコンピューターがどのインターフェースでどのアドレスを持ち、どこへ出ていくのかを読み取り、サブネットを計算し、インターフェースを自分で作ってアドレスを付けます。
なぜ重要なのか
「同じサブネットか」は、ネットワークで最初に分かれる問いです。同じならARPで直接呼び出し、違えばゲートウェイに任せます。そのため、マスクを1つ間違えると隣の席のコンピューターが地球の反対側になり、ゲートウェイのアドレスを別のアドレス帯に書くと「Network is unreachable」が出ます。この計算は、ファイアウォールのルール・KubernetesのPodのアドレス帯・VPC設計の土台なので、ここで手に馴染ませておくと、以降のすべてのラボが楽になります。
ステップ
ip -br linkの結果を/root/ip/links.txtに保存してください。loと、デフォルトルートが出ていくインターフェース(このVMではenp1s0)がUPで表示される必要があります。- デフォルトルートのインターフェースのIPv4アドレスを、プレフィックス付きで
/root/ip/addr.txtに1行で保存してください(例:10.0.2.2/24の形)。 172.16.37.200/20を計算して、/root/ip/calc.txtにnetwork=・broadcast=・first=・last=・hosts=の5行で保存してください。10.42.0.0/24を/26で4つに分けて、/root/ip/split.txtに1行に1つずつ、네트워크/26 첫호스트 마지막호스트の形で書いてください(プレースホルダーはネットワーク、最初のホスト、最後のホストです)。- ダミーインターフェース
lab0を作成し、192.0.2.10/28を付けてUPにしてください。 lab0に2つ目のアドレス192.0.2.20/28を追加して、ip -br -4 addr show lab0の結果を/root/ip/lab0.txtに保存してください。- 5組が同じサブネットかを判定して、
/root/ip/pairs.txtに주소/프리픽스 상대주소 same|differentの形で書いてください(プレースホルダーはアドレスとプレフィックス、相手のアドレスです)。組は10.0.0.5/24 10.0.0.200、10.0.1.5/24 10.0.0.200、192.168.1.77/25 192.168.1.130、172.16.5.9/12 172.31.0.1、172.16.5.9/16 172.31.0.1です。 /root/ip/report.mdに、uplink=・address=・gateway=の3行と、ゲートウェイが必ず同じサブネットにいなければならない理由を書いてください。
参考
ip -brは1行の要約、ip -jはJSONです。ip -j addr | jqで値を取り出せます。ipcalc 172.16.37.200/20が、ネットワークアドレス・ブロードキャストアドレス・ホスト数を計算してくれます。python3 -c 'import ipaddress'で検算できます。- ダミーインターフェースは
ip link add lab0 type dummyで作ります。ケーブルがなくてもアドレスを付けられるので、サービス用のアドレスを置くのに使います。 - よくある間違い:
/12を/16と読んでしまうことです。172.16.0.0/12は172.16から172.31までです。
インターフェース一覧
ip -br linkの結果を /root/ip/links.txt に保存してください。loと、デフォルトルートが出ていくインターフェースがUPで表示される必要があります。
まずmkdir -p /root/ipを実行します。-brはbriefで、インターフェースごとに名前・状態・MACを1行で表示します。デフォルトルートのインターフェースは、ip route show defaultのdevの後ろにあります。
自分のアドレスとプレフィックス
デフォルトルートのインターフェースのIPv4アドレスを、プレフィックス付きで /root/ip/addr.txt に1行で保存してください。
ip -br -4 addr show <인터페이스>の3列目に、アドレスとプレフィックスが주소/프리픽스の形で表示されます。JSONのほうが扱いやすければ、ip -j addr show <인터페이스> | jqで.addr_info[].localと.prefixlenを取り出してください(プレースホルダーはインターフェース名と、アドレスとプレフィックスです)。
サブネットの計算
172.16.37.200/20を計算して、/root/ip/calc.txt にnetwork=・broadcast=・first=・last=・hosts=の5行で保存してください。
ipcalc 172.16.37.200/20がすべて計算してくれます。/20は3番目のオクテットの先頭4ビットまでがネットワークなので、37は32–47のブロックの中にあります。hostsは、全体からネットワークアドレスとブロードキャストアドレスの2つを引いた数です。
サブネットの分割
10.42.0.0/24を/26で4つに分けて、/root/ip/split.txt に1行に1つずつ、네트워크/26 첫호스트 마지막호스트の形で書いてください(プレースホルダーはネットワーク、最初のホスト、最後のホストです)。
/24から/26へ2ビットを借りると、64個ずつのブロックが4つになります。ブロックの境界は0・64・128・192です。各ブロックの最初のホストはネットワークアドレス+1、最後はブロードキャストアドレス-1です。
インターフェースを作ってアドレスを付ける
ダミーインターフェースlab0を作成し、192.0.2.10/28を付けてUPにしてください。
ip link add lab0 type dummy → ip addr add 192.0.2.10/28 dev lab0 → ip link set lab0 up。ダミーにはケーブルがないため、状態がUNKNOWNと表示されても、フラグにUPがあれば有効になっています。
1つのインターフェースに2つのアドレス
lab0に2つ目のアドレス192.0.2.20/28を追加して、ip -br -4 addr show lab0の結果を /root/ip/lab0.txt に保存してください。
ip addr addをもう一度実行するだけです。1つのインターフェースには、アドレスをいくつでも付けられます。保存したファイルに両方のアドレスが表示されている必要があります。
同じサブネットか
5組が同じサブネットかを判定して、/root/ip/pairs.txt に주소/프리픽스 상대주소 same|differentの形で書いてください(プレースホルダーはアドレスとプレフィックス、相手のアドレスです)。組は10.0.0.5/24 10.0.0.200、10.0.1.5/24 10.0.0.200、192.168.1.77/25 192.168.1.130、172.16.5.9/12 172.31.0.1、172.16.5.9/16 172.31.0.1です。
判定の基準は「相手のアドレスが自分のネットワークの中にあるか」です。/25は128で分かれ、/12は172.16–172.31を1つの塊として扱います。Pythonのipaddress.ip_address(b) in ipaddress.ip_network(a, strict=False)で検算してください。
学んだこと
/root/ip/report.md に、uplink=・address=・gateway=の3行と、ゲートウェイが必ず同じサブネットにいなければならない理由を書いてください。
uplinkはデフォルトルートのインターフェース名、addressはステップ2の値、gatewayはip route show defaultのviaの後ろのアドレスです。説明には、ARPが同じリンクにしか届かないという点を含める必要があります。