物理ネットワークデバイスを使ったネットワーク分離とインターネット接続の実現

現在の自宅のネットワーク環境では、ルーターがすべてのデバイスをインターネットに接続しています。そこで現状と予定する構成を示します。

1. ルーター一任の現状

現在の家庭のネットワーク構成

ほとんどの家庭では、インターネット接続はルーター一台に一任されています。このルーターは、インターネットプロバイダから提供されるもので、以下のような役割を果たします。

  • インターネット接続の提供: ルーターがインターネットに接続し、家全体でインターネットが利用できるようにします。
  • WiFiネットワークの提供: ルーターがWiFi信号を発信し、スマートフォンやタブレット、ラップトップなどが接続します。
  • DHCPサーバーの機能: ルーターが各デバイスにIPアドレスを割り振ります。
家庭用ネットワーク構成
           (インターネット)
                |
           [ISPルーター]
                |
          (WiFiネットワーク)
                |
        [家庭内の全デバイス]
    

そこでネットワークを分離することにしました。以前は分離していたこともあったのですが、面倒でやっていませんでした。この機に設定を見直すことにしました。ほとんどのノートPCに、Wifiと有線の物理ネットワークがあるのでこれを利用します。

2. ネットワーク分離の理由

なぜネットワークを分けるのか?

ネットワークを分離する理由はいくつかあります。以下はその主な理由です。

  • セキュリティの向上: 異なるセグメントにネットワークを分けることで、不正アクセスやセキュリティリスクを減少させます。
  • パフォーマンスの向上: 異なるデバイスや用途ごとにネットワークを分けることで、トラフィックを効率的に管理し、パフォーマンスを向上させます。
  • 管理のしやすさ: 大規模なネットワークや特定のサービス(例えばPXEブート)を利用する場合、ネットワークを分離することで管理がしやすくなります。

3. 新しいネットワーク構成の説明

新しいネットワーク構成

新しいネットワーク構成では、ルーターに一任するのではなく、内部ネットワークを別のセグメントに分けることで、より高度なネットワーク管理を実現します。

ネットワーク構成
           (インターネット)
                |
           [ISPルーター]
           (192.168.0.1)
                |
         (WiFi: 192.168.0.0/24)
          /                \
  [WiFiデバイス群]       [ノートPC/ルーター]
                        (WiFi: 192.168.0.2)
                        (有線: 10.0.0.1)
                                |
                (内部ネットワーク: 10.0.0.0/24)
                                |
                           [ハブ/スイッチ]
                           /      |      \
                     [PC1] [PC2] [PC3]
                (10.0.0.50-150)
    
  • ISPルーター: 192.168.0.1で、WiFiネットワークを管理します。
  • ノートPC/ルーター: 192.168.0.2でWiFiネットワークに接続し、10.0.0.1で内部ネットワークを管理します。
  • 内部ネットワーク: 10.0.0.0/24セグメントにより、有線接続されたデバイス(PC1, PC2, PC3)を管理します。

4. 新しいネットワーク構成のメリット

新しいネットワーク構成のメリット

  • セキュリティ: 内部ネットワークを外部から隔離し、不正アクセスを防ぎます。
  • 効率性: ネットワークトラフィックを分離し、ネットワークの効率を向上させます。
  • 柔軟性: 追加のサーバー(例:PXEサーバー)やサービスを簡単に統合できます。

この新しいネットワーク構成により、家庭内ネットワークのセキュリティとパフォーマンスが向上し、特定の用途に応じた柔軟な管理が可能になります。以前、PXEサーバーを使ってネットワークインストールを試みました。しかし、ルーターのDHCPサーバーとPCに立てた新しいDHCPサーバーが同じネットワーク内で競合し、IPアドレスの割り当てが正しく行われず、インストールがうまくいかないことがありました。これも分離する理由です。

ノートPCにはUbuntu 24.04 Serverを新たにインストールしました。さらに、Dockerをインストールしておきました。IPアドレスの状態を確認すると以下のようになっています。Wifiと有線の両方にルーターからIPアドレスが割り当てられています。さらに、Dockerをインストールしたことで、ip aコマンドを実行すると、新しいDockerネットワークインターフェースが表示されるようになります。

