SA.02.1 拠点内のネットワーキング (重要度: 4)
ネットワークを論理的に分割するための技術の概要
ルーティング: ip route
ipコマンドは、ルーティング、ネットワークデバイス、インターフェースやトンネルの情報を表示したり、操作したりするコマンドです。
オブジェクトを対象にとる場合には
ip [ OPTIONS ] OBJECT { COMMAND | help }
の形をとります。今回はルーティングを対象にとる場合を扱いますので、OBJECTの部分にroute(r)を入れると、
ip route { COMMAND | help }
または
ip r { COMMAND | help }
と書けます。なお、今回は[OPTIONS]は割愛します。
ip route
はルーティングテーブルの情報を表示するコマンドです。同様のコマンドに
ip route show
がありますが、こちらはip routeよりも詳細な情報を取得します。
ip route add <特定のIPアドレス/サブネットマスク> via <ゲートウェイのIPアドレス>
ip route delete <特定のIPアドレス/サブネットマスク> via <ゲートウェイのIPアドレス>
は、特定のipアドレスへの送信経路を追加/削除します。
ip route add default via <ゲートウェイのIPアドレス>
ip route delete default via <ゲートウェイのIPアドレス>
は、デフォルトゲートウェイのIPアドレスを追加/削除します。
参考:https://www.man7.org/linux/man-pages/man8/ip.8.html
VLAN, VXLAN
VLAN(Virtual Local Area Network)は、ネットワーク上で物理的なネットワークを論理的に分割する技術です。VLANを使用することで、複数の異なるネットワークを同じ物理的なネットワーク上で分離することができます。各VLANは、異なるVLAN IDを持ち、通信はVLAN IDに基づいて制御されます。VLANは、セキュリティ、トラフィックの分離、スケーラビリティなどの目的で使用されます。
VXLAN(Virtual Extensible LAN)は、仮想ネットワーク上で拡張されたL2ネットワークを提供する技術です。VXLANは、トラディショナルなVLANの限界を克服し、大規模な仮想ネットワークをサポートします。VXLANは、ネットワーク仮想化技術であるSDN(Software-Defined Networking)と組み合わされることがよくあります。VXLANでは、VXLAN IDと呼ばれる仮想ネットワークを表す特別なIDが使用され、通信はこのIDに基づいて管理されます。
主な違いは以下のとおりです:
- VLANは物理的なネットワークを論理的に分割し、VXLANは仮想ネットワーク上でL2ネットワークを提供します。
- VLANはVLAN IDを使用して通信を制御しますが、VXLANはVXLAN IDを使用します。
- VLANは、L2スイッチを使用してトラフィックを分割しますが、VXLANはL3ルーティングを使用してトラフィックを制御します。
どちらの技術も、ネットワークのスケーラビリティ、セキュリティ、仮想化をサポートするために使用されますが、VXLANはより柔軟な仮想ネットワーキング環境を提供するため、SDNとの組み合わせでより一般的に使用される傾向があります。
トンネリング, カプセリング, オーバーレイネットワーク
トンネリングは、異なるネットワークプロトコルを持つ2つのネットワークを接続するための技術です。通常、パケットは別のプロトコルパケットのペイロード(データ部分)に包まれてネットワーク上を転送され、宛先で再び元のプロトコルパケットに戻されます。トンネリングは通常、ネットワークの論理的な接続を提供し、異なるネットワークプロトコル間で通信を可能にします。
カプセリングは、通信データを別のデータの中に包むことであり、異なる目的のために使用される場合があります。一方が別の一方をカプセル化して、外包されたデータが内側のデータを含んでいる形です。カプセリングは異なるレベルのプロトコル間の通信(たとえば、アプリケーション層データをネットワーク層パケットに包む場合など)や、セキュリティ(たとえば、暗号化されたデータを別のプロトコルのヘッダに包む場合など)を実現するために使用されます。
つまり、トンネリングは2つの異なるネットワークを接続するために使用され、カプセリングはデータを包み込んで異なる目的やレベルの通信を可能にします。トンネリングは通信の経路を変更することができ、カプセリングはデータを内包する仕組みです。
オーバーレイネットワーク(Overlay Network)は、物理的なネットワークの上に追加の仮想ネットワークを構築する技術です。オーバーレイネットワークは、物理的なネットワークのトポロジーや制約から独立して、セグメンテーションやセキュリティ制御、仮想マシンやコンテナの移動、マルチテナンシーの実現など、様々な目的で使用されます。オーバーレイネットワークは、VXLANやGRE(Generic Routing Encapsulation)などのプロトコルによって実現されることがあります。オーバーレイネットワークは、物理的なネットワークを意識することなく、より柔軟なネットワーク環境を提供します。
仮想マシンやコンテナのネットワーク構成に使われる Linux の機能
仮想ブリッジ
brctlは、Linuxシステムで仮想ブリッジを管理するためのコマンドラインツールです。
仮想ブリッジは、物理的なネットワークインターフェースや仮想マシンのネットワークインターフェースを結びつけるために使用されます。これにより、複数のネットワークインターフェースを1つのネットワーク上に統合することができます。物理的なネットワークスイッチと同様の機能を持つ仮想スイッチを作成することができます。
brctlコマンドは、以下のような一連の機能を提供します:
- ブリッジの作成: brctl addbrコマンドを使用して新しい仮想ブリッジを作成することができます。
- インターフェースの追加: brctl addifコマンドを使用して、既存のブリッジにネットワークインターフェースを追加することができます。
- インターフェースの削除: brctl delifコマンドを使用して、ブリッジからネットワークインターフェースを削除することができます。
- ブリッジの削除: brctl delbrコマンドを使用して、既存の仮想ブリッジを削除することができます。
これらのコマンドを使用することで、Linuxシステム上で仮想ブリッジを作成し、ネットワークインターフェースを結びつけることができます。これは、ネットワークのセグメンテーションやトラフィック管理など、さまざまな目的で使用されます。
参考:https://www.man7.org/linux/man-pages/man8/brctl.8.html?ref=m00nie.com
NAT (NAPT)
NAT(Network Address Translation)とNAPT(Network Address and Port Translation)は、両方ともネットワークのアドレス変換を行うための技術ですが、異なるアプローチを取っています。
NATは、プライベートネットワーク内のデバイスがインターネットにアクセスする際に、送信元IPアドレスをプライベートアドレスからパブリックアドレスに変換することを目的としています。つまり、送信元のIPアドレスのみ変換されます。これにより、プライベートネットワーク内のデバイスは個別のパブリックIPアドレスを持たずに、インターネットにアクセスできるようになります。
一方、NAPTは、プライベートネットワーク内のデバイスがインターネットにアクセスする際に、送信元IPアドレスとポート番号を変換することを目的としています。つまり、送信元のIPアドレスとポート番号の両方が変換されます。これにより、プライベートネットワーク内の複数のデバイスが同じパブリックIPアドレスを共有しながら、一意のポート番号を使用してインターネットにアクセスできるようになります。
簡単に言えば、NATは単純なアドレス変換を行い、NAPTはアドレスとポート番号の変換を行っています。
iptablesは、Linuxシステムでファイアウォールやネットワークアドレス変換(NAT)を管理するためのコマンドラインツールです。「チェイン」と呼ばれるルールの集合にルールを追加/削除することでパケットフィルタリングを実現します。いくつかのチェインのセットのことを「テーブル」と呼び、デフォルトでは以下のような種類があります。ユーザが独自にテーブルを定義することも可能です。
テーブル | デフォルトチェイン |
filter(デフォルト) | INPUT, OUTPUT, FORWARD |
nat | PREROUTING, POSTROUTING, OUTPUT |
mangle | INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING |
raw | PREROUTING, OUTPUT |
また、上述の「ルール」とは厳密にはどのパケットを対象にするかの条件付けを指し、条件に合致したパケットに対する操作は「ターゲット」と呼びます。主なルールとターゲットは以下です。
ルール | 説明 |
-s <送信元> | 送信元のipアドレスを指定する |
-d <送信先> | 送信先のipアドレスを指定する |
–sport <ポート番号> | 送信元のポート番号を指定する |
–dport <ポート番号> | 送信先のポート番号を指定する |
-j <ターゲット> | ルールが適用されるターゲットを指定する |
-p <プロトコル> | プロトコルを指定する(tcp, udp, icmpなどのプロトコル名、もしくはall) |
-i <インターフェース> | 入力インターフェースを指定する |
-o <インターフェース> | 出力インターフェースを指定する |
ターゲット | 説明 |
ACCEPT | パケットの通過を許可する |
DROP | パケットを廃棄する |
REJECT | パケットを拒否して送信元に通知する |
MASQUARADE | 送信元のipアドレス/ポート番号を変換する |
SNAT | 送信元のipアドレスを変換する |
DNAT | 送信先のipアドレスを変換する |
LOG | ログに出力する |
#チェインにルールを追加
iptables -A <チェイン> <ルール>
iptables --append <チェイン> <ルール>
#チェインからルールを削除
iptables -D <チェイン> <ルール>
iptables --delete <チェイン> <ルール>
#チェインにポリシー(デフォルトのターゲット)を追加
iptables -P <チェイン> <ターゲット>
iptables --policy <チェイン> <ターゲット>
なお、上述のコマンドはIPv4を対象にしたものでしたが、IPv6を対象にする場合にはiptablesの代わりにip6tablesにすることで、上の説明と同様の使い方が可能です。
参考:https://man7.org/linux/man-pages/man8/iptables.8.html
DHCP: dnsmasq
DHCP(Dynamic Host Configuration Protocol)は、ネットワーク内のデバイスに自動的にIPアドレスやその他のネットワーク設定情報を割り当てるためのプロトコルです。主な目的は、ネットワークの管理を簡素化し、IPアドレスの重複や入力ミスによるネットワークの設定エラーを防ぐことです。
DHCPでは、以下の役割があります:
- DHCPサーバー:ネットワーク内のDHCPサーバーは、デバイスにIPアドレスやその他の設定情報(サブネットマスク、デフォルトゲートウェイ、DNSサーバーのアドレスなど)を提供します。デバイスがネットワークに参加する際に、自動的にこれらの設定情報を取得することができます。
- DHCPクライアント:デバイスは、ネットワークに参加する際にDHCPサーバーからIPアドレスや設定情報をリクエストします。DHCPクライアントは、ネットワークに接続したり、IPアドレスを再割り当てしたりする際にDHCPサーバーと通信します。
dnsmasqは、DHCP(Dynamic Host Configuration Protocol)およびDNS(Domain Name System)サーバーとして機能するオープンソースのツールであり、主に小規模なネットワーク環境で使用されます。
dnsmasqは、シンプルな設定ファイルを使用してカスタマイズでき、ネットワークの要件に合わせて機能やパラメーターを調整することができます。また、DNSの重要な機能であるハイジャックという問題を防ぐために、安全な設定オプションも提供しています。dnsmasqは軽量で非常に柔軟なソフトウェアであり、統合されたDNSキャッシュ機能を備えています。このため、クライアントが特定のホスト名を解決する際に、dnsmasqは最初にキャッシュを確認し、結果を返すことで応答時間を短縮します。
また、dnsmasqはDHCPサーバーとしても動作します。これは、ネットワーク内のクライアントデバイスに自動的にIPアドレスやその他のネットワーク設定を割り当てるために使用されます。dnsmasqは、静的IPアドレスの割り当てや、特定のデバイスに対して異なるネットワーク設定を提供することも可能です。
dnsmasqをDHCPサーバとして設定するには、/etc/dnsmasq.confに記述する方法と、コマンドラインのオプションとして記述する方法があります。一例として、/etc/dnsmasq.confに
dhcp-range=192.168.0.100,192.168.0.200,12h
このように記述したとします。これは、dnsmasqの起動時に以下のようなオプションをつけることと同義です。
dnsmasq --dhcp-range=192.168.0.100,192.168.0.200,12h
または
dnsmasq -F dhcp-range=192.168.0.100,192.168.0.200,12h
一般的には、恒常的な設定は設定ファイルに記述することが適当です。なお、設定がコマンドラインと設定ファイルで重複した場合には、コマンドラインでの設定が優先されます。
dnsmasqをDHCPサーバとして運用する場合、最低限の設定としては、dhcp-rangeがあります。
dhcp-range=192.168.0.100,192.168.0.200,12h
この右辺の第一変数(192.168.0.100)は貸し出すipアドレスの開始点、第二変数(192.168.0.200)は貸し出すipアドレスの終了点、そして第三変数(12h)は貸し出す期間を設定しています。
参考:https://wiki.archlinux.jp/index.php/Dnsmasq#DHCP_.E3.82.B5.E3.83.BC.E3.83.90.E3.83.BC
TAP/TUN デバイス, 仮想 NIC, veth
TAP/TUN デバイスは、仮想ネットワークインターフェースの一種です。TAP(ユーザースペースインターフェース)はユーザーランドプログラムによって利用され、TUN(カーネルスペースインターフェース)はカーネルドライバによって利用されます。これらのデバイスは、仮想的なネットワーク接続を作成するために使用されます。
また、仮想 NIC (Network Interface Card) は仮想マシンまたは仮想化環境で使用されるネットワークインターフェースです。これらの仮想 NIC は、ハードウェアの物理 NIC と同じように動作し、パケットの送受信やネットワーク接続を提供します。
さらに、veth はカーネル内部で接続されたペアのネットワークインターフェースです。この veth ペアは、仮想ブリッジや仮想マシンとの間の仮想的なネットワークパスを作成するために使用されます。一方の veth インターフェースはカーネル内にあり、もう一方の veth インターフェースはユーザーランドプログラムとの間で通信することができます。
仮想マシンやコンテナで使われる主要なネットワーク設定
libvirt デフォルト仮想ブリッジ (virbr0)
#/etc/libvirt/qemu/networks/default.xml
<network>
<name>default</name>
<uuid>92b9f84f-5363-4fe2-9df7-1b9901b3a144</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:xx:xx:xx'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
参考:https://qiita.com/TsutomuNakamura/items/c3c0bce14966cd0d2b87
Docker Bridge ドライバ (docker0), Host ドライバ
#daemon.jsonの設定(docker0)
{
"bip": "192.168.1.1/24",
"fixed-cidr": "192.168.1.0/25",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "192.168.1.254",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
参考(docker0):https://qiita.com/msi/items/d9cc1a2fd3f0fed3a901
Hostドライバについては何を指しているのか不明
ホストをまたがるコンテナ間通信のための主要な実装
Docker overlay ネットワークドライバ
Docker overlay ネットワークドライバは、複数の Docker ホスト上でコンテナを接続するための仮想ネットワークを作成するためのドライバです。これにより、Docker クラスタ内のコンテナが同じネットワークに属しているように見えます。
overlay ネットワークドライバは、Docker の Swarm モードで使用されることがありますが、単一の Docker ホスト上でも使用できます。overlay ネットワークドライバでは、データプレーン暗号化 (data-plane encryption) やマルチホストネットワーク (multi-host networking) の機能が提供されます。
overlay ネットワークドライバを使用すると、Docker クラスタ上の異なるホスト上にあるコンテナが同じ仮想ネットワーク内に存在しているかのように通信できるようになります。これには、オーバーレイネットワークと呼ばれる仮想ネットワークが使用されます。この仮想ネットワークは、フローテーブルエントリによって構成され、ホスト間のトラフィック経路を確立します。
overlay ネットワークドライバは、Docker コマンドを使用して手動で作成することもできます。たとえば、docker network create --driver overlay network_name
のようなコマンドを使用して、新しいオーバーレイネットワークを作成できます。
overlay ネットワークドライバは、Docker コンテナ間のネットワーク通信をシームレスにし、スケーラビリティと可用性を向上させます。これにより、分散アプリケーションのデプロイメントと管理が容易になります。
参考:https://docs.docker.jp/network/overlay.html
flannel, Calico
flannelとCalicoは、コンテナと仮想マシンのネットワーキングを担当するためのネットワークプラグインです。
- flannel: flannelは、コンテナと仮想マシンを接続するためのオーバーレイネットワークを提供するネットワークプラグインです。flannelは、DockerやKubernetesなどのオーケストレーションツールでよく使用されます。
flannelは、異なるホスト間での通信を可能にするため、L2またはL3ネットワーキングモードを提供します。 flannelは、IPオーバーオーバーレイネットワークプロトコルを使用し、トラフィックをシームレスに転送します。
- Calico: Calicoは、セキュアでスケーラブルなネットワーキングを提供するネットワークプラグインです。Calicoは、プログラム可能なネットワークを提供するためにBGP(Border Gateway Protocol)を使用します。
Calicoは、パブリックまたはプライベートなクラウド環境に対して適しており、高度な可視性とネットワークポリシーの管理が可能です。Calicoは、大規模なクラスターでの高いパフォーマンスと可用性を提供します。
どちらのネットワークプラグインも、コンテナ環境でのネットワークの構築と管理を容易にします。選択は、使用するオーケストレーションツールやアプリケーションの要件に基づいて行う必要があります。
参考:https://github.com/flannel-io/flannel/tree/master/Documentation
参考:
https://docs.projectcalico.org/