以下は設定でよくあるパターンのサンプルです。これは単にガイドです。設定 すべきネットワークの数と同じくらい設定方法もまた存在するものです。しか し出発点を与えることにはなるでしょう。
家庭内で小規模なローカルエリアネットワークを構築していて、そのネットワー ク上のマシンをローカルな無線LANに接続したいと考えている人は多いでしょ う。 私もこういう形態の環境を家で使っています。 経路情報が一つで済むように適当なアドレスのブロックを割当てて、それをイー サネット LAN で使っています。 あなたも同じようにしたければ、あなたの地域の IP 割当て担当者が考慮して くれることでしょう。 イーサネット LAN のアドレスは無線 LAN のアドレスのサブセットになります。 以下のネットワーク環境は実際に私が家庭内ネットワークで Linux ルーター に行なっている設定と同じです。
Note: (訳注) 以下の設定はやや特殊な例だと思います。無線 LAN とイーサネッ ト LAN のネットワークアドレスを分けて、Linux ルーター上で NAT 設定を行なう 構成がより一般的だと思います。
. . . . . . ___ _________ . | Network / \ . Network | 44.136.8.96/29| | . 44.136.8.0/24 \ | / | | Linux | . \|/ | | | . _____ __________ | | eth0 | Router | . / \ / \ | |_______________| |_____| TNC |____| Radio |__/ | 44.136.8.97 | and | . \_____/ \__________/ | | | ax0 | | Server | 44.136.8.5 | | | . | | | . | \_________/ . _|_ . . . . . . |
#!/bin/sh # /etc/rc.net # ここでは KISS の AX.25 ポートを一つとイーサネットデバイス # 一つの設定を行なう。 echo "/etc/rc.net" echo " Configuring:" echo -n " loopback:" /sbin/ifconfig lo 127.0.0.1 /sbin/route add 127.0.0.1 echo " done." echo -n " ethernet:" /sbin/ifconfig eth0 44.136.8.97 netmask 255.255.255.248 \ broadcast 44.136.8.103 up /sbin/route add 44.136.8.97 eth0 /sbin/route add -net 44.136.8.96 netmask 255.255.255.248 eth0 echo " done." echo -n " AX.25: " kissattach -m 512 /dev/ttyS1 4800 ifconfig ax0 44.136.8.5 netmask 255.255.255.0 broadcast 44.136.8.255 up route add -host 44.136.8.5 ax0 route add -net 44.136.8.0 window 1024 ax0 echo -n " NET/ROM: " nrattach -i 44.136.8.5 netrom echo " Routing:" /sbin/route add default gw 44.136.8.68 window 1024 ax0 echo " default route." echo done. # end |
/etc/ax25/axports
# ポート名 コールサイン ボーレート パケット長 ウィンドウ 説明 4800 VK2KTJ-0 4800 256 2 144.800 MHz |
/etc/ax25/nrports
# ポート名 コールサイン エイリアス パケット長 説明 netrom VK2KTJ-9 LINUX 235 Linux Switch Port |
/etc/ax25/nrbroadcast
# AX.25のポート名 min_obs def_qual worst_qual verbose 4800 1 120 10 1 |
カーネル再構築の際に IP_FORWARDING を有効にしておく必要があります。
AX.25 の設定ファイルについては以前の章で例として解説してきたもの、その ままです。 必要に応じて以前の章を参照してください。
無線ポート用の IP アドレスには家庭内ネットワークに含まれないものを使っ ています。 しかし必ずしもそうである必要はなく、無線ポート用に 44.136.8.97 を使うこともできます。
44.136.8.68 はローカルの IPIP カプセル化ゲートウェ イです。 したがってデフォルトの経路がそこを指すようにしています。
イーサネットワーク側の各マシンには以下のような経路情報を設定しています。
route add -net 44.0.0.0 netmask 255.0.0.0 \ gw 44.136.8.97 window 512 mss 512 eth0 |
mss や window といったパラメー ターを用いているのはイーサネット側・無線ネット側双方から最適なパフォー マンスを得るためです。
ルーターマシンでは smail, http, ftp などのデーモンも動作しています。 したがって、このマシンさえあれば他のマシンにこれらのサービスを提供する ことができます。
ルーターマシンは 20Mb のハードドライブがついた質素な 386DX2 です。 Linux に関しては最低限のものだけ入っています。
Warning |
この章のトンネルについての記述はいくらか賞味期限切れです。 2.0.x カーネル以降で設定方法は変わりました。 現在では Advanced Routing HOWTO で説明されている通り、iproute2 パッケー ジの「ip」コマンドを使います。 |
今日では Linux は TCP/IP カプセル化ゲートウェイとして世界中で非常によ く使われています。 新しいトンネルドライバーは多重カプセル化ルーティングをサポートしていま す。 これにより以前の ipip デーモンは使われることがな くなりました。
よくあるネットワーク環境としては、こんな感じになるでしょう。
. . . . . . ___ _________ . | Network / \ . Network | 154.27.3.0/24 | | . 44.136.16.0/24 \ | / | | Linux | . \|/ | | | . _____ __________ | | eth0 | IPIP | . / \ / \ | ___|_______________| |_____| TNC |____| Radio |___/ | 154.27.3.20 | Gateway | . \_____/ \__________/ | | | ax0 | | | 44.136.16.1 | | | . | | | . | \_________/ . _|_ . . . . . . |
さて、問題の設定ファイルは以下の通りです。
# /etc/rc.net # ここでは KISS の AX.25 無線ポートを一つとイーサーネットデバイスを一つ、 # それと IPIP カプセルの埋込み/取出しを行なうトンネルドライバーの設定 # を行なう。 # echo "/etc/rc.net" echo " Configuring:" # echo -n " loopback:" /sbin/ifconfig lo 127.0.0.1 /sbin/route add 127.0.0.1 echo " done." # echo -n " ethernet:" /sbin/ifconfig eth0 154.27.3.20 netmask 255.255.255.0 \ broadcast 154.27.3.255 up /sbin/route add 154.27.3.20 eth0 /sbin/route add -net 154.27.3.0 netmask 255.255.255.0 eth0 echo " done." # echo -n " AX.25: " kissattach -m 512 /dev/ttyS1 4800 /sbin/ifconfig ax0 44.136.16.1 netmask 255.255.255.0 broadcast 44.136.16.255 up /sbin/route add -host 44.136.16.1 ax0 /sbin/route add -net 44.136.16.0 netmask 255.255.255.0 window 1024 ax0 # echo -n " tunnel:" /sbin/ifconfig tunl0 44.136.16.1 mtu 512 up # echo done. # echo -n "Routing ... " source /etc/ipip.routes echo done. # # end. |
それから、これも。
# /etc/ipip.routes # このファイルは munge スクリプトが作成します。 # /sbin/route add -net 44.134.8.0 netmask 255.255.255.0 tunl0 gw 134.43.26.1 /sbin/route add -net 44.34.9.0 netmask 255.255.255.0 tunl0 gw 174.84.6.17 /sbin/route add -net 44.13.28.0 netmask 255.255.255.0 tunl0 gw 212.37.126.3 ... ... ... |
/etc/ax25/axports
# ポート名 コールサイン ボーレート パケット長 ウィンドウ 説明 4800 VK2KTJ-0 4800 256 2 144.800 MHz |
ここで注意すべき点は以下の通り。
新しいトンネルドライバーは相手先の IPIP ゲートウェイを指定するのに pointopoint パラメーターではなくルーティングテー ブルの gw の指定を使います。 これにより一つのインターフェイスで複数のルーティングを指定することがで きるようになりました。
二つのネットワークデバイスを同一のアドレスで設定することも可 能です。 この例では ax0、tunl0 共に無線ポー ト用の IP アドレスを設定しています。 こうすることで相手先ゲートウェイがカプセル化したデータグラム中のアドレ スと同じ正しいアドレスを見ることになります。
カプセル化したパケットのルーティングを指定する route コマンドの部分は 自動的に改良版の munge スクリプトによって作成され ます。 このスクリプトは後で示します。 route コマンドの部分は一旦、別のファイルに書き込まれ、 bash の source /etc/ipip.routes という命令で読み込まれます (ただしルーティ ング命令を記述したファイルの名前が /etc/ipip.routes であるとします)。munge スクリプトに読み込ませるファイルは NOS の route コマンドの書式でなければなりません。
route コマンドでの window パ ラメーターの使い方に注意してください。 このパラメーターを適切に設定することで無線接続のパフォーマンスをあげる ことができます。
新しい tunnel-munge スクリプト
#!/bin/sh # # From: Ron Atkinson <n8fow@hamgate.cc.wayne.edu> # # このスクリプトは Bdale N3EUA が IPIP デーモン用に書いた munge スク # リプトを元に、Ron Atkinson N8FOW が改良を加えました。このスクリプト # は KA9Q NOS 形式のゲートウェイ経路ファイル (通常「encap.txt」という # 名前) を IP トンネルドライバー用に Linux のルーティングテーブル形式 # に変換するものです。 # # 使い方:標準入力からゲートウェイのファイルを入力すると、Linux # のルーティング形式のファイルが標準出力から出力される。 # 例、 tunnel-munge < encap.txt > ampr-routes # # 注意: このスクリプトを使う前に以下の点に注意してください。 # # 1) 「Local routes」と「Misc user routes」の箇所はあなた自身の設 # 定に変更してください(私の設定のまま使わないで)。 # 2) fgrep の行はあなたのインターネットへのゲートウェイの IP アド # レスに必ず変更するようにしてください。さもなければ重大なルー # ティングのループが発生することがあります。 # 3) デフォルトのインターフェイス名は「tunl0」です。あなたのシステ # ムに合わせて変更してください。 echo "#" echo "# IP tunnel route table built by $LOGNAME on `date`" echo "# by tunnel-munge script v960307." echo "#" echo "# Local routes" echo "route add -net 44.xxx.xxx.xxx netmask 255.mmm.mmm.mmm dev sl0" echo "#" echo "# Misc user routes" echo "#" echo "# remote routes" fgrep encap | grep "^route" | grep -v " XXX.XXX.XXX.XXX" | \ awk '{ split($3, s, "/") split(s[1], n,".") if (n[1] == "") n[1]="0" if (n[2] == "") n[2]="0" if (n[3] == "") n[3]="0" if (n[4] == "") n[4]="0" if (s[2] == "1") mask="128.0.0.0" else if (s[2] == "2") mask="192.0.0.0" else if (s[2] == "3") mask="224.0.0.0" else if (s[2] == "4") mask="240.0.0.0" else if (s[2] == "5") mask="248.0.0.0" else if (s[2] == "6") mask="252.0.0.0" else if (s[2] == "7") mask="254.0.0.0" else if (s[2] == "8") mask="255.0.0.0" else if (s[2] == "9") mask="255.128.0.0" else if (s[2] == "10") mask="255.192.0.0" else if (s[2] == "11") mask="255.224.0.0" else if (s[2] == "12") mask="255.240.0.0" else if (s[2] == "13") mask="255.248.0.0" else if (s[2] == "14") mask="255.252.0.0" else if (s[2] == "15") mask="255.254.0.0" else if (s[2] == "16") mask="255.255.0.0" else if (s[2] == "17") mask="255.255.128.0" else if (s[2] == "18") mask="255.255.192.0" else if (s[2] == "19") mask="255.255.224.0" else if (s[2] == "20") mask="255.255.240.0" else if (s[2] == "21") mask="255.255.248.0" else if (s[2] == "22") mask="255.255.252.0" else if (s[2] == "23") mask="255.255.254.0" else if (s[2] == "24") mask="255.255.255.0" else if (s[2] == "25") mask="255.255.255.128" else if (s[2] == "26") mask="255.255.255.192" else if (s[2] == "27") mask="255.255.255.224" else if (s[2] == "28") mask="255.255.255.240" else if (s[2] == "29") mask="255.255.255.248" else if (s[2] == "30") mask="255.255.255.252" else if (s[2] == "31") mask="255.255.255.254" else mask="255.255.255.255" if (mask == "255.255.255.255") printf "route add -host %s.%s.%s.%s gw %s dev tunl0\n"\ ,n[1],n[2],n[3],n[4],$5 else printf "route add -net %s.%s.%s.%s gw %s netmask %s dev tunl0\n"\ ,n[1],n[2],n[3],n[4],$5,mask }' echo "#" echo "# default the rest of amprnet via mirrorshades.ucsd.edu" echo "route add -net 44.0.0.0 gw 128.54.16.18 netmask 255.0.0.0 dev tunl0" echo "#" echo "# the end" |
多くのアマチュア無線インターネットゲートウェイ局では TCP/IP 以外にも AX.25, NET/ROM, ROSE のカプセル化を行なっています。 IP データグラム内に AX.25 フレームをカプセル化する方法については Brian Kantor が RFC-1226 で説明しています。 Mike Westerhof は 1991 年に UNIX 用の AX.25 カプセル化デーモンの実装を 行ないました。 ax25-utils パッケージには、それを Linux 用に少し拡張したバージョンが収 録されています。 (訳注:ax25ipd は ax25-apps パッケージに含まれています)
AXIP カプセル化デーモンは一方の側で AX.25 フレームを受付けて、送り先の AX.25 アドレスからどの IP アドレスに送るべきかを判断し、そのフレームを TCP/IP のデータグラムにカプセル化し、適切なリモートホスト向け送出をし ます。 もう一方の側では AX.25 フレームを内包した TCP/IP データグラムを受付け て、そのフレームを取出し、それをまるで AX.25 ポートから直接受け取った かのように処理します。 AX.25 フレームを内包する IP データグラムを見分けるために、AXIP データ グラムはプロトコル ID として 4 を採用しています (または 94 も使われる こともありますが、これは現在では使用しないよう言われています)。 この処理の過程は RFC-1226 で説明されています。
ax25-utils パッケージに含まれるプログラム ax25ipd は AX.25 フレームをやりとりする側に対しては KISS インターフェイスを提 供します。 また TCP/IP プロトコル群に対するインターフェイスも提供します。 設定は /etc/ax25/ax25ipd.conf という名前の設定ファ イル一つだけで行ないます。
ax25ipd には大きく分けて二つの動作モードがありま す。 「デジピーターモード」と「TNCモード」です。 「TNCモード」ではデーモンは KISS TNC であるかのような動作をします。 つまり KISS フレームにカプセル化したパケットをデーモンに渡すと、デーモ ンはそれを送信します。 このモードが普通の設定になります。 「デジピーターモード」ではデーモンは AX.25 デジピーターであるかのよう な動作をします。 これらのモードには微妙に違う部分があります。
設定ファイルにおいては「経路」の設定、すなわち、どの宛先の AX.25 コー ルサインをどの IP アドレスのホストに送るかのマッピングを行ないます。 それぞれの経路には後で説明するオプションの項目があります。
それ以外に、ここで設定されるオプションは以下の通り:
ax25ipd デーモンがオープンする端末 (通常はパイプ の片方) とそのスピード。
「デジピーターモード」でどのコールサインを使うか。
ビーコンの送出間隔とその内容。
AX.25 フレームを IP データグラムとしてカプセル化するか、または UDP/IP データグラムとしてカプセル化するか。 ほとんどの AXIP ゲートウェイでは IP によるカプセル化を採用していますが、 中には AXIP プロトコル ID を持つ IP パケットを認めないファイアーウォー ル内のゲートウェイなどで仕方なく UDP/IP を採用していることもあります。 どちらを選ぶ場合も接続を行なう相手方の TCP/IP ホストと一致している必要 があります。
# # floyd.vk5xxx.ampr.org 用の ax25ipd 設定ファイル # # axip 転送方法の選択。他のゲートウェイとの互換性が必要なら「ip」とす # ること。 # socket ip # # ax25ipd の動作モードの設定。digi あるいは tnc # mode tnc # # 上で digi を選んだならコールサインを指定すること。tnc を選んだのなら # コールサインは今のところ必須ではない。ただし将来変更されることもある。 # (デュアルポートの KISS インターフェイスには二つコールサインを指定す # ること) # #mycall vk5xxx-4 #mycall2 vk5xxx-5 # # digi モードではエイリアスを使うことができる。(デュアルポートには二つ # 指定) # #myalias svwdns #myalias2 svwdn2 # # ID を 540 秒毎に送信。 # #beacon after 540 #btext ax25ip -- tncmode rob/vk5xxx -- Experimental AXIP gateway # # シリアルポート。私の場合は kissattach に接続したパイプ。 # device /dev/ttyq0 # # デバイスのスピードの設定。 # speed 9600 # # loglevel 0 - 出力なし # loglevel 1 - 設定情報のみ # loglevel 2 - 重要なイベントとエラー情報 # loglevel 3 - 重要なイベントとエラー情報、および AX.25 フレームのトレース # loglevel 4 - 全てのイベント # 当面は log 0、syslog 経由の出力はまだ動作しない。 # loglevel 2 # # digi モードのとき、実際の TNC のパラメーターは param を使って行なう。 # #param 1 20 # # ブロードキャストアドレスの指定。ここに挙げられたアドレスへのフレーム # は、ブロードキャスト可能とされる全ての経路に転送される。 # broadcast QST-0 NODES-0 # # AX.25 経路の指定。必要なだけ指定できる。 # 書式は route (コールサイン[ワイルドカード指定可能]) (相手先IP) # SSID 0 を指定すると全ての SSID の指定と同じ。 # # route <destcall> <destaddr> [フラッグ] # # 指定可能なフラッグ: # b - この経路でのブロードキャストの送信を許可する # d - この経路がデフォルト # route vk2sut-0 44.136.8.68 b route vk5xxx 44.136.188.221 b route vk2abc 44.1.1.1 # # |
# /etc/ax25/axports # axip VK2KTJ-13 9600 256 AXIP port # |
/usr/sbin/kissattach /dev/ptyq0 axip 44.135.96.242 |
/usr/sbin/ax25ipd & |
call axip vk5xxx |
「route」コマンドでは AX.25 パケットをカプセル化し て送りたい相手を指定します。 ax25ipd デーモンは、そのインターフェイスからパケッ トを受信すると、送り先コールサインをルーティングテーブルのコールサイン 一つ一つと比較します。 一致するものがあれば、AX.25 パケットは IP データグラムの中にカプセル化 され、指定された IP アドレスのホスト宛に送信されます。
ax25ipd.conf ファイルの route コマンドにはそれぞれ 2 種類のフラッグを指定することができます。 それらの意味は以下の通りです。
キーワード「broadcast」で指定された送り先アドレスに一致す るトラフィックはこの経路を通じて送信される。
いずれの経路にも一致しないパケットはこの経路を通じて送信される。
ブロードキャストフラッグを使えば複数の AXIP 接続先すべてに送るようなイ ンフォメーションの送信が実現できるので、とても便利です。 普通、AXIPの経路はポイント・トゥ・ポイントであり、「ブロードキャスト」 のようなパケットは扱えないものなのです。
NOS の類を使っていたような人の多くは、以前に使っていた機能がまるごと使 えると言う理由で Linux の上でも NOS を動かしたいと思っています。 またその内の大半の人は NOS を経由して Linux の機能を無線ユーザーに解放 するために、NOS が Linux カーネルと通信できるようにしたいと考えています。
Brandon S. Allbery KF8NH は Linux マシン上で稼働している NOS がパイプ デバイスによりどうやってカーネルと双方向接続するかについての情報を寄せ てくれました。
Linux と NOS は共に slip プロトコルをサポートしていますので、slip のリ ンクを作ることによりこれらを接続することができます。 これは二つのシリアルポートをループバックケーブルにより接続することで実 現できますが、通信速度は遅いですしケーブルを購入するお金もかかります。 Linux には他の Unix-like オペレーティングシステム同様「パイプ」と呼ば れる機能があります。 これはソフトウェア側からみると通常の TTY デバイスのようで、実はもう一 方の端が別のパイプデバイスのループバックとなっている特別な仮想デバイス なのです。 このパイプを使うには、まず一つ目のプログラムがパイプのマスター 側をオープンしなければなりません。 続いて二つ目のプログラムがパイプのスレーブ側をオー プンします。 パイプの両端がオープンされると後は各プログラムは普段ターミナルデバイス に書込むのと同様に文字列をパイプに書込むことでお互いに通信することがで きます。
Linux カーネルと NOS あるいは別のプログラムを接続する上でこの機能を使 うには、まず使用するパイプを決めなければなりません。 /dev ディレクトリーを見ればパイプが見つかるでしょう。 パイプのマスター側は ptyq[1-f] という名前で、スレー ブ側は ttyq[1-f] という名前です。 これらはペアーになっていて、マスター側として /dev/ptyqf を選べばスレーブ側では /dev/ttyqf を使用することになります。
使用するパイプデバイスのペアーを選んだら、そのマスター側を Linux カー ネルに、スレーブ側を NOS プログラムに割当てます。 というのも、Linux カーネルの方が先に動いていて、パイプのマスター側は先 にオープンされなければならないからです。 また Linux カーネル側は NOS とは異なる IP アドレスを持っていなければな らないということも憶えておいてください。 もし IP アドレスをまだ割当てていなければ、重複しないアドレスを割当てる 必要があります。
ちょうどシリアルデバイスのようにパイプは扱うことができます。 つまり Linux カーネルから slip でリンクを張るには以下のようなコマンド を使います。
# /sbin/slattach -s 38400 -p slip /dev/ptyqf & # /sbin/ifconfig sl0 broadcast 44.255.255.255 pointopoint 44.70.248.67 / mtu 1536 44.70.4.88 # /sbin/route add 44.70.248.67 sl0 # /sbin/route add -net 44.0.0.0 netmask 255.0.0.0 gw 44.70.248.67 |
この例では Linux カーネルは IP アドレスが 44.70.4.88 であり、一方で NOS プログラムは IP アド レス 44.70.248.67 を使っています。最後の行の route コマンドは Linux カーネルに対して amprnet 宛の全てのデータグラムについて slattach コマンド で作成した slip のリンクを経由するよう指示しています。 通常、再起動時に自動的に slip リンクが作成されるよう、 /etc/rc.d/rc.inet2 の他の全てのネットワーク設定が済 んだ後にこのコマンドを付足しておきます。 注意:slip の代わりに cslip を使うことはパフォーマンスを低下させるだけで意味がありません。 リンクは仮想的なもので十分速いです。 cslip ではヘッダの圧縮を行なわなければなりませんが、 これは圧縮していないデータグラムを送信するより時間のかかることです。
リンクの NOS 側の設定を行なうには、以下のようにします。
# インターフェイスの名前は何でも構いません。 # 私は便宜上「linux」ということにしています。 attach asy ttyqf - slip linux 1024 1024 38400 route addprivate 44.70.4.88 linux |
このコマンドで Linux カーネルと対になるパイプデバイスのスレーブ側に 「linux」という名前の slip ポートが作成されます。 そしてそれに対する経路を設定することで動作するようになります。 NOS を起動したら Linux マシンから NOS 宛に ping したり telnet したり、 またその逆方向もできるようになるでしょう。 もしうまくいかなかったら、設定に間違いがないかもう一度見直してください。 特に正しいアドレスを設定したかどうかや、またパイプデバイスを正しい順番 に設定したかどうか確認してください。