1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether f0:76:1c:88:14:76 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.106/24 metric 100 brd 192.168.0.255 scope global dynamic enp1s0
valid_lft 373sec preferred_lft 373sec
inet6 fe80::f276:1cff:fe88:1476/64 scope link
valid_lft forever preferred_lft forever
3: wlp2s0: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ac:b5:7d:87:8e:90 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.107/24 metric 600 brd 192.168.0.255 scope global dynamic wlp2s0
valid_lft 4081sec preferred_lft 4081sec
inet6 fe80::aeb5:7dff:fe87:8e90/64 scope link
valid_lft forever preferred_lft forever
4: docker0: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:31:4a:6a:92 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever

このシステムには複数のネットワークインターフェースがあり、それぞれに異なるIPアドレスが割り当てられています。これらのIPアドレスは、ルーターやDHCPサーバーによって動的に割り当てられます。

まず、loインターフェースはループバックインターフェースです。これはシステム内部で自身に通信するために使用され、常に127.0.0.1というIPアドレスが割り当てられています。

次に、enp1s0インターフェースは有線のネットワークインターフェースで、192.168.0.106というIPアドレスが割り当てられています。これは通常、家庭や小規模オフィスのネットワークで使用されるプライベートIPアドレスの範囲内にあります。

また、wlp2s0インターフェースは無線のネットワークインターフェースで、192.168.0.107というIPアドレスが割り当てられています。こちらも同じプライベートIPアドレスの範囲内にあり、無線接続用です。

さらに、docker0インターフェースはDockerによって作成される仮想ネットワークインターフェースです。172.17.0.1というIPアドレスが割り当てられており、これはDockerコンテナ間の通信に使用されます。

Ubuntuのネットワーク設定は、バージョンによって管理方法が異なります。近年のUbuntuでは、/etc/network/interfacesファイルは使用されず、代わりにNetplanというツールが使用されています。

Netplanの設定ファイルは、通常以下のディレクトリにあります。

  • /etc/netplan/

このディレクトリには、拡張子が.yamlのファイルが存在します。例えば、01-netcfg.yamlのような名前のファイルが一般的です。実際に確認すると50-cloud-init.yamlというファイルがあり、以下のようになっていました。この設定では、enp1s0wlp2s0の両方のインターフェースがDHCPを使用してIPアドレスを取得しています。

sudo cat 50-cloud-init.yaml


# This file is generated from information provided by the datasource. Changes
# to it will not persist across an instance reboot. To disable cloud-init’s
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
enp1s0:
dhcp4: true
version: 2
wifis:
wlp2s0:
access-points:
TP-Link_6BEB:
password: ‘123456789’
dhcp4: true

設定の混乱を避けるために、具体的なシナリオをもう少し詳しく説明します。

シナリオ説明

  1. サーバーPCがルーターの役割を果たす
    • サーバーPCがネットワーク上の他のデバイスにIPアドレスを割り当て、インターネットアクセスを提供する。
    • サーバーPC自身の有線インターフェースに固定IPアドレスを設定する。
  2. クライアントPC
    • サーバーPCをゲートウェイとして指定する。

サーバーPCの設定例

サーバーPC(ノートPC)に固定IPアドレス10.0.0.1を割り当て、他のクライアントPCがこのIPアドレスをゲートウェイとして使用する場合、サーバーPCのNetplan設定は以下のようになります。

network:
version: 2
ethernets:
enp1s0:
addresses:
- 10.0.0.1/24
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
wifis:
wlp2s0:
access-points:
TP-Link_6BEB:
password: '123456789'
dhcp4: true

クライアントPCの設定例

クライアントPCがサーバーPCをゲートウェイとして使用する場合、クライアントPCのNetplan設定例は以下の通りです。

network:
version: 2
ethernets:
enp1s0:
addresses:
- 10.0.0.100/24
gateway4: 10.0.0.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4

重要なポイント

  • サーバーPCのIPアドレス:サーバーPCの有線インターフェースに10.0.0.1を割り当てます。
  • クライアントPCのIPアドレス:クライアントPCには異なるIPアドレス(例:10.0.0.100)を割り当て、ゲートウェイを10.0.0.1に設定します。
  • サーバーPCの役割:サーバーPCはルーターおよびDHCPサーバーとして機能し、他のデバイスにIPアドレスを割り当て、ネットワーク接続を管理します。

ファイルを編集した後、PCの再起動やサービスの再起動を行う必要はありません。ただし、Netplanの設定を適用する必要があります。設定ファイルを保存した後、以下のコマンドを実行して変更を適用します。
sudo netplan apply

