[iptables,netplan]IPフォワーディングとNAT設定

自宅ネットワークの現状と見直し[iptables,netplanを理解する]

現在、私の自宅ネットワークは、主にルーターがすべてのデバイスをインターネットに接続する役割を担っています。ここでは、現行の構成と今後の計画について説明します。

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.0/24)を管理します。このネットワークは、LANケーブルを通じて接続されたデバイス(PC1、PC2、PC3)にIPアドレスを割り振ります。
  • 内部ネットワーク (10.0.0.0/24): このセグメントは、有線で接続されたデバイスの管理を行います。各デバイスには、特定のIPアドレス範囲(10.0.0.50-150)が割り当てられ、安定した通信環境を提供します。

4. 新しいネットワーク構成の利点

新たなネットワーク構成にすることで得られるメリット

  • セキュリティ強化: 内部ネットワークを外部から切り離すことで、不正アクセスのリスクを大幅に減少させることができます。これにより、家庭内のデバイスがより安全に使用できるようになります。
  • 効率的な運用: ネットワークトラフィックを複数のセグメントに分けることで、全体的なネットワークの効率が向上します。各デバイスやサービスが、専用の帯域を持つことで、安定した接続が期待できます。
  • 柔軟な管理: 新しい構成では、追加のサーバーやサービスを容易に統合できます。例えば、PXEサーバーのような特定の用途に特化したサーバーを導入する場合でも、ネットワークが分離されていることで、他のシステムに影響を与えることなく管理が可能です。

このような構成を採用することで、家庭内のネットワークは、セキュリティ面とパフォーマンス面の両方で大きく改善されます。以前、PXEサーバーを用いてネットワークインストールを試みた際、ルーターのDHCPサーバーと新たに設定したDHCPサーバーが同一ネットワーク内で競合し、IPアドレスの割り当てが正しく行われないという問題が発生しました。このようなトラブルを避けるためにも、ネットワークを分離することが重要です。

また、新たにノートPCにUbuntu 24.04 Serverをインストールし、Dockerも導入しました。ネットワーク設定を確認すると、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アドレスが割り当てられています。これらの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のネットワーク設定は、バージョンに応じて異なる管理方法が採用されています。最近の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

設定のシナリオと重要なポイント
ネットワークの設定において、混乱を避けるために具体的なシナリオを詳細に説明します。

シナリオの概要
サーバーPCの役割: このPCは、ネットワーク内の他のデバイスにIPアドレスを割り当てるルーターの役割を果たします。また、インターネットアクセスも提供します。
サーバーPCの固定IP設定: サーバーPCの有線インターフェースには固定IPアドレスを設定し、他のクライアントPCがこのアドレスを使用してネットワークに接続します。
クライアントPCの設定
クライアントPCは、サーバーPCをゲートウェイとして設定する必要があります。以下に具体的な設定例を示します。

サーバーPCの設定例
サーバーPC(ノートPC)に固定IPアドレスを割り当てるための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をゲートウェイとして使用する場合の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アドレス: 有線インターフェースに10.0.0.1を割り当てます。
クライアントPCのIPアドレス: 例えば10.0.0.100などのIPアドレスを割り当て、ゲートウェイを10.0.0.1に設定します。
サーバーPCの役割: ルーターおよびDHCPサーバーとして機能し、ネットワーク全体を管理します。
設定を反映させるために、設定ファイルを保存した後、以下のコマンドで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

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

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

設定手順:
IPフォワーディングを一時的に有効にするには、以下のコマンドを使用します。

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アドレスに変換し、インターネットとの通信が可能になります。

設定手順:

sudo iptables -t nat -A POSTROUTING -o wlp2s0 -j MASQUERADE

このコマンドは、wlp2s0インターフェースを介して送信されるパケットの送信元アドレスを変更し、インターネットに出るときに適切なパブリックIPアドレスに変換します。

2つのNAT構成例
NATは、プライベートアドレスを別のプライベートアドレスに変換することも可能です。この方法は、ローカルネットワーク内でのアドレス変換として知られています。以下に、2つの異なるシナリオでのNAT構成例を示します。

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

この図では、デバイスがプライベートIPを持ち、ルーターを通じてパブリックIPに変換され、インターネットにアクセスする流れを示しています。

シナリオ2: 内部ネットワーク間のNAT

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

こちらの図は、異なるプライベートネットワーク間でNATを使用してアドレスを変換するシナリオを表しています。

NAT設定の手順

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設定が保持され、ネットワーク内のデバイスが常にインターネットにアクセスできるようになります。

ネットワーク構成の例

