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

Linux Foundation認定プログラムの紹介
ますます、まず最初に、いくつかの定義を明確にしましょう:
- 単純な言葉で言うと、パケットはネットワーク内で情報を送信するために使用される基本単位です。TCP/IPをネットワークプロトコルとして使用するネットワークは、データの実際の情報がパケットに分割され、それが送信されるべきアドレスとデータの両方から構成されるパケットを使用してデータを転送します。
- ルーティングは、ネットワーク内でデータをソースから宛先へと「案内する」プロセスです。
- 静的ルーティングは、ルーティングテーブルで定義された手動で設定されたルールセットが必要です。これらのルールは固定されており、1つのマシンから別のマシンに移動する際にパケットが通過する方法を定義します。
- 動的ルーティング、またはスマートルーティング(お好みで)と呼ばれるものは、システムが必要に応じてパケットがたどるルートを自動的に変更できることを意味します。
IPおよびネットワークデバイスの高度な構成
iprouteパッケージは、ネットワーキングおよびトラフィック制御を管理するためのツールセットを提供します。これらは、ifconfigやrouteなどの従来のツールの置換を表します。
iprouteスイートの中心的なユーティリティは単にipと呼ばれます。基本的な構文は次のようになります:
# ip object command
ここで、objectは以下のいずれかのみです(最も一般的なオブジェクトのみが表示されます – 完全なリストについてはman ipを参照してください):
- link: ネットワークデバイス。
- addr: デバイス上のプロトコル(IPまたはIPv6)アドレス。
- route: ルーティングテーブルエントリ。
- rule: ルーティングポリシーデータベースのルール。
ここで、commandはオブジェクトに対して実行できる特定のアクションを表します。特定のオブジェクトに適用できるコマンドの完全なリストを表示するには、次のコマンドを実行できます:
# ip object help
たとえば、
# ip link help

上記のイメージでは、ネットワークインターフェースの状態を次のコマンドで変更できることが示されています:
# ip link set interface {up | down}
このような ‘ip’ コマンドのさらなる例については、10 Useful ‘ip’ Commands to Configure IP Addressを読んでください。
例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

最初のコマンドの出力の最初の列は、ターゲットネットワークを示しています。 ip routeの出力(キーワードdevに続く)は、これらのネットワークへの物理的なゲートウェイとして機能するネットワークデバイスも示しています。
現在ではip commandがrouteよりも好まれますが、残りの列の詳しい説明については、引き続きman ip-routeとman routeを参照できます。
例3:Linuxサーバーを使用して2つのプライベートネットワーク間でパケットをルーティングする
dev2からdev4へのicmp(ping)パケットをルーティングしたいとします(両方のクライアントマシンが異なるネットワーク上にあることに注意してください)。各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
そして、そのルーティングテーブルを変更して、10.0.0.0/24ネットワーク内のホストにアクセスするために、そのenp0s3 NICと192.168.0.15への接続を使用します:
# ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3
これは、要するに、「10.0.0.0/24ネットワークへのルートをenp0s3ネットワークインターフェースを介して追加し、ゲートウェイとして192.168.0.15を使用する」ということです。

同様に、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マシンをルーターとして使用する別のシナリオは、インターネット接続をプライベート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(Network Address Translation)テーブルのPOSTROUTINGチェーンにルールを追加し、eth0 NICが送信パケットに使用されることを示します。
MASQUERADEは、このNICが動的IPを持っており、パケットをインターネットの「荒々しい世界」に送信する前に、パケットのプライベートソースアドレスをルーターの公共IPに変更する必要があることを示します。
多くのホストを持つLANでは、ルーターは/proc/net/ip_conntrackで確立された接続を追跡しているため、インターネットからの応答をどこに返すかを知っています。
次のスクリーンショットには、
# cat /proc/net/ip_conntrack
の出力の一部が表示されています。

パケットの送信元(openSUSEボックスのプライベートIP)と宛先(Google DNS)が強調表示されています。これはopenSUSEボックスで実行した結果です:
# curl www.tecmint.com
ルーターは、名前解決サーバーとしてGoogleの8.8.8.8を使用していることがすでにお分かりかと思いますが、それが出力パケットの宛先がそのアドレスを指す理由を説明しています。
注意: インターネットからの着信パケットは、すでに確立された接続の一部である場合にのみ受け入れられます(コマンド#2)、一方、送信パケットは「自由に出口」(コマンド#3)が許可されます。
このシリーズのPart 8 – Configure Iptables Firewallで概説されている手順に従って、iptablesのルールを永続化するのを忘れないでください。
Quaggaを使用した動的ルーティング
現在、Linuxで最も使用されている動的ルーティングツールはquaggaです。これにより、システム管理者は、比較的低コストのLinuxサーバーで、強力で高価なCiscoルーターが提供する機能と同じ機能を実装できます。
このツール自体はルーティングを処理せず、代わりに新しい最適なルートを学習してパケットを処理するためにカーネルルーティングテーブルを変更します。
かつての開発が停止したプログラムであるzebraのフォークであるため、歴史的な理由から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]
Example#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
Example 5:IPトラフィックを動的にルーティングするquaggaのセットアップ
この例では、2つのルーターを使用します(以前に説明したようにrouter #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および/etc/quagga/ripd.conf)。
最後に、両方のルーターで再びzebraサービスに接続し、それぞれが他方の背後にあるネットワークへの経路を「学習」し、そのネットワークに到達するための次のホップが何であるかを確認するために、show ip routeコマンドを実行してください:
# show ip route

異なるプロトコルや設定を試したい場合は、詳細なドキュメントについてはQuaggaプロジェクトサイトを参照してください。
結論
この記事では、Linuxボックスルーターを使用して静的および動的ルーティングを設定する方法を説明しました。ご希望の数だけルーターを追加し、思う存分実験してください。ご質問やコメントがある場合は、以下のお問い合わせフォームを使用してお気軽にお知らせください。