Netplanの設定を適用するとネットワークが一時的に再設定されるため、SSH接続が切断されることがあります。PCを再起動することなく、新しいネットワーク設定が即座に適用されます。そして再度IP情報を表示して変更されているか確認します。下記のように有線側は記述通りになりました。

1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether f0:76:1c:88:14:76 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 brd 10.0.0.255 scope global enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::f276:1cff:fe88:1476/64 scope link
valid_lft forever preferred_lft forever
3: wlp2s0: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ac:b5:7d:87:8e:90 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.107/24 metric 600 brd 192.168.0.255 scope global dynamic wlp2s0
valid_lft 4571sec preferred_lft 4571sec
inet6 fe80::aeb5:7dff:fe87:8e90/64 scope link
valid_lft forever preferred_lft forever
4: docker0: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:31:4a:6a:92 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever

さらに、サーバーPCがクライアントにインターネット接続を提供するためには、IPフォワーディングを有効にし、NATを設定する必要があります。これをすることで、サーバーPCがクライアントPCのためにルーターとして機能します。

IPフォワーディングとNAT設定の説明

1. IPフォワーディング (net.ipv4.ip_forward=1)

IPフォワーディングとは、1つのネットワークインターフェースから受信したパケットを別のネットワークインターフェースに転送する機能です。これを有効にすることで、サーバーPCがルーターとして機能し、ネットワーク内の他のデバイスがインターネットにアクセスできるようになります。

IP Forwarding
enp1s0
10.0.0.1
IP Forwarding
wlp2s0
192.168.0.2
設定方法:
  • 一時的に有効にする:
    sudo sysctl -w net.ipv4.ip_forward=1
  • 永続的に有効にするために、/etc/sysctl.confファイルに以下の行を追加:
    net.ipv4.ip_forward=1

この設定を行うことで、サーバーPCはネットワーク内の他のデバイスのトラフィックを転送する準備が整います。

2. NAT設定 (iptablesの使用)

NAT (Network Address Translation) は、プライベートネットワーク内のデバイスがインターネットにアクセスするために必要な技術です。NATを設定することで、プライベートIPアドレスをパブリックIPアドレスに変換し、インターネットとの通信を可能にします。

NAT Explanation
デバイス (スマホ, パソコン)
プライベートIP: 192.168.0.2
ルーター
プライベートIP: 192.168.0.1
パブリックIP: 203.0.113.1
インターネット
パブリックIPで通信

もちろん、NATはプライベートアドレスを別のプライベートアドレスに変換することもできます。これを「ローカルネットワーク内のNAT」や「内部NAT」と呼ぶことがあります。

Internal NAT Explanation
内部ネットワークA
プライベートIP: 10.0.0.2
ルーター
NAT変換
10.0.0.2 → 192.168.0.100
内部ネットワークB
プライベートIP: 192.168.0.100

実際にやろうとしていることは以下の図のようになります。NATは、異なるプライベートアドレス間での変換だけでなく、最終的にパブリックIPアドレスに変換してインターネットに接続することも可能です。異なるプライベートアドレス間でのNAT変換と、それをパブリックIPアドレスに変換してインターネットに接続する流れを図示したものです。

設定方法:

NATを設定するコマンド
sudo iptables -t nat -A POSTROUTING -o wlp2s0 -j MASQUERADE

  • -t nat:NATテーブルを使用することを指定します。
  • -A POSTROUTING:パケットがルーティングされた後に処理することを指定します。
  • -o wlp2s0:このルールを適用するネットワークインターフェース(ここではWi-Fiインターフェース)を指定します。
  • -j MASQUERADE:パケットの送信元アドレスを変更して、インターネットに出るときに正しいアドレスになるようにします。

特定のサブネットに対するNAT設定
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o wlp2s0 -j MASQUERADE

  • -s 10.0.0.0/24:このルールを適用する送信元アドレス範囲を指定します。ここでは、10.0.0.0/24サブネットを指定しています。

設定の永続化:

iptablesの設定は再起動するとリセットされるため、設定を永続化する必要があります。

  1. パッケージのインストール
    sudo apt-get install iptables-persistent
  2. 設定を保存
    sudo netfilter-persistent save

これで、サーバーPCが再起動してもNAT設定が保持され、ネットワーク内のデバイスが常にインターネットにアクセスできるようになります。

