Linuxのネットワーク
Linuxは歴史的経緯からインターネットと結びつきが深く、ネットワークにおいてはTCP/IPの考え方を基礎としている。多くの専門書では、ネットワークをOSI基本参照モデルの7層に分類して解説するが、TCP/IPではここまで厳密な分類は行わず、通信の核となるトランスポートを中心とした4層のネットワークモデルとして扱う。
Linuxのネットワークを説明する際には、これを前提として説明を行う。
以下はこのモデルの概要である。
TCP/IPの真の目的は、通信実装の変化の吸収にある。通信技術は常に進歩し、またそれに伴い様々な通信手順が開発された。かつてのネットワーク通信技術は、通信メディアが変更される都度その手順に合ったアプリケーションを開発する必要があった。TCP/IPでは、これらの手順を意識させない抽象的なネットワークであるIPという層を持たせることで解決を行っている。
異なる通信実装を持つネットワーク間へ「ルータ」と呼ばれるゲートウェイ装置を繋ぎ、これらの違いの仲介を行う。また、TCP/IPによるネットワークに接続されたネットワークは共通の体系を持ったネットワークアドレスを持たせ、通信を行えるようにした。
これは、2つの大きなメリットを生み出す。
一つは、通信技術開発・ネットワークインフラ入れ替えの柔軟化である。通信基盤は、上位のアプリケーションを意識することなく性能を追求することが可能となった。例えば、システムがネットワークの影響により十分なパフォーマンスを得られなった場合、ネットワーク機器の交換のみを行い、システム側に大きな影響を与えることなくキャパシティの拡大を図ることが可能である。
もう一つは、ソフトウェア開発の柔軟化と低コスト化である。ソフトウェアはネットワーク特性を全く意識することなく、あたかもローカルファイルを扱うような汎用的なインタフェースを用いることができるため、容易にネットワークを用いたソフトウェアが開発できる。また、通信機器の変更による影響を受けないため、柔軟な開発を可能とする。
データリンク層
データリンク層は、通信技術の実装にあたる部分を実現する層である。
同軸ケーブル・メタリックケーブル・光ケーブルを用いて最大10~20端末の通信を可能とするEthernet、長距離での2点間で認証・課金を行いながら通信するPPP、ISMバンドや5.2GHz帯を用いた無線通信する802.11、数えだせばキリがないほど大量の通信技術とそれを行うためのプロトコルが開発された。これらは、データリンク層の技術として扱われる。
設定・調整
Linux側で意識する必要があるのは、通信技術を実現するためのインタフェース、NIC(Network Interface Card)である。コンピュータへ取り付けられた、通信を行う為のプラグであり、ランプの点滅などによって我々人間の目でも物理的な状態を把握することができる。
NICは、メーカ規格のインタフェースを操作する専用ドライバを、カーネル側でサポートする必要がある。ドライバはモジュール化されており、Linuxにおいては、多様なNICをサポートするため大半がローダブルモジュール化されている。
もし起動時、正常にドライバモジュールがロードされたのであれば、カーネルメッセージへその旨を出力する。
# dmesg | grep eth ATL1E 0000:04:00.0: ATL1E: eth0 NIC Link is Up<100 Mbps Full Duplex>
Ethernetには「eth」という名称が与えられるため、このキーワードを含むメッセージを検索すると発見できる。Linuxカーネルは他の通信技術もサポートし、以下のような名前が与えられる。
認識したNIC | 対応する通信技術 |
---|---|
eth | Ethernet |
ppp | PPP |
lo | ループバックインタフェース(自ホストを表す) |
NICの状態を確認するには、コマンド「ifconfig」を用いる。
# ifconfig eth0 Link encap:Ethernet HWaddr 00:23:54:81:A8:78 inet addr:192.168.255.101 Bcast:192.168.255.255 Mask:255.255.255.0 inet6 addr: fe80::223:54ff:fe81:a878/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:30986 errors:0 dropped:0 overruns:0 frame:0 TX packets:26414 errors:0 dropped:0 overruns:0 carrier:4 collisions:0 txqueuelen:1000 RX bytes:25317765 (24.1 MiB) TX bytes:3483202 (3.3 MiB) Interrupt:28 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:36 errors:0 dropped:0 overruns:0 frame:0 TX packets:36 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2384 (2.3 KiB) TX bytes:2384 (2.3 KiB)
インターネット(IP)層
IP層では、データリンク層で認識したNICに対してルータで接続された全ネットワークで一意となるアドレス(ホストアドレス)、またネットワークを越えて通信するためのアドレス(ネットワークアドレス)の2つを設定することにより通信を実現する。
設定・調整
設定情報としては、ネットワークを一意に識別するネットワークアドレス、ホストを一意に識別するホストアドレスがある。ホストアドレスは、ネットワークアドレスを含む形で決定される。このため、サブネットマスクという仕組みを導入し、管理を容易にしている。
IPアドレス:192.168.10.26
サブネットマスク:255.255.0.0
↓
ネットワークアドレス:192.168.0.0(サブネットマスクとANDした上位ビット)
ホストアドレス:192.168.10.26
Linuxでこれを設定するには、コマンド「ifconfig」を用いる。
# ifconfig eth0 192.168.255.102 netmask 255.255.0.0
Linuxでは、1つのNICに複数のIPアドレスを設定することが可能である。2つ目以降については仮想ネットワークインタフェースと呼ばれ、NIC名へディリミタ「:」を与え、名称を与える事で設定する。
以下は、NIC「eth0」へ仮想ネットワークインタフェース「fuga」を与え、ネットワーク設定を行っているコマンドである。
# ifconfig eth0:fuga 192.168.255.103 netmask 255.255.0.0
削除は、インタフェースの無効化によって行える。
# ifconfig eth0:fuga down
ARP
ARPは、データリンク層で用いる通信技術がEthernetであり、かつその上位層でTCP/IPを用いる場合に、通信を実現するために用いるプロトコルである。
IPアドレスは自由に設定が可能であり、ネットワーク上に接続されたホストが変更を容易に行える。この場合、指定したホストアドレスを持つ端末(NIC)は常時変化する可能性を持つため、端末はあるホストアドレスと通信を行う都度通信先の端末の識別を行う必要がある。ARPは、これを実現するためのプロトコルである。
ARPは、厳密にはデータリンク層のプロトコルである。Ethernetのフレーム内に指定したホストアドレスを埋め込み、ブロードキャストにより全端末へ問い合わせを行う。ホストアドレスが一致する端末は、送信元へ応答し、ホストアドレスに対応したMACアドレスを取得する。
ARPのシーケンスは頻繁に発生するとネットワークパフォーマンスを低下させるため、ARPテーブルと呼ばれる領域に一定時間キャッシュされ、通信時に利用される。
これを確認するには、コマンド「arp」を用いる。
# arp Address HWtype HWaddress Flags Mask Iface . ether 00:1d:73:db:6b:06 C eth0 192.168.255.51 ether 00:15:b7:63:f5:5b C eth0
自身がMACアドレス「00:1d:73:db:6b:06 」であり、またホスト「192.168.255.51」は「00:15:b7:63:f5:5b」を利用していることが確認できる。
管理
IP層において、ネットワークの障害を発見するためのコマンドとして、「ping」「traceroute」が代表的である。
コマンド「ping」は、相手先のホストが存在することを確認するコマンドである。
これにはICMPと呼ばれるプロトコルを用いており、セキュリティの関係上無効にしている端末もあるため注意が必要である。
# ping 192.168.255.51 PING 192.168.255.51 (192.168.255.51) 56(84) bytes of data. 64 bytes from 192.168.255.51: icmp_seq=1 ttl=128 time=0.253 ms 64 bytes from 192.168.255.51: icmp_seq=2 ttl=128 time=0.313 ms 64 bytes from 192.168.255.51: icmp_seq=3 ttl=128 time=0.313 ms
コマンド「traceroute」は、相手先ホストまでの経路を確認するコマンドである。
これについても、ICMPを用いるためpingと同様の問題は回避できない。
# traceroute www.google.co.jp traceroute to www.google.co.jp (66.249.89.103), 30 hops max, 60 byte packets ・・・(セキュリティの関係上省略) 9 xe-2-1.a17.tokyjp01.jp.ra.gin.ntt.net (61.213.169.70) 184.779 ms xe-1-1.a17.tokyjp01.jp.ra.gin.ntt.net (61.213.169.66) 184.878 ms xe-2-1.a17.tokyjp01.jp.ra.gin.ntt.net (61.213.169.70) 184.936 ms 10 xe-3-3.a17.tokyjp01.jp.ra.gin.ntt.net (61.213.145.130) 8.758 ms 8.885 ms 8.969 ms 11 209.85.241.94 (209.85.241.94) 9.094 ms 9.217 ms 6.573 ms 12 72.14.236.126 (72.14.236.126) 9.790 ms 9.920 ms 19.884 ms 13 nrt04s01-in-f103.1e100.net (66.249.89.103) 7.632 ms 7.764 ms 9.210 ms
データの監視
Ethernetではネットワーク上のセグメントを共有するため、自端末のNICを監視することで、他の端末間で行われている通信内容を盗聴することができる。
このように、NICを通じて他の端末が流したパケットを受け取る状態のことを、プロミスキャスモードという。
Linuxでは、ユーティリティとして「tcpdump」が提供される。
# tcpdump -nli eth0 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 23:30:21.557641 IP 192.168.255.51 > 192.168.255.101: ICMP echo request, id 1024, seq 256, length 40 23:30:21.557753 IP 192.168.255.101 > 192.168.255.51: ICMP echo reply, id 1024, seq 256, length 40 23:30:22.558442 IP 192.168.255.51 > 192.168.255.101: ICMP echo request, id 1024, seq 512, length 40 23:30:22.558520 IP 192.168.255.101 > 192.168.255.51: ICMP echo reply, id 1024, seq 512, length 40 23:30:23.558677 IP 192.168.255.51 > 192.168.255.101: ICMP echo request, id 1024, seq 768, length 40 23:30:23.558753 IP 192.168.255.101 > 192.168.255.51: ICMP echo reply, id 1024, seq 768, length 40 23:30:24.559873 IP 192.168.255.51 > 192.168.255.101: ICMP echo request, id 1024, seq 1024, length 40 23:30:24.559971 IP 192.168.255.101 > 192.168.255.51: ICMP echo reply, id 1024, seq 1024, length 40
設定
コンピュータに接続されたNICを通じて受信したデータ、またコンピュータ上のサービスから発信されるデータは、ルーティングテーブルの情報を参考にして、データの送信を行うNICとローカルネットワーク内の送信先を決定する。
ルーティングテーブルの設定は、コマンド「route」を用いる。
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.255.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
サブコマンド無しでコマンドを入力すれば、設定された情報が全て表示される。
サブコマンドを指定することで、ルーティング情報の追加や削除を行うことができる。例えば、追加を行うのであれば、サブコマンド「add」を利用する。
異なるネットワークへデータを転送するのであれば、例えば、「10.0.0.0/8」のネットワークアドレスに所属するホストがノード「192.168.255.122」へ転送することで到達できるのであれば、以下のコマンドで設定できる。
# route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.255.122 # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.255.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0 10.0.0.0 192.168.255.122 255.0.0.0 UG 0 0 0 eth0
削除は、サブコマンド「del」を用いる。
デフォルトゲートウェイの設定をするのであれば、サブコマンドへ「defalt gw」を追記する。
# route add default gw 192.168.255.1 # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.255.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0 0.0.0.0 192.168.255.1 0.0.0.0 UG 0 0 0 eth0
削除についても、同様である。
# route del default gw 192.168.255.1 # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.255.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
トランスポート層
トランスポート層では、アプリケーションの特性に合わせた論理的な通信インタフェースを提供する。
現在は、TCPとUDPの2種類が用いられ、TCPは信頼性の高さが求められるアプリケーションに利用され、UDPは信頼性が低い代わりに処理コストが低いアプリケーションに利用される。
ネットワークを通じてホスト上のアプリーション(サービス)へ接続する場合、指定のポート番号と呼ばれる識別番号を指定し接続を行う。HTTPであれば80、DNSであれば53といった具合で、ホスト上のサービスを識別できるよう、Well-Knownポート番号と呼ばれるものが標準として定められている。また逆に、接続元もポート番号を持ち、接続先から帰ってきたパケットの受付先を識別する。
管理
Linuxでは、コマンド「netstat」を用いて、アクティブな接続やネットワークの状態を確認できる。
# netstat -lp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 *:44838 *:* LISTEN 1103/rpc.statd tcp 0 0 *:sunrpc *:* LISTEN 850/rpcbind tcp 0 0 *:ssh *:* LISTEN 1152/sshd ・・・(略)
これらは自ホストのトランスポート層の状態を表している。
別のホストの確認では、コマンド「nc」を用いる。これは、ポートスキャンの実施や、簡単な通信などを行うことができる。
# nc localhost 22 SSH-2.0-OpenSSH_5.2
永続化
Linuxのコマンドを用いたネットワーク設定は、起動中のみ有効である。設定情報は、起動時に設定ファイルを参照して設定されるため、永続化が必要であればこれら設定ファイル「/etc/sysconfig/network」の設定を行う必要がある。
NETWORKING=yes HOSTNAME=localhost.localdomain GATEWAY=192.168.0.1
NICごとの設定を行うには、RedHat系ではディレクトリ「/etc/sysconfig/network-scripts」以下に配置される設定ファイル「ifcfg-*」を用いて設定する。
# Attansic Technology Corp. Atheros AR8121/AR8113/AR8114 PCI-E Ethernet Controller DEVICE=eth0 HWADDR=00:23:54:81:A8:78 BOOTPROTO=static BROADCAST=192.168.255.255 IPADDR=192.168.255.10 NETMASK=255.255.255.0 NETWORK=192.168.255.0 ONBOOT=yes
- 最終更新:2009-12-19 16:39:15