以下は、設定を反映したネットワーク構成の例です。

           (インターネット)
                |
           [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ルーターに接続され、有線インターフェース(10.0.0.1)を使用して内部ネットワーク(10.0.0.0/24)を管理しています。
  • IPフォワーディングとNAT: ノートPCは、内部ネットワーク(10.0.0.0/24)のデバイス(PC1、PC2、PC3)から受け取ったトラフィックを、WiFiインターフェースを通じてインターネットに転送します。NAT設定により、内部ネットワーク内のデバイスは、プライベートIPアドレス(10.0.0.0/24)を使用してインターネットにアクセスします。ノートPCは、これらのプライベートIPアドレスをパブリックIPアドレス(192.168.0.2)に変換し、ISPルーターに送信します。

クライアントPCでの確認

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

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

ネットワーク設定が正しく行われているかどうか、WindowsクライアントPCで以下の手順に従って確認します。

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

これらの設定が正しい場合、クライアントPCは通常インターネットに接続できるはずです。しかし、ブラウザでウェブページを開こうとしても応答がない場合があります。このような場合、PINGコマンドを使用してデフォルトゲートウェイ(10.0.0.1)に接続できるか確認します。もし接続が可能であっても、インターネットにアクセスできない場合、原因は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. ローカルサービスへのアクセスの問題: 多くのネットワークサービスは、ループバックインターフェース経由でアクセスされます。このトラフィックがブロックされると、サービスが正常に機能しなくなります。
  2. NATとフォワーディングの問題: IPフォワーディングとNATの設定が正しく行われていても、ループバックインターフェースのトラフィックが許可されていないと、内部プロセス間の通信が妨げられ、インターネットへの接続が阻害されることがあります。

具体的な影響例

例えば、内部ネットワーク(10.0.0.0/24)からのトラフィックをNATを通じて外部ネットワーク(インターネット)に送信する場合、ループバックインターフェースが正しく動作していないと、次のような問題が発生する可能性があります:

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

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

ネットワークを安全かつ効率的に運用するためには、内部ネットワークからのトラフィックを適切に制御することが重要です。

  1. 内部ネットワークと外部ネットワークの通信の確保: 内部ネットワークのデバイスが外部ネットワーク(インターネット)にアクセスするためには、トラフィックが外部に出ることを許可する必要があります。例えば、家庭内の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: 明示的に許可されていないすべてのトラフィックをドロップします。

設定後の動作確認

これらの設定を適用することで、内部ネットワークからのインターネットアクセスが許可され、不要なトラフィックがブロックされます。また、ループバックインターフェースのトラフィックも許可されるため、コンピュータの動作に問題が発生しません。実際に設定を行った後、WindowsPCで再度確認したところ、今度は問題なくインターネットに接続できることが確認できました。

接続がうまくいかない場合、iptablesの設定において、フォワードチェーンのデフォルトポリシーがDROPになっている可能性があり、このために転送されるパケットがブロックされていた可能性があります。そのため、適切なフィルタリングルールを追加して、内部ネットワークからのトラフィックを許可することが必要でした。

現在のiptablesルールの確認

設定が適切に反映されているか確認するために、現在の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つの主要なチェーンで構成されています:

  1. INPUT: システムに入ってくるすべてのトラフィックを処理します。
  2. FORWARD: 他のネットワークインターフェースを介してシステムを通過するトラフィックを処理します。
  3. 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チェーンに送られます。これらのチェーンはDocker関連のトラフィックを処理します。
  • 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)へのパケットを許可しています。これにより、システム内部での自己通信(例:localhostへのアクセス)が可能になります。

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

Docker関連チェーンの詳細

  • Chain DOCKER: Dockerが自動生成するチェーンで、特定のDockerルールに従ってトラフィックを処理します。
  • Chain DOCKER-ISOLATION-STAGE-1: Dockerコンテナ間のトラフィックを分離するためのチェーンです。これにより、コンテナ間の通信が制御され、必要に応じて分離されます。
  • Chain DOCKER-ISOLATION-STAGE-2: DOCKER-ISOLATION-STAGE-1チェーンで処理されたトラフィックをさらに分離します。これにより、コンテナが独立して動作するためのネットワークセキュリティが強化されます。
  • Chain DOCKER-USER: ユーザーが定義したカスタムルールを処理するためのチェーンです。Dockerコンテナのトラフィックに対して、ユーザーが独自のルールを適用できます。

NAT設定の確認

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テーブル内のルールを詳細にリスト表示し、設定が正確に適用されているかを確認するのに役立ちます。-Lオプションでルールをリスト表示し、-vで詳細な情報を表示、-nでIPアドレスをそのまま表示することで、設定の確認が効率的に行えます。

全体構造

iptablesの出力は、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
    • ここで、MASQUERADEルールが正しく追加されていることを確認します。
  2. filterテーブルのINPUT, OUTPUT, FORWARDチェーンを確認するコマンド:
    sudo iptables -L INPUT -v -n
    sudo iptables -L OUTPUT -v -n
    sudo iptables -L FORWARD -v -n
    • これらのコマンドは、それぞれのチェーンに追加されたルールを表示します。ループバックインターフェースのトラフィック許可 (INPUT と OUTPUT)、内部ネットワークからのトラフィック許可 (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

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

https://github.com/superdoccimo/notepc