Network Diagram
(インターネット) | [ISPルーター] (192.168.0.1) | (WiFi: 192.168.0.0/24) / \ [WiFiデバイス群] [ノートPC/ルーター] (WiFi: 192.168.0.2) | IPフォワーディングとNATを使用 | (有線: 10.0.0.1) | (内部ネットワーク: 10.0.0.0/24) | [ハブ/スイッチ] / | \ [PC1] [PC2] [PC3] (10.0.0.50-150)
  • ノートPC/ルーターの役割を果たすノートPCが、WiFi(192.168.0.2)を通じてISPルーターに接続されています。
  • ノートPCは、有線インターフェース(10.0.0.1)を使用して内部ネットワーク(10.0.0.0/24)を管理しています。
  • IPフォワーディングの設定により、ノートPCは内部ネットワーク(10.0.0.0/24)のPC1、PC2、PC3から受け取ったトラフィックをWiFiインターフェースを通じてインターネットに転送します。
  • **NAT(Network Address Translation)**の設定により、内部ネットワーク内のデバイスはプライベートIPアドレス(10.0.0.0/24)を使用してインターネットにアクセスできます。ノートPCはこれらのプライベートIPアドレスをパブリックIPアドレス(192.168.0.2)に変換してISPルーターに送信します。

この設定により、内部ネットワーク(10.0.0.0/24)内のすべてのデバイスがインターネットにアクセスできるようになると思うのでWindowsPCで確認してみます。以下の手順に従って、クライアントPCのネットワーク設定を確認し、正しい設定が適用されていることを確認します。

WindowsクライアントPCのネットワーク設定の確認

  1. ネットワークアダプターの設定を確認
    • 「ネットワークと共有センター」から「アダプターの設定の変更」をクリックします。
    • 使用しているネットワークアダプターを右クリックし、「プロパティ」を選択します。
    • 「インターネット プロトコル バージョン 4 (TCP/IPv4)」を選択し、「プロパティ」をクリックします。
    • 以下の情報が正しく入力されていることを確認します。
      • IPアドレス: 10.0.0.6
      • サブネットマスク: 255.255.255.0
      • デフォルトゲートウェイ: 10.0.0.1
      • 優先DNSサーバー: 8.8.8.8
      • 代替DNSサーバー: 8.8.4.4

しかし、ブラウザでページを開いても応答がありません。PINGコマンドで確認するとデフォルトゲートウェイには接続ができているものの、インターネットへの接続はできないようです。どうやら、FORWARDチェーンのフィルタリングルールの設定が必要なようです。ここでの目的は、内部ネットワークからのトラフィックを許可し、インターネットへの接続を適切にフォワードすることです。

ループバックインターフェースのトラフィックを許可していない影響

IPフォワーディングとNATを設定したのにインターネットに接続できなかった原因の一つとして、ループバックインターフェースのトラフィックを許可していないことが考えられます。

ループバックインターフェースとは

ループバックインターフェース(lo)は、コンピュータ自身にデータを送信するための仮想ネットワークインターフェースです。通常、127.0.0.1というIPアドレスを持っています。このインターフェースは、コンピュータが自身にネットワーク経由でアクセスする際に使われます。

ループバックインターフェースのトラフィックを許可

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
  • -A INPUT -i lo -j ACCEPT: ループバックインターフェースからのすべての受信トラフィックを許可します。
  • -A OUTPUT -o lo -j ACCEPT: ループバックインターフェースへのすべての送信トラフィックを許可します。
  1. 内部ネットワーク:
    • プライベートIPアドレス(10.0.0.2)を持つデバイスが接続されています。
    • このデバイスからのトラフィックはUbuntu PCに送られます。
  2. Ubuntu PC:
    • IPフォワーディングとNATを実行しています。
    • 10.0.0.2から192.168.0.2に変換します。
    • **ループバックインターフェース(127.0.0.1)**は、内部プロセス間の通信に使用されます。
    • ループバックインターフェースのトラフィックが許可されていないと、内部プロセス間の通信が妨げられ、NATやフォワーディングが正しく機能しない場合があります。
  3. インターネット:
    • 最終的にパブリックIPアドレスに変換され、インターネットに接続されます。

なぜループバックが重要か

ループバックインターフェースのトラフィックを許可しないと、以下のような問題が発生する可能性があります:

  1. ローカルサービスへのアクセス:多くのネットワークサービスは、ループバックインターフェース経由でアクセスされるため、このトラフィックがブロックされると正常に機能しません。
  2. NATとフォワーディングの問題:IPフォワーディングとNATの設定が正しく行われていても、ループバックインターフェースのトラフィックが許可されていないと、内部プロセス間の通信が妨げられ、インターネットへの接続が阻害されることがあります。

具体的な影響例

例えば、内部ネットワーク(10.0.0.0/24)からのトラフィックをNATを通じて外部ネットワーク(インターネット)に送る場合、ループバックインターフェースが正しく動作していないと、次のような状況が起こるかもしれません:

  • DNSリゾルバの問題:DNSクエリがループバック経由で処理される場合、それが機能しなくなり、インターネット上のドメイン名を解決できなくなります。
  • 内部プロセスの通信障害:ループバックを経由する内部プロセスが通信できないため、NATやフォワーディングに必要な内部処理が正常に行われず、結果としてインターネットへの接続が失敗します。

内部ネットワークからのトラフィックを許可することも必要

内部ネットワークからのトラフィックを許可する意義

ネットワークを安全かつ効率的に運用するためには、トラフィックの制御が重要です。ここでは、内部ネットワークからのトラフィックを許可する理由について説明します。

1. 内部ネットワークと外部ネットワークの通信を可能にする

内部ネットワーク(例えば、会社や家庭内のネットワーク)のデバイスが外部ネットワーク(インターネット)にアクセスするためには、そのトラフィックが外部に出ることを許可する必要があります。

  • : 家庭内のPCがインターネットでウェブサイトにアクセスする場合、PCからのリクエスト(トラフィック)はまずルーターを通過し、その後インターネットに出ます。この時、ルーターが内部ネットワークから外部ネットワークへのトラフィックを許可していないと、PCからのリクエストは外部に届きません。

2. ネットワークのセキュリティと管理

トラフィックを適切に制御することで、ネットワークのセキュリティを高めることができます。内部ネットワークからのトラフィックを許可するルールを明示的に設定することで、不要なトラフィックを防ぎ、ネットワークの安全性を保つことができます。

  • : 企業内のネットワークでは、内部から外部へのトラフィックを許可する一方で、外部から内部へのトラフィックは特定の条件(例えば、既に確立された接続に対する応答)に基づいてのみ許可することが一般的です。不正なアクセスを防ぐためです。

3. ネットワークパフォーマンスの最適化

適切にトラフィックを許可することで、ネットワークのパフォーマンスを最適化できます。例えば、特定のルールを設定することで、重要なトラフィックを優先的に処理し、ネットワークの混雑を避けることができます。

  • : ストリーミングサービスやビデオ会議のトラフィックを優先する設定を行うことで、これらのサービスがスムーズに動作するようにします。
# 内部ネットワークからのトラフィックを許可
sudo iptables -A FORWARD -i enp1s0 -o wlp2s0 -s 10.0.0.0/24 -j ACCEPT

# インターネットからの応答トラフィックを許可
sudo iptables -A FORWARD -i wlp2s0 -o enp1s0 -m state --state ESTABLISHED,RELATED -j ACCEPT

説明: これらの設定は、内部ネットワークからインターネットへの通信を許可し、インターネットからの関連トラフィックを許可します。

  • -A FORWARD -i enp1s0 -o wlp2s0 -s 10.0.0.0/24 -j ACCEPT:
    • -A: 新しいルールを追加します。
    • FORWARD: フォワードチェーンに追加します。
    • -i enp1s0: 入力インターフェースがenp1s0(内部ネットワークインターフェース)であるトラフィックを対象とします。
    • -o wlp2s0: 出力インターフェースがwlp2s0(インターネットインターフェース)であるトラフィックを対象とします。
    • -s 10.0.0.0/24: 送信元アドレスが10.0.0.0/24ネットワーク内のトラフィックを対象とします。
    • -j ACCEPT: 該当するトラフィックを許可します。
  • -A FORWARD -i wlp2s0 -o enp1s0 -m state --state ESTABLISHED,RELATED -j ACCEPT:
    • -A: 新しいルールを追加します。
    • FORWARD: フォワードチェーンに追加します。
    • -i wlp2s0: 入力インターフェースがwlp2s0(インターネットインターフェース)であるトラフィックを対象とします。
    • -o enp1s0: 出力インターフェースがenp1s0(内部ネットワークインターフェース)であるトラフィックを対象とします。
    • -m state --state ESTABLISHED,RELATED: 既に確立された接続または関連する接続のトラフィックを対象とします。
    • -j ACCEPT: 該当するトラフィックを許可します。

デフォルトポリシーをドロップに設定

sudo iptables -P FORWARD DROP

説明: デフォルトポリシーは、明示的に許可されていないすべてのトラフィックをドロップするように設定します。これをすると、不要なトラフィックがブロックされ、セキュリティが強化されます。

  • -P FORWARD DROP:
    • -P: デフォルトポリシーを設定します。
    • FORWARD: フォワードチェーンに対して設定します。
    • DROP: 明示的に許可されていないすべてのトラフィックをドロップします。

これらの設定により、内部ネットワークからのインターネットアクセスが許可され、不要なトラフィックがブロックされます。また、ループバックインターフェースのトラフィックも許可されるため、コンピュータ自身の動作にも支障が出ません。再度WindowsPCで確認すると今度はうまくいきました。接続できない時は、iptablesの設定において、FORWARDチェーンのデフォルトポリシーがDROPになっているため、転送されるパケットがブロックされていたようです。このため、適切なフィルタリングルールを追加して内部ネットワークからのトラフィックを許可する必要がありました。

現在のiptablesルールを詳細に表示するには下記のコマンドを入力します。この表示内容は上述のコマンドを入力し、トラフィックを許可した後のものです。

sudo iptables -L -v -n

Chain INPUT (policy ACCEPT 34639 packets, 13M bytes)
pkts bytes target prot opt in out source destination
2710 231K ACCEPT 0 — lo * 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
18824 13M DOCKER-USER 0 — * * 0.0.0.0/0 0.0.0.0/0
18824 13M DOCKER-ISOLATION-STAGE-1 0 — * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 — * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER 0 — * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 — docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 — docker0 docker0 0.0.0.0/0 0.0.0.0/0
5928 1927K ACCEPT 0 — enp1s0 wlp2s0 10.0.0.0/24 0.0.0.0/0
11727 11M ACCEPT 0 — wlp2s0 enp1s0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT 28157 packets, 14M bytes)
pkts bytes target prot opt in out source destination
2632 224K ACCEPT 0 — * lo 0.0.0.0/0 0.0.0.0/0

Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
0 0 DOCKER-ISOLATION-STAGE-2 0 — docker0 !docker0 0.0.0.0/0 0.0.0.0/0
18825 13M RETURN 0 — * * 0.0.0.0/0 0.0.0.0/0

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
pkts bytes target prot opt in out source destination
0 0 DROP 0 — * docker0 0.0.0.0/0 0.0.0.0/0
0 0 RETURN 0 — * * 0.0.0.0/0 0.0.0.0/0

Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
18842 13M RETURN 0 — * * 0.0.0.0/0 0.0.0.0/0

基本情報

コマンド sudo iptables -L -v -n の出力は、現在のiptablesルールを詳細に表示します。-L はリスト表示、-v は詳細表示、-n はホスト名を解決せずにIPアドレスを表示するオプションです。

全体構造

出力は3つの主要チェーン (INPUT, FORWARD, OUTPUT) と、Dockerによって追加されたチェーンを含む複数のチェーンに分かれています。それぞれのチェーンには、パケットがどのように処理されるかを決定するルールが設定されています。

Chain INPUT

  • 説明: INPUTチェーンは、システムに入ってくるすべてのトラフィックを処理します。
Chain INPUT (policy ACCEPT 34639 packets, 13M bytes)
pkts bytes target prot opt in out source destination
2710 231K ACCEPT 0 -- lo * 0.0.0.0/0 0.0.0.0/0
  • policy ACCEPT: デフォルトでは、すべての入力トラフィックを許可します。
  • 2710 packets, 231K bytes: ループバックインターフェース(lo)からのパケットを許可します。これで、システム自身が自分に送信するトラフィック(例えば、localhost へのトラフィック)が許可されます。

Chain FORWARD

  • 説明: FORWARDチェーンは、他のネットワークインターフェースを介してシステムを通過するトラフィックを処理します。
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
18824 13M DOCKER-USER 0 -- * * 0.0.0.0/0 0.0.0.0/0
18824 13M DOCKER-ISOLATION-STAGE-1 0 -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 DOCKER 0 -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0 -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
5928 1927K ACCEPT 0 -- enp1s0 wlp2s0 10.0.0.0/24 0.0.0.0/0
11727 11M ACCEPT 0 -- wlp2s0 enp1s0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
  • policy DROP: デフォルトでは、すべての転送トラフィックを拒否します。
  • 18824 packets, 13M bytes: DOCKER-USERチェーンとDOCKER-ISOLATION-STAGE-1チェーンにパケットを送ります。
  • 0 packets, 0 bytes: Dockerの関連チェーンでパケットを処理します。
  • 5928 packets, 1927K bytes: enp1s0からwlp2s0への10.0.0.0/24サブネットのトラフィックを許可します。
  • 11727 packets, 11M bytes: wlp2s0からenp1s0への関連付けられたトラフィックを許可します。

Chain OUTPUT

  • 説明: OUTPUTチェーンは、システムから出て行くすべてのトラフィックを処理します。
Chain OUTPUT (policy ACCEPT 28157 packets, 14M bytes)
pkts bytes target prot opt in out source destination
2632 224K ACCEPT 0 -- * lo 0.0.0.0/0 0.0.0.0/0
  • policy ACCEPT: デフォルトでは、すべての出力トラフィックを許可します。
  • 2632 packets, 224K bytes: ループバックインターフェース(lo)へのパケットを許可します。

Docker関連チェーン

  • 説明: Dockerによって自動的に生成されたチェーンで、Dockerコンテナ間のトラフィックを処理します。
Chain DOCKER (1 references)
pkts bytes target prot opt in out source destination

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
pkts bytes target prot opt in out source destination
0 0 DOCKER-ISOLATION-STAGE-2 0 -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
18825 13M RETURN 0 -- * * 0.0.0.0/0 0.0.0.0/0

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
pkts bytes target prot opt in out source destination
0 0 DROP 0 -- * docker0 0.0.0.0/0 0.0.0.0/0
0 0 RETURN 0 -- * * 0.0.0.0/0 0.0.0.0/0

Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
18842 13M RETURN 0 -- * * 0.0.0.0/0 0.0.0.0/0
  • Chain DOCKER: 特定のDockerルールを持つチェーンです。
  • Chain DOCKER-ISOLATION-STAGE-1: Dockerネットワーク間のトラフィックを分離するためのチェーンです。
  • Chain DOCKER-ISOLATION-STAGE-2: さらなるトラフィック分離を行います。
  • Chain DOCKER-USER: ユーザー定義のDockerルールを処理するチェーンです。

せっかくなのでNATの詳細もコマンド入力をして、正しく設定されているか確認します。

sudo iptables -t nat -L -v -n

Chain PREROUTING (policy ACCEPT 8218 packets, 1816K bytes)
pkts bytes target prot opt in out source destination
6 336 DOCKER 0 — * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 4650 packets, 1403K bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 338 packets, 31300 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER 0 — * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 142 packets, 10716 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE 0 — * !docker0 172.17.0.0/16 0.0.0.0/0
624 85361 MASQUERADE 0 — * wlp2s0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE 0 — * wlp2s0 10.0.0.0/24 0.0.0.0/0

Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN 0 — docker0 * 0.0.0.0/0 0.0.0.0/0

基本情報

このコマンドは、NATテーブルのルールを詳細に表示します。-t natはNATテーブルを指定し、-Lはリスト表示、-vは詳細表示、-nはホスト名を解決せずにIPアドレスを表示するオプションです。

全体構造

出力は4つの主要チェーン (PREROUTING, INPUT, OUTPUT, POSTROUTING) と、Dockerによって追加されたチェーン (DOCKER) に分かれています。それぞれのチェーンには、パケットがどのように処理されるかを決定するルールが設定されています。

Chain PREROUTING

  • 説明: PREROUTINGチェーンは、パケットがルーティングされる前に適用されるルールを定義します。
Chain PREROUTING (policy ACCEPT 8218 packets, 1816K bytes)
pkts bytes target prot opt in out source destination
6 336 DOCKER 0 -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
  • policy ACCEPT: デフォルトでは、すべての受信トラフィックを許可します。
  • 6 packets, 336 bytes: DOCKERチェーンにパケットを送ります。このルールは、宛先がローカルアドレス(つまり、このマシンのIPアドレス)のパケットをDockerチェーンに渡します。

Chain INPUT

  • 説明: INPUTチェーンは、システムに入ってくるすべてのトラフィックを処理します。
Chain INPUT (policy ACCEPT 4650 packets, 1403K bytes)
pkts bytes target prot opt in out source destination
  • policy ACCEPT: デフォルトでは、すべての入力トラフィックを許可します。このチェーンには特にルールは設定されていません。

Chain OUTPUT

  • 説明: OUTPUTチェーンは、システムから出て行くすべてのトラフィックを処理します。
Chain OUTPUT (policy ACCEPT 338 packets, 31300 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER 0 -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
  • policy ACCEPT: デフォルトでは、すべての出力トラフィックを許可します。
  • 0 packets, 0 bytes: DOCKERチェーンにパケットを送ります。このルールは、127.0.0.0/8(ループバックアドレス)以外のローカルアドレス宛のパケットをDockerチェーンに渡します。

Chain POSTROUTING

  • 説明: POSTROUTINGチェーンは、パケットがルーティングされた後に適用されるルールを定義します。
Chain POSTROUTING (policy ACCEPT 142 packets, 10716 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE 0 -- * !docker0 172.17.0.0/16 0.0.0.0/0
624 85361 MASQUERADE 0 -- * wlp2s0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE 0 -- * wlp2s0 10.0.0.0/24 0.0.0.0/0
  • policy ACCEPT: デフォルトでは、すべての後処理トラフィックを許可します。
  • 0 packets, 0 bytes: 172.17.0.0/16ネットワークからdocker0以外のインターフェースへのパケットをマスカレードします。マスカレードは、送信元IPアドレスをインターフェースのIPアドレスに変換します。
  • 624 packets, 85361 bytes: wlp2s0インターフェースを通るすべてのパケットをマスカレードします。
  • 0 packets, 0 bytes: 10.0.0.0/24ネットワークからwlp2s0インターフェースへのパケットをマスカレードします。

Chain DOCKER

  • 説明: DOCKERチェーンは、Dockerによって自動的に生成されたチェーンで、Dockerコンテナ間のトラフィックを処理します。
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN 0 -- docker0 * 0.0.0.0/0 0.0.0.0/0
  • 0 packets, 0 bytes: docker0インターフェースを通るパケットを返します。これは、Dockerコンテナ間のトラフィックを許可するためのルールです。

重要なまとめ

現在のiptablesルールを表示するコマンド

1. nat テーブルの POSTROUTING チェーン

sudo iptables -t nat -L POSTROUTING -v -n
  • このコマンドは、nat テーブルの POSTROUTING チェーンに追加されたルールを表示します。ここで、MASQUERADE ルールが正しく追加されていることを確認します。

2. filter テーブルの INPUT, OUTPUT, および FORWARD チェーン

sudo iptables -L INPUT -v -n
sudo iptables -L OUTPUT -v -n
sudo iptables -L FORWARD -v -n
  • これらのコマンドは、それぞれのチェーンに追加されたルールを表示します。ループバックインターフェースのトラフィック許可 (INPUTOUTPUT)、内部ネットワークからのトラフィック許可 (FORWARD)、およびインターネットからの応答トラフィック許可 (FORWARD) のルールが正しく追加されていることを確認します。

一括して確認する方法

全体のルールを一括して確認するには、以下のコマンドを実行して、すべてのルールが正しく設定されているか確認します。

# NAT テーブルの POSTROUTING チェーンを確認
sudo iptables -t nat -L POSTROUTING -v -n

# filter テーブルの INPUT チェーンを確認
sudo iptables -L INPUT -v -n

# filter テーブルの OUTPUT チェーンを確認
sudo iptables -L OUTPUT -v -n

# filter テーブルの FORWARD チェーンを確認
sudo iptables -L FORWARD -v -n

これらのコマンドを実行すると、設定したルールが正しく適用されているかどうかを確認できます。

期待される出力例

nat テーブルの POSTROUTING チェーン

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * wlp2s0 0.0.0.0/0 0.0.0.0/0
0 0 MASQUERADE all -- * wlp2s0 10.0.0.0/24 0.0.0.0/0

filter テーブルの INPUT チェーン

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0

filter テーブルの OUTPUT チェーン

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0

filter テーブルの FORWARD チェーン

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- enp1s0 wlp2s0 10.0.0.0/24 0.0.0.0/0
0 0 ACCEPT all -- wlp2s0 enp1s0 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

これらの出力を確認することで、設定したルールが正しく追加されていることを確認できます。

GitHub - superdoccimo/notepc: This project provides Docker Compose files and setup instructions to support the configuration of a DHCP and PXE server on a laptop.
This project provides Docker Compose files and setup instructions to support the configuration of a DHCP and PXE server ...
タイトルとURLをコピーしました