基本的なLinuxルーターのセットアップ: NATとパケット転送の設定ガイド

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Linuxルーターの紹介

情報技術の分野では、小規模なオフィスであれ大規模なネットワークシステムであれ、効率的なデータの接続と管理は常に最優先事項です。社内ネットワークのコンピューターがどのようにインターネットにアクセスするのか、あるいは外部からサービスにアクセスできるのか疑問に思ったことはありませんか?これらすべてはルーターのおかげです。

通常、私たちは使いやすいWebインターフェースを備えた市販のルーターデバイスに慣れています。しかし、Linuxサーバーをルーターに変えることは、通常の「箱」型デバイスでは匹敵しにくい、優れた柔軟性と制御能力をもたらします。Linuxを使用すると、パケット処理の方法から複雑なセキュリティポリシーの実装まで、あらゆる詳細を微調整できます。

Linuxがルーターの役割を担う際、理解しておくべき2つの核となる機能は、Network Address Translation (NAT)Packet Forwarding (パケット転送)です。パケット転送は、異なるネットワーク間でパケットを移動させるのに役立ちます。一方、NATは、複数のデバイスが単一のパブリックIPアドレスを共有できるようにすると同時に、外部から「隠れる」ことを可能にします。これらは、一般的なLinuxサーバーを強力なネットワーク制御ハブに変える基盤となります。

以前、私はかなり厄介なネットワーク問題に「頭を悩ませた」ことがあります。パケットロス(intermittent packet loss)はピーク時にのみ発生し、断続的でネットワークが過負荷の時だけ「からかう」ように現れるため、デバッグは非常に困難でした。

その時、ルーター上の各パケットを「透視」し、それらの経路を正確に制御して問題の根本原因を見つけることができたらどんなに良いだろうと思ったものです。その時こそ、自己設定可能なLinuxルーターの真の力を認識しました。それは、最も困難なネットワーク問題を解決するための透明性と権限を私に与えてくれました。これが、Linuxを活用して基本的でありながら非常に効果的なルーターを構築する方法を皆さんと共有したい理由です。

コアコンセプト

ルーターとは?

簡単に言えば、ルーターは2つ以上の異なるコンピューターネットワーク間でデータパケットを接続し、ルーティングするデバイスです。大きな交差点で交通を調整する人のように、ある道路から別の道路へ車両(パケット)を効率的に正しい方向に導くものと想像できます。

Linuxコンピューターをルーターとして使用する場合、少なくとも2つのネットワークカード(ネットワークインターフェース)が必要です。1つはインターネット(WAN)に接続し、もう1つは内部ネットワーク(LAN)に接続します。その主なタスクは、パケットの宛先アドレスに基づいて、あるネットワークからパケットを受信し、別のネットワークに転送することです。

パケット転送 (Packet Forwarding)

デフォルトでは、セキュリティ上の理由から、ほとんどのLinuxオペレーティングシステムは、同じマシン上の異なるネットワークインターフェース間でパケットを自動的に転送しません。たとえば、eth1(LAN)からパケットが到着し、宛先アドレスがインターネット(eth0経由)にある場合、Linuxはそれを自動的に転送しません。この機能は明示的に有効にする必要があります。

パケット転送が有効になると、私たちのLinuxマシンは実際にルーターとして機能します。それは、自分自身宛てではないパケットの宛先アドレスをチェックし、目的の宛先に到達するためにどのインターフェースに送信するかを決定します。

ネットワークアドレス変換 (NAT)

NATは、特にIPv4アドレスが枯渇しつつある現代において、非常に重要な技術です。NATの主な機能はIPアドレスを「変換する」ことです。なぜこれが必要なのでしょうか?

  • パブリックIPアドレスの節約: ほとんどのインターネットサービスプロバイダー(ISP)は、数個のパブリックIPアドレスしか提供しません。NATは、内部ネットワーク内の数百、さらには数千のデバイス(例: 192.168.x.xのようなプライベートIPアドレス)が単一のパブリックIPアドレスを共有してインターネットにアクセスできるようにします。
  • セキュリティ: 内部ネットワークはルーターのパブリックIPアドレスの背後に「隠されます」。外部からは、LAN内のデバイスはほとんど「見えない」状態になり、最初のセキュリティ層が追加されます。

