ウェブサイト検索

Linux サーバーをルーターに変えて静的および動的にトラフィックを処理する方法 - パート 10


このLFCE (Linux Foundation Certified Engineer) シリーズの以前のチュートリアルで予想していたように、この記事では、特定のアプリケーションでの IP トラフィックの静的および動的ルーティングについて説明します。

Linux Foundation 認定プログラムの紹介

まず最初に、いくつかの定義を正確に理解しましょう。

  1. 簡単に言うと、パケット はネットワーク内で情報を送信するために使用される基本単位です。ネットワーク プロトコルとして TCP/IP を使用するネットワークは、データ送信についても同じルールに従います。実際の情報は、データとその送信先アドレスの両方で構成されるパケットに分割されます。
  2. ルーティング は、ネットワーク内の送信元から宛先までデータを「導く」プロセスです。
  3. 静的ルーティングには、ルーティング テーブルに定義された手動で構成された一連のルールが必要です。これらのルールは固定されており、パケットがあるマシンから別のマシンに移動するときに通過する必要がある方法を定義するために使用されます。
  4. ダイナミック ルーティング または スマート ルーティング (必要な場合) とは、パケットがたどるルートをシステムが必要に応じて自動的に変更できることを意味します。

高度な IP およびネットワーク デバイス構成

iproute パッケージは、ネットワークとトラフィック制御を管理するための一連のツールを提供します。これらのツールは、ifconfig や route などの従来のツールの代替となるため、この記事全体で使用します。

iproute スイートの中心的なユーティリティは、単に ip と呼ばれます。その基本的な構文は次のとおりです。

ip object command

object は次のいずれか 1 つだけです (最も頻繁に使用されるオブジェクトのみが表示されます。完全なリストについては man ip を参照してください)。

  1. リンク: ネットワークデバイス。
  2. addr: デバイス上のプロトコル (IP または IPv6) アドレス。
  3. ルート: ルーティング テーブル エントリ。
  4. ルール: ルーティング ポリシー データベースのルール。

一方、コマンド は、オブジェクトに対して実行できる特定のアクションを表します。次のコマンドを実行すると、特定のオブジェクトに適用できるコマンドの完全なリストを表示できます。

ip object help

例えば、

ip link help

たとえば、上の画像は、次のコマンドを使用してネットワーク インターフェイスのステータスを変更できることを示しています。

ip link set interface {up | down}

ip」コマンドのその他の例については、「IP アドレスを設定するための 10 の便利な「ip」コマンド」を参照してください。

例 1: ネットワーク インターフェイスの無効化と有効化

この例では、eth1 を無効化および有効化します。

ip link show
ip link set eth1 down
ip link show

eth1 を再度有効にしたい場合は、

ip link set eth1 up

すべてのネットワーク インターフェイスを表示する代わりに、そのうちの 1 つを指定できます。

ip link show eth1

これにより、eth1 のすべての情報が返されます。

例 2: メインルーティングテーブルの表示

次の 3 つのコマンドのいずれかを使用して、現在のメイン ルーティング テーブルを表示できます。

ip route show
route -n
netstat -rn

3 つのコマンドの出力の最初の列は、ターゲット ネットワークを示します。 ip Route show の出力 (キーワード dev に続く) には、それらのネットワークへの物理ゲートウェイとして機能するネットワーク デバイスも表示されます。

現在ではルートよりも ip コマンド の方が好まれていますが、残りの詳細な説明については man ip-routeman Route を参照してください。列の。

例 3: Linux サーバーを使用して 2 つのプライベート ネットワーク間でパケットをルーティングする

icmp (ping) パケットを dev2 から dev4 にルーティングし、その逆も同様にルーティングしたいと考えています (両方のクライアント マシンが異なるネットワーク上にあることに注意してください)。各 NIC の名前と、それに対応する IPv4 アドレスが角括弧内に示されています。

弊社のテスト環境は以下の通りです。

Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1
Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2
Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

dev1 (CentOS ボックス) のルーティング テーブルを表示してみましょう。

ip route show

次に、enp0s3 NIC と 192.168.0.15 への接続を使用して 10.0.0.0/24 ネットワーク内のホストにアクセスするように変更します。

ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3

これは基本的に、「ゲートウェイとして 192.168.0.15 を使用して、enp0s3 ネットワーク インターフェイスを介して 10.0.0.0/24 ネットワークにルートを追加します」となります。

同様に、dev4 (openSUSE ボックス) で 192.168.0.0/24 ネットワーク内のホストに ping を実行します。

ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

最後に、Debian ルーターで転送を有効にする必要があります。

echo 1 > /proc/sys/net/ipv4/ip_forward

それでは、ping を送信してみましょう:

そして、

これらの設定を起動後も永続的にするには、ルーターの /etc/sysctl.conf を編集し、次のように net.ipv4.ip_forward 変数が true に設定されていることを確認します。

net.ipv4.ip_forward = 1

さらに、両方のクライアントで NIC を構成します (openSUSE では /etc/sysconfig/network 内、CentOS では /etc/sysconfig/network-scripts 内で構成ファイルを探します)。どちらの場合も、ifcfg-enp0s3 と呼ばれます)。

以下は、openSUSE ボックスの構成ファイルです。

BOOTPROTO=static
BROADCAST=10.0.0.255
IPADDR=10.0.0.18
NETMASK=255.255.255.0
GATEWAY=10.0.0.15
NAME=enp0s3
NETWORK=10.0.0.0
ONBOOT=yes
例 4: Linux サーバーを使用してプライベート ネットワークとインターネットの間でパッケージをルーティングする

Linux マシンをルーターとして使用できるもう 1 つのシナリオは、インターネット接続をプライベート LAN と共有する必要がある場合です。

Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2
Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4

前の例のようにクライアントでパケット転送と静的ルーティング テーブルを設定することに加えて、ルーターにいくつかの iptables ルールを追加する必要があります。

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

最初のコマンドは、nat (ネットワーク アドレス変換) テーブルのPOSTROUTING チェーンにルールを追加し、送信パッケージに eth0 NIC を使用する必要があることを示します。

マスカレード は、この NIC が動的 IP を持ち、パッケージをインターネットの「ワイルド ワイルド ワールド 」に送信する前に、パケットのプライベート ソース アドレスを変更する必要があることを示します。ルーターのパブリックIPに変更されます。

多数のホストが存在する LAN では、ルーターは確立された接続を /proc/net/ip_conntrack で追跡し、インターネットからの応答をどこに返すかを認識します。

以下の出力の一部のみ:

cat /proc/net/ip_conntrack

次のスクリーンショットに示されています。

パケットの発信元 (openSUSE ボックスのプライベート IP) と宛先 (Google DNS) が強調表示されている場所。実行した結果は次のとおりです。

curl linux-console.net

openSUSE ボックスにあります。

すでにご想像のとおり、ルーターは Google の 8.8.8.8 をネームサーバーとして使用しており、発信パケットの宛先がそのアドレスを指す理由はこれにあります。

: インターネットからの受信パッケージは、すでに確立された接続 (コマンド #2) の一部である場合にのみ受け入れられますが、送信パッケージは許可されます。 フリー終了 」 (コマンド #3)。

このシリーズのパート 8 – iptables ファイアウォールの構成で概説されている手順に従って、iptables ルールを永続化することを忘れないでください。

Quagga による動的ルーティング

現在、Linux の動的ルーティングに最もよく使用されているツールはquagga です。これにより、システム管理者は、強力な (そして高価な) Cisco ルーターが提供するのと同じ機能を、比較的低コストの Linux サーバーを使用して実装できます。

ツール自体はルーティングを処理しませんが、パケットを処理するための新しい最適なルートを学習するときにカーネル ルーティング テーブルを変更します。

これは、しばらく前に開発が中止されたプログラムである zebra のフォークであるため、歴史的な理由から zebra と同じコマンドと構造が維持されています。この時点からシマウマへの言及が多く見られるのはそのためです。

動的ルーティングと関連するすべてのプロトコルを 1 つの記事で説明することは不可能であることに注意してください。ただし、ここで紹介する内容は構築の出発点として役立つと確信しています。

Linux への Quagga のインストール

選択したディストリビューションに quagga をインストールするには:

aptitude update && aptitude install quagga 				[On Ubuntu]
yum update && yum install quagga 					[CentOS/RHEL]
zypper refresh && zypper install quagga 				[openSUSE]

例 3 と同じ環境を使用しますが、唯一の違いは、eth0 が IP 192.168.0.1 のメイン ゲートウェイ ルーターに接続されていることです。

次に、/etc/quagga/daemons を次のように編集します。

zebra=1
ripd=1

次に、次の構成ファイルを作成します。

/etc/quagga/zebra.conf
/etc/quagga/ripd.conf

そして、次の行を追加します (選択したホスト名とパスワードに置き換えます)。

service quagga restart
hostname    	dev2
password    	quagga
service quagga restart

: ripd.conf は、ルーティング情報プロトコルの設定ファイルであり、ルータにどのネットワークを使用できるかに関する情報を提供します。到達距離と (ホップ量の点で) 距離。

これは quagga と一緒に使用できるプロトコルの 1 つにすぎないことに注意してください。資格情報をプレーン テキストで渡すという欠点はありますが、使いやすさとほとんどのネットワーク デバイスがこれをサポートしているため、このチュートリアルではこれを選択しました。このため、構成ファイルに適切なアクセス許可を割り当てる必要があります。

chown quagga:quaggavty /etc/quagga/*.conf
chmod 640 /etc/quagga/*.conf 
例 5: IP トラフィックを動的にルーティングするための quagga のセットアップ

この例では、2 台のルーターで次の設定を使用します (前に説明したように、必ずルーター #2 の構成ファイルを作成してください)。

重要: 両方のルーターに対して次の設定を繰り返すことを忘れないでください。

ルーターとカーネル間の論理仲介者である zebra (ポート 2601 でリッスン) に接続します。

telnet localhost 2601

/etc/quagga/zebra.conf ファイルに設定されたパスワードを入力し、構成を有効にします。

enable
configure terminal

各 NIC の IP アドレスとネットワーク マスクを入力します。

inter eth0
ip addr 192.168.0.15
inter eth1
ip addr 10.0.0.15
exit
exit
write

次に、RIP デーモン ターミナル (ポート 2602) に接続する必要があります。

telnet localhost 2602

/etc/quagga/ripd.conf ファイルに設定されているようにユーザー名とパスワードを入力し、次のコマンドを太字で入力します (明確にするためにコメントが追加されています)。

enable turns on privileged mode command.
configure terminal changes to configuration mode. This command is the first step to configuration
router rip enables RIP.
network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. 
exit
exit
write writes current configuration to configuration file.

: どちらの場合も、構成は前に追加した行 (/etc/quagga/zebra.conf と <) に追加されます。 b>/etc/quagga/ripd.conf)。

最後に、両方のルーターの zebra サービスに再度接続し、それぞれのルーターが他のルーターの背後にあるネットワークへのルートをどのように「学習」したか、およびそのネットワークに到達するための次のホップはどれであるかを確認します。コマンド show ip Route を実行して、ネットワークを確認します。

show ip route

別のプロトコルやセットアップを試してみたい場合は、Quagga プロジェクト サイトで詳細なドキュメントを参照してください。

結論

この記事では、Linux ボックス ルーターを使用して静的ルーティングと動的ルーティングを設定する方法を説明しました。ルーターを好きなだけ追加し、好きなだけ実験してください。ご意見やご質問がございましたら、下記のお問い合わせフォームを使用してお気軽にご連絡ください。