以下の2つの主要なNATタイプに焦点を当てます:

  • Source NAT (SNAT) / マスカレーディング: LAN内のデバイスがインターネットにパケットを送信する際、ルーターはパケットの送信元IPアドレスを、デバイスのプライベートIPアドレスからルーターのパブリックIPアドレスに変更します。応答パケットが戻ってくると、ルーターは宛先IPアドレスを元のLANデバイスに「逆変換」します。MASQUERADEはSNATの特殊な形式で、ルーターのパブリックIPアドレスが動的(変化する)な場合によく使用されます。

    例: あなたのコンピューター (192.168.10.100) がgoogle.comにリクエストを送信します。Linuxルーター(パブリックIP 203.0.113.5)は、外部に送信する前にパケットの送信元IPを203.0.113.5に変更します。Googleは203.0.113.5に応答し、ルーターはそのパケットが192.168.10.100のものであることを認識し、内部に転送します。

  • Destination NAT (DNAT) / ポートフォワーディング: SNATとは逆に、DNATは外部のインターネットからのデバイスがあなたのLAN内のサーバー上の特定のサービスにアクセスできるようにしたい場合に使用されます。ルーターは、外部からのパケットの宛先IPアドレスと、場合によっては宛先ポートも、内部サーバーのアドレスとポートに変更します。

    例: LAN内にWebサーバー (192.168.10.100) がポート80でサービスを実行しています。インターネットのユーザーがルーターのパブリックIP (203.0.113.5) を介してこのサービスにアクセスできるようにしたいとします。ルーターは203.0.113.5のポート80へのパケットを192.168.10.100:80に変換し、内部に転送します。

詳細な実践: Linuxルーターの設定

実践するには、少なくとも2つのネットワークカードを持つLinuxサーバー(私はUbuntu Serverを使用しています)が必要です。これらをeth0(インターネット/WANへの接続)とeth1(内部LANネットワークへの接続)と名付けましょう。

1. 環境の準備

  • Linuxルーターマシン:
    • eth0: ISPから動的IP (DHCP) を取得するか、静的IP (例: ラボネットワーク内の192.168.1.100、またはパブリックIP) を持つことができます。
    • eth1: 内部ネットワーク用の静的IP。例: 192.168.10.1/24。これはLAN内のマシンにとってデフォルトゲートウェイとなります。
  • LAN内のクライアントマシン:
    • 192.168.10.0/24の範囲内の静的IPまたはDHCP。例: 192.168.10.100
    • デフォルトゲートウェイは192.168.10.1(ルーター上のeth1のIP)を指します。
    • DNS: 8.8.8.8または1.1.1.1が可能です。

まず、ip aコマンドを使用してネットワークインターフェースを確認します:


ip a

Ubuntu Serverを使用しており、インターフェース名がenp0s3enp0s8のような形式の場合、管理しやすくするために名前を変更するか、デフォルト名のままにすることもできます。このガイドでは、eth0eth1を仮定します。

UbuntuでNetplanを使用してeth1(内部インターフェース)の静的IPアドレスを設定します。Netplan設定ファイル、例えば/etc/netplan/01-netcfg.yamlを作成または編集します(注意: ディストリビューションによっては/etc/network/interfacesまたはnmcliを使用する場合があります):


network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true  # またはパブリックIPがある場合は静的IPを設定
    eth1:
      dhcp4: false
      addresses: [192.168.10.1/24]

編集後、設定を適用します:


sudo netplan apply

2. パケット転送 (Packet Forwarding) 機能の有効化

Linuxをルーターとして機能させるには、パケット転送機能を有効にする必要があります。ターミナルで次のコマンドを実行します:


sudo sysctl -w net.ipv4.ip_forward=1

上記のコマンドは一時的な効果しかありません。システム再起動後もこの設定を維持するには、/etc/sysctl.conf設定ファイルにこれを追加する必要があります:


echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # sysctl.confファイルからの変更を適用

3. Iptables を使用したNAT (マスカレーディング) の設定

次に、LAN内のマシンがルーターのパブリックIPアドレスを「借りて」インターネットにアクセスできるようにNATを設定します。ここでは、Linux上の強力なファイアウォール管理ツールであるiptablesを使用します。

次のコマンドは、natテーブルのPOSTROUTINGチェインにルールを追加します。このルールは、eth0インターフェースを介して送信されるパケットの送信元IPアドレス(SNAT)を、eth0のIPアドレスに変更します:


sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  • -t nat: natテーブル (Network Address Translation) で作業することを指定します。
  • -A POSTROUTING: POSTROUTINGチェインの末尾にルールを追加します。このチェインは、パケットがルーティングされた後に処理されます。
  • -o eth0: eth0インターフェースを介して出ていく(output)パケットにルールを適用します。
  • -j MASQUERADE: MASQUERADEターゲットに「ジャンプ」します。つまり、パケットの送信元IPを、出ていくインターフェース (eth0) のIPに変更します。

4. Iptables を使用したDNAT (ポートフォワーディング) の設定

もしあなたのLAN内にWebサーバー(または任意のサービス)があり(例えば192.168.10.100)、インターネットからアクセスできるようにしたい場合、DNATを設定する必要があります。ルーターのパブリックIPからWebサーバー内部のポート80(HTTP)を転送すると仮定します:


sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.100:80
  • -A PREROUTING: PREROUTINGチェインの末尾にルールを追加します。このチェインは、パケットがインターフェースに到着した直後に処理されます。
  • -i eth0: eth0インターフェースを介して到着する(input)パケットにルールを適用します。
  • -p tcp --dport 80: 宛先ポート80へのTCPプロトコルパケットに適用します。
  • -j DNAT --to-destination 192.168.10.100:80: DNATターゲットに「ジャンプ」し、パケットの宛先アドレスを192.168.10.100、ポートを80に変更します。

5. ルーターの基本ファイアウォール設定

NATと転送を設定した後、ルーターと内部ネットワークを保護することが非常に重要です。有効なトラフィックのみを通過させるようにファイアウォールルールを設定する必要があります。

iptablesFORWARDチェインは、ルーターを通過するパケット(あるインターフェースから別のインターフェースへ)を制御します。


# 確立済みおよび関連する接続がルーターを通過することを許可
sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# LAN内のマシン (eth1経由) がインターネット (eth0経由) にアクセスすることを許可
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

# DNAT (ポートフォワーディング) がある場合、そのトラフィックが内部サーバーに入ることを許可する必要がある。
# 例: eth0からeth1への192.168.10.100のポート80へのアクセスを許可
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -d 192.168.10.100 -j ACCEPT

# FORWARDチェインのデフォルトポリシーをDROPに設定 (一致するルールがない場合はすべて拒否)
sudo iptables -P FORWARD DROP

# さらに、ルーター自体のファイアウォールも設定する必要があります (INPUTチェイン)
# どこからでもルーターへのSSHを許可 (必要に応じてIPを制限)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# ルーターによって開始されたパケットを許可 (例: ルーターが外部にpingを送信する場合)
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# LANからのルーター自体へのトラフィックを許可 (例: 管理のため)
sudo iptables -A INPUT -i eth1 -j ACCEPT

# INPUTチェインのデフォルトポリシーをDROPに設定
sudo iptables -P INPUT DROP

# OUTPUTチェインのデフォルトポリシーをACCEPTに設定 (ルーターは外部にパケットを送信できる)
sudo iptables -P OUTPUT ACCEPT

重要事項: FORWARDINPUTのデフォルトポリシーをDROPに設定することは、セキュリティを確保するために非常に重要です。ただし、必要なACCEPTルールをすべて事前に追加したことを確認する必要があります。そうしないと、ルーターまたはネットワークへのアクセスがロックされる可能性があります。

6. Iptables ルールの保存

作成したiptablesルールは、システムを再起動するまでしか有効になりません。それらを自動的に再ロードするには、保存する必要があります。Debian/Ubuntuで一般的な方法は、iptables-persistentパッケージを使用することです:


sudo apt update
sudo apt install iptables-persistent

インストールプロセス中に、現在のルールを保存するかどうか尋ねられますので、「Yes」を選択してください。または、いつでも次のコマンドで手動で保存できます:


sudo netfilter-persistent save

保存されたルールをロードするには、次のコマンドを使用します:


sudo netfilter-persistent reload

7. 設定の確認

設定が完了したら、ルーターが期待どおりに機能しているか確認します:

  • LAN内のクライアントマシン (192.168.10.100) から:
    
    ping 8.8.8.8         # IPでインターネットへの接続を確認
    ping google.com      # ドメイン名でインターネットへの接続を確認 (DNSが機能している必要がある)
    traceroute google.com # パケットの経路を確認。最初に192.168.10.1を経由することがわかるはずです
    
  • インターネット外部から (パブリックIPがあり、DNATを設定した場合):

    内部Webサーバー上のサービスにアクセスしてみます (例: ブラウザを開き、http://[ルーターのパブリックIP]にアクセスします)。

  • Linuxルーターマシンで:
    
    sudo iptables -t nat -L -v -n # NATルールを表示
    sudo iptables -L -v -n        # FILTERルール (FORWARD, INPUT, OUTPUT) を表示
    

    packetsbytesの列を確認して、ルールが使用されているかどうかを確認します。

結論

Linuxマシンをルーターに変えることで、コストを節約できるだけでなく、非常に強力で柔軟なネットワーク管理システムを構築できます。今回は、異なるネットワーク間でパケットを移動させるためのパケット転送、およびIPアドレスのセキュリティと利用を最適化するためのNAT(インターネットアクセス用のマスカレーディング、内部サービスアクセス用のポートフォワーディング)の設定について学びました。

これはLinuxルーターをセットアップするための基本的な手順に過ぎません。この基盤から、DHCPサーバー、DNSキャッシング、VPNサーバー、あるいは侵入検知/防止システム(IDS/IPS)などの高度な機能に拡張できます。Linuxの真の力は、無限のカスタマイズ可能性にあり、特定のニーズに最適なネットワークソリューションを構築できます。

ネットワークモデルの各層とパケットの移動方法を理解することが、私がかつて経験したような単純な問題から「悪夢のような」断続的なパケットロスまで、あらゆるネットワーク問題を克服するための鍵となることを忘れないでください。ご成功を祈ります!

Share: