フレッツADSL導入日誌

FreeBSDルーター編

導入編
>>> FreeBSDルーター編
ローカルDNSサーバー
フレッツADSLで固定IP
ドメイン取得とDNS運用
メールサーバー
Webサーバー

23 May 2004 自動復旧システムを追加。
15 Mar 2003 ファイアウォールとIRCのDCC SEND(nat punch_fwの説明)を完成させる。
22 Apr 2002 ファイアウォール関係の記事を追加。
15 Apr 2002 新規公開。
汎用機ルーター

 メリットは小技が使えること。ファイアウォールもきちんとしたものが付属しているし、ファイルサーバーやプリンタサーバーにもなるし、FTP・HTTPサーバーにもできるし、CGIだって運用できるし、IRCのDCC SEND(Chocoaなんかのファイル転送機能で使用される)用のマスカレードルールを追加するのも簡単。ドメインを取得し、固定IPで運用できれば、メールサーバーを自前で立てることも可能である。

 デメリットは設定が面倒くさい、クラッシュするとこれまた面倒、停電対策が必要、セキュリティにも気を使う必要がある、コンセントが余計に必要、など。
機種選定

 新たにマシンを買うのはもったいないので、その辺に転がっているマシンを使うとよい。FreeBSDに限らず、フリーのOSは最新ハードウェアデバイスへの対応が遅れる傾向にあるので、使い古したくらいのマシンがよい。掲示板サーバーとか検索サーバーに仕立て上げるのでなければ、パワーもそんなに要らない。

 LAN I/Fは二つあると楽なことは楽である。LAN内蔵の機種にLANカードを挿すといった形態も考えられるが、実際には一つでも運用できる。ということで、そこら辺に余っていたLibretto 20(486DX4 75MHz 8MB+12MB)に8.1GBのHDDを入れ、ルーターに仕立て上げることにする。ノートは2.5インチHDDの信頼性から敬遠する人もいるが、停電してもバッテリーバックアップが効くという利点もある(バッテリーは時々点検すること :-) )。
接続

 LibrettoにはPCカードの口が一つしかついていないため、挿せるネットワークカード(NIC)は1枚である。ISDNの場合はTAをRS-232Cで接続すればよかったが、ADSLの場合はADSLモデムも10Base-Tを使う。素直な接続方法はNICを二枚挿し、片方にADSLモデム・もう一方にLAN用のハブという形態だが、今回はそういう形態は取れないので、ADSLモデムもハブにつないでしまう

 ADSLモデムをハブにつなぐ場合は接続法に注意しなければならない。もし、ADSLとPCをストレートケーブルでつないでいた場合は、

 a: ストレートケーブルでハブのカスケードポート
 b: クロスケーブルでハブの普通のポートへ

のどちらかの接続方法になる。ADSLモデムとPCをクロスケーブルでつないでいた場合は反対の組み合わせになり、

 c: ストレートケーブルでハブの普通のポートへ
 d: クロスケーブルでハブのカスケードポート

のどちらかになる。

 我が家の場合はストレートケーブルで直結していたので、a: の「ストレートケーブルでハブのカスケードポートへ」接続する方法をとった。もっとも、最近はモデム・ハブとも自動判別になっていることも多い。その場合は何も考えずにつなげばOK。

Libretto 20 FreeBSDルーターの配線



OSのインストール

 指示に従ってインストールする。ここではFreeBSD 4.5Rをインストールした(その後、FreeBSD 4.7Rにした)。Libretto 20にはフロッピーディスクドライブが標準ではついてこないので、HDDを他の機械(うちの場合はSatellite Pro 420CDT)に移してからインストールする必要がある。また、何かの拍子にサスペンドするとハイバネーションに入ってファイルシステムが壊れる恐れがあるため、ハイバネーション領域をうまく避ける必要がある。

 FreeBSDをフロッピーディスクから立ち上げてCD-ROMからインストールする場合は、フロッピーディスクを二枚(カーネルとミニルートファイルシステム)つくり、ブートさせる。しばらくすると二枚目を要求されるので、二枚目を放り込んで[Enter]を押す。あとは適当に指示に従ってインストールする。インストールのオプションはDeveloperを選んでおいた。インストールが終わったら、とりあえずネットワークの設定を済ませておく。ノートPCの場合、/stand/sysinstallでPCカードを有効にする必要があるかもしれない。
pppでADSL接続する

 フレッツADSLはPPPoEという方法を使っているため、接続にはPPPデーモンを使う。PPPoEを使うためにはnetgraphモジュールが組み込まれていなければならないが、GENERICカーネルでは組み込まれていないため、カーネルをリビルドするか、kldloadでnetgraph.oをロードする必要がある。kldloadはカーネルがセキュアモードになっていると使えないので注意。

 netgraphが組み込まれたらpppの設定ファイルを作る。/etc/ppp/ppp.confというファイルで存在しているはずなので、必要な部分を編集する。deviceにはPPPoE:ep0などを指定する。ep0の部分はADSLモデムまで到達可能なインターフェースデバイス名を指定する。authnameとauthkeyにフレッツADSL接続に必要なユーザー名とパスワードを書く。パスワードは暗号化されないので、ppp.confのパーミッションには十分注意する必要がある。あとは必要に応じてnat enable yes、nat use_socket yesなどを書き込んでおく。サンプルではその下にさらにセクションがあるが、複数の接続先を切り替えないのであればこれで十分である。だいたい以下のようになるだろう。
default:
  ident user-ppp VERSION (built COMPILATIONDATE)
  set device PPPoE:ep0
  set mru 1454
  set mtu 1454
  set authname login@user.name.here
  set authkey passwordhere
  set log Phase Chat LCP IPCP CCP tun command
  set dial
  set login
  set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
  add default HISADDR  # Add a (sticky) default route
  enable dns           # request DNS info (for resolv.conf)
  nat enable yes
  nat use_sockets yes
 できあがったらpppを起動する。起動したらifconfigでtun0にIPアドレスがちゃんと割り当てられているか確認する。大丈夫ならばpingを打って、きちんと接続が確立しているか確認しておく。/stand/sysinstallなどでこのマシンをゲートウェイとして使用する設定にしてあれば、適切にゲートウェイさえ設定すればLAN内の他クライアントからも外と通信できるはずである。

 pppが正常に動き出すとnetgraphから必要なカーネルモジュールが自動的に読み込まれる。これはkldstatで確認できる。カーネルをセキュアモードに戻してしまうと、これらのモジュールをロードできなくなってしまう。カーネルがセキュアモードになる前に、kldstatで表示されたモジュールをrc.confあたりでロードする必要がある。多分、netgraph・ng_ether・ng_socket・ng_pppoeの4つだろう。ppp立ち上げより後でロードしても今のところは正常に動くようだ。

 最後に、/etc/rc.confを編集し、
ppp_enable="YES"
ppp_mode="ddial"
ppp_nat="YES"
ppp_profile="default"
と書いてリブートし、起動時にpppが立ち上がっているか確認する。ちなみに、rc.confで有効なオプション類はman rc.confに書いてある。デフォルト値は/etc/defaults/rc.confを見ると分かる。
起動サービスの見直し

 デフォルトではいくつかのサービスが動いている。逆に、有用と思われるサービスで動いていないものもある。セキュリティーホールを作らないためにも動いているサービスを確認した方がよい。一般的には起動サービスを確認するプログラムなどがある(OSによって異なる)のでそれを用いて要らない/知らないサービスは止める。Unix系の場合はinetdあるいはxinetdの設定を確認する。

 FreeBSDの場合、確認する場所は主に3つ。うち2つは/stand/sysinstallの中である。sysinstallを立ち上げたら、Configureを選ぶ。メニューの中にNetworkingとStartupというのがあるのでこの二つを確認する。まずはNetworkingから。NFSは構内で使う必要がなければ止めたほうがよい。portmapはNFSが要らないのなら普通は要らない。Sendmailは設定がよく分からないと迷惑を撒き散らすので、分かっている人以外は止める(あとでsendmailの代わりになるqmailの説明をする予定)。FreeBSD 4.7Rの/stand/sysinstallでは、完全にsendmailを止める指示を出しても実際にはそうならない。そこで、/etc/rc.conf を見て、sendmail_enable= という行を下の方から探し、= の右側に "NONE" と書いておく。

 既に動いていて、そのままにしておくのはinetdとsshdくらいであろう。なお、FreeBSD4.5のICMP echoとssh系にはセキュリティホールが発見されているので注意のこと。Gatewayは必要に応じて設定する。Ntpdateは時計を調整してくれるプログラムである。これも必要に応じて設定するとよい(他にxntpdというのもある。どこかで説明する予定)。Startupの方はあまり重要なものは入っていないが、namedは分からないうちは動かさない方がよい。

 あとは/etc/inetd.confを確認する。ほとんどのサービスは要らないはずだ。telnetはsshに置き換えるべきである。動かすにしてもhosts.allowでローカルに制限しておくべきだろう。ftpもよくクラックの対象になるので注意が必要。
ファイアウォールの設定

 ipfwを使う方法とpppのfilterを使う方法がある。ipfwはカーネルが扱うインターフェース全部に影響を及ぼし、ルール数も多く作れ、条件やダイナミックルールなどもpppより高機能である。pppのfilterはipfwよりかなり簡易的なもので、pppによるデータのみに影響を与える。本格的なファイアウォールを作るためにはipfwが必要だが、単に外とのデータのやりとりを制限したい場合はpppのfilterの方が楽。ここではipfwを使って設定してみる。

 ipfwはコマンドラインから動的に設定もできる。しかし、telnetなどで操作している場合は間違って内部ネットワークを遮断してしまうと、サーバーまで走ることになる(涙)。できればコンソールでやった方がよい。

 ファイアウォールを有効にするには、rc.confに
firewall_enable="YES"
firewall_type="OPEN" # とりあえず
と書き込んでリブートする。NICがPCカードの人は、
pccardd_flags="-z"
も書いておくとよい。こう書いておくとpccarddにオプション-zが渡され、pccardd起動時にPCカードが挿入されていた場合、その設定が終わるまでpccarddはフォアグランドの制御を握りつづけるようになる。pccarddの実行が終わったときには確実にNICが有効になっている。

 firewall_typeにOPENを指定するとオープンなファイアウォールが設定される。ファイアウォールは/etc/rc.firewallで設定され、firewall_typeにはこの他にCLIENT・SIMPLEなどがある。サーバーとして使うマシンにはSIMPLEが適当だが、CLIENT・SIMPLEを使う場合はrc.firewallに直接IPアドレスとインターフェースが書かれているため、該当部分を書き換えなければならない。

 これはちょっとつまらないので、他の方法を使ってみる。ipfwは引数としてファイル名を取ることができ、中身はipfw listで表示されるものをそのまま入れておけばよい。そして、firewall_typeにこのファイルをフルパスで指定すると、rc.firewallはこのファイルをipfwに渡す。したがって、/etc/ipfwを作ってrc.confの中でfirewall_type="/etc/ipfw.conf"としてリブートすれば、オリジナルのルールでファイアウォールが設定される。

 rc.firewallの雛型はrc.firewallのSIMPLEタイプのファイアウォールルールを使う。/etc/rc.firewallを自分のホームディレクトリあたりにコピーしておく。コピーしたrc.firewallをエディタなどで開き、rc.confを読み込んだあとに firewall_type="SIMPLE"と書いておく。さらに、fwcmdという変数(ipfwがフルパスで指定されている)をechoに書き換える

 WAN側のネットワーク情報をoif/onet/omask/oipという変数で、LAN側をiif/inet/imask/iipという変数で定義している部分があるので適切に書き換える。LAN側は問題ないと思うが、WAN側はPPP接続だとIPアドレスは固定ではないのが普通なので、oipはmeにしておく(便利)。onetとomaskが困ったちゃんだが、後で出力を編集するつもりなので、分かりやすいようにonetとomaskと定義しておく。LAN側はFreeBSDマシンのIPアドレスが192.168.1.1で、ネットワークは192.168.1.0/24だとする。インタフェースも適切に設定する。
# set these to your outside interface network and netmask and ip
oif="tun0"
onet="onet"
omask="omask"
oip="me"

# set these to your inside interface network and netmask and ip
iif="ep0"
inet="192.168.1.0"
imask="255.255.255.0"
iip="192.168.1.1"
 この状態でrc.firewallをシェルに渡すとファイアウォールルールがそっくりそのまま書き出される
$ sh rc.firewall
-f flush
add 100 pass all from any to any via lo0
add 200 deny all from any to 127.0.0.0/8
add 300 deny ip from 127.0.0.0/8 to any
add deny all from 192.168.1.0:255.255.255.0 to any in via tun0 # 0
add deny all from onet:omask to any in via ep0 # 1
add deny all from any to 10.0.0.0/8 via tun0
add deny all from any to 172.16.0.0/12 via tun0
add deny all from any to 192.168.0.0/16 via tun0 # 2
add deny all from any to 0.0.0.0/8 via tun0
add deny all from any to 169.254.0.0/16 via tun0
add deny all from any to 192.0.2.0/24 via tun0
add deny all from any to 224.0.0.0/4 via tun0
add deny all from any to 240.0.0.0/4 via tun0
add deny all from 10.0.0.0/8 to any via tun0
add deny all from 172.16.0.0/12 to any via tun0
add deny all from 192.168.0.0/16 to any via tun0 # 3
add deny all from 0.0.0.0/8 to any via tun0
add deny all from 169.254.0.0/16 to any via tun0
add deny all from 192.0.2.0/24 to any via tun0
add deny all from 224.0.0.0/4 to any via tun0
add deny all from 240.0.0.0/4 to any via tun0
add pass tcp from any to any established
add pass all from any to any frag
add pass tcp from any to me 25 setup # 4
add pass tcp from any to me 53 setup # 4
add pass udp from any to me 53 # 4
add pass udp from me 53 to any # 4
add pass tcp from any to me 80 setup # 4
add deny log tcp from any to any in via tun0 setup # 5
add pass tcp from any to any setup # 6
add pass udp from me to any 53 keep-state # 7
add pass udp from me to any 123 keep-state # 7
$
 これをリダイレクトして編集する。最初の4行はrc.firewallで勝手に設定されるので削除する。onet/omaskの入っている#1は「LAN側IFから来たWAN側アドレスのパケットの禁止」という意味なので、「LAN側から来たLAN側アドレスではないパケットの禁止」と読み替えることにする。
add deny all from not 192.168.2.0/24 to any in via ep0 # 1
 また、pppでNATを行う場合はマズい部分があるので修正する。NATを行う場合、LAN側では例えば192.168.1.0/24などのネットワークアドレスを使うと思うが、そうすると「#2」「#3」のルールに引っかかってパケットが通らなくなる。ここは方向まで指定して、
add deny all from any to 192.168.0.0/16 out via tun0 # 2
add deny all from 192.168.0.0/16 to any in via tun0 # 3
とする。で、よく見ると#3は#0を包含するので、#0を消す。

 あとはお好みに応じて「#4」以降を書き換える(穴を開ける)。穴の開け方はICMP・TCP・UDPで戦略が異なる。まず、ICMPだが、pingもtracerouteも通したくなければ放っておいてよい。ただし、落としてしまうとパケットのサイズを調節するためのICMPメッセージも落ちるため、正常に通信できなくなる可能性もある。そういう場合はICMPを許可した方がよい。

 TCPの場合にはコネクションが確立しているパケットは通る設定になっているため、中からコネクションを確立しようとしているパケットと、公開しているサービスに外からコネクションを確立しようとしているパケットを通す。コネクションが確立すれば前述のルールで必要なパケットが通るようになる。

 UDPの場合はコネクションという考え方がないため、まず、必要なパケットを通し、必要なパケットが到着したときにその逆向きのパケットをある一定時間許可する、という戦略をとる。そのためにはkeep-stateというオプションを使う。DNSやNTPがこのサービスに相当する。

 「#4」は外に対して公開するサービスに対する設定である。「#5」はそれ以外のWAN側からのTCPアクセスを拒否している。残りのTCPアクセスはLAN側からのものなので「#6」で許可する。「#7」はLAN内ホストがUDPで外のホストと通信するための例である。pppでNATを行う場合はLANのネットワークアドレスに対するルールを追加する必要がある。
add pass udp from me to any 53 keep-state # 7
add pass udp from 192.168.1.0/24 to any 53 keep-state # 追加
add pass udp from me to any 123 keep-state # 7
add pass udp from 192.168.1.0/24 to any 123 keep-state # 追加
 絶対に必要なのはDNSに対するルール(「#7」のポート53)だろう。ルールにヒットしなかったものは、デフォルトの設定ではすべて拒否されるようになっている。

 編集が終わったら、スーパーユーザーになって/etc/ipfw.confにコピーし、rc.confを編集し、firewall_type="/etc/ipfw.conf"としてリブートする。一通りLAN内の各クライアントから通信して、ファイアウォールが正常に動作しているかチェックする。

 注意をいくつか。まず、LAN内からFTPを使う場合。データ転送のTCPコネクションはサーバーからクライアントに向かって張られる。これはファイアウォールで落とされてしまうので、何も細工をしないとデータ転送ができない。Unix系のFTPの場合はPassive FTPを使えば解決するが、Windows系はPassive FTPはできないことが多いので、ファイアウォール側で対応しなければならない。具体的にはソースポートが20のWAN側からのコネクションを許可するか、libaliasの動的穴開けを使う。IRCのDCC SENDにも同様の問題が存在するが、これはlibaliasの動的穴開けと共に後述する。

 次にファイアウォールサーバ上でDHCPサーバーも動かしている場合。クライアントが最初にパケットを送る時にはまだIPアドレスが決まっていない。普通、ソースアドレス0.0.0.0のパケットがクライアントからブロードキャストされる。このパケットを通さないとDHCPが機能しない。具体的には、ソースアドレスが0.0.0.0で、デスティネーションポートが67の、LAN側IFを通るUDPパケットを通すようにする。このルール、実は#1(を書き換えたルール)とバッティングする。従って、#1よりも前に書かなければならない。

 UnixのtracerouteはUDPパケットを放つため、Unixでtracerouteを使えるようにするためには自ネットワークから外へのUDPパケットを許可しなければならない。また、ICMP time exceeded / port unreachableも使うため、ICMPも許可しておかなければならない。tcpの#6に対するルールがUDPにはないため、UDPで何かしたい時には相応のルールを書く必要がある。

 明示的に禁止しておいた方がよいパケットもある。よく知られているのはソースルートオプションのついたパケットと、NetBIOS(マイクロソフトネットワーク共有サービス)関係だろう。前者はipfwでipoptionsを指定すると落とせる。後者はWAN側IFを通るTCP/UDPのポート137/138/139のパケットを落とせばよい。実際には特権が必要なポート(1024未満のポート)をまとめて落として、残りを許可するようにするのが楽だろう。

 メールサーバーによってはauth(ident)サービスを送って来るものがあり、これをdeny(ドロップ)しているとタイムアウトになるまで待たされることがある。明示的にresetと指定すればこのような事はなくなる。
ファイアウォールとログ

 ipfw.confの中に「log」と書いてる部分がある。これはもちろんログを出すための指令だが、これだけではログは出ない。ログを出すにはrc.confの中でfirewall_logging="YES"としてリブートする。ログは通常/var/log/securityに出る。
ファイアウォールとIRCのDCC SEND

 pppはNATを有効にしておくと、IRCのDCC SEND(Chocoaなどのファイル転送機能で使用される)のためのパケット書き換えをやってくれる。従って、ファイアウォールがなければIRCのDCC SENDはLAN内クライアントから問題なく使える。しかし、ファイアウォールがあると外からの接続がipfwではじかれるため、いくらpppが対応していてもだめである。

 LAN内クライアントで余計な設定をしてもよいという向きには、固定的に穴をあけて対応する方法もあるが、自然に使いたい場合は小細工をする必要がある。FreeBSD 4.5まではIRCのDCC SENDをFirewallを通過させるためにはpppにパッチを当てる必要があったが、FreeBSD 4.7以降ではppp.confでnat punch_fwを使えばOK。

 nat punch_fw は、引数としてipfwのベースルール番号と、使うルール数を指定する。DCC SENDはTCPを使って行われるため、setupパケットが通ればestablishedパケットを通すルールで通信が成立する。従って、前例の #5 で示しているsetupパケットを落としている部分の前にpppが生成するルールが入るようにすれば、DCC SENDが通るようになる。

 ファイアウォールルールを読み込んでからipfw listでルール番号を調べてもよいが、ルールの数が変わるとルール番号が変わってしまうので、ルール番号を明示的に指定しておくとよい。
add deny 30000 log tcp from any to any in via tun0 setup # 5'
 このようにして、ppp.confに
  nat punch_fw 29000 1000
と書いておけば、pppが自動的に生成するルールは29000番〜29999番になり、TCP setupパケットを拒否するパケットは30000番に固定されるので、きちんと動作するようになる。この処置を行えば、FTP用のパケットも自動的に通るようになる。

 設定が終わったら、試しにFTPやDCC SENDを実行しつつ、ipfw listでルールが生成されているか確認するとよい。
自動復旧システム

 上位回線が突然メンテされると接続が復旧しないことがある。コンソールやLANからログインできれば簡単に復旧できるが、遠隔ホストや外出先などでWANからログインしなければ復旧できない場合、WAN回線が落ちているわけだから復旧以前にログインができない。つまり復旧もできない。できれば自動復旧システムを作っておいた方がよい。

 自動復旧は「一定時間ごとに接続をチェックし、落ちていたらpppに再接続を指示する」ことで実現できる。一定時間ごとにチェックするにはシェルスクリプトを作ってcronから起動すればよい。接続のチェックはPPPのpeerに向かってpingを打てばよく、pingコマンドは応答があれば0を、なければ0以外を返すので、シェルコマンドのifで判別ができる。peerのアドレスはifconfigの結果を細工するか、pppが接続を確立したときにHISADDRをファイルに吐き出すような接続スクリプトを書けばよい。再接続はcloseしてdialだが、pppを-ddial(専用線接続モード)で起動している場合、closeだけ指示すれば勝手に再接続される。既に起動しているpppに指示を出すにはpppctlを使う。

 とりあえず、pppctlが使えるようにする。ppp.confに以下の設定を加える。説明の都合、mainというラベルをつけておく。
main:
 set server /var/run/ppp/main "" 077
/var/run/ppp/main はUnixドメインソケットを作る場所、"" はパスワードだがこの例ではなしになっている。077はソケットを作る際のumaskで、この場合だとパーミッション700でソケットができる。pppを一度killし、ppp -ddial -nat mainで立ち上げ直す。pppctl /var/run/ppp/main とすると、pppのプロンプトが出るはず。ソケットはフルパスで指定する。pppをddialモードで立ち上げいる場合、pppctlのプロンプトでcloseと打つと、一度接続が切れて、再度接続に行くはずである。

 シェルスクリプト内でpppctlを使う場合、プロンプトを出さないようにしなければならない。これは、pppのコマンドを、pppctlのコマンドラインで指定してしまえばよい。試しに次のように実行し、挙動を確認してみるとよい(/var/log/ppp.log を見るとよい)。
# pppctl /var/run/ppp/main close
ちなみに、あらかじめISPのメンテ予定が分かっている場合は、atコマンドでメンテ終了後にpppctlが実行されるようにすればよい。たとえば、8月10日午前2時にメンテ終了ならば、そのちょっと後の2時10分くらいに再接続が起きるように、
# echo 'pppctl /var/run/ppp/main close' | at 0210 aug 10
としておけばよい。

 緊急メンテに自動で対応するには、リンクを検査するスクリプトを作り、cronから実行する。リンクが正常かどうかはpppの相手(ifconfigで-->の右に出るIPアドレス)にpingを打ってみればよい。このアドレスはifconfigの出力をsedでごにょごにょして作る方法もあるが、pppが接続を確立すると /etc/ppp/ppp.linkup というpppスクリプトが実行されるのと、pppスクリプト内ではHISADDRが接続相手のIPアドレスを示すことを利用して、次のような /etc/ppp/ppp.linkup を書くと楽である。
main:
 bg /bin/sh -c "echo HISADDR > /var/run/ppp/main.peer"
一度pppの接続を切ると(ddialだと自動的に再接続するので)/var/run/ppp/main.peer ができあがるはずである。これを利用してシェルスクリプトを書く。例えば、/etc/ppp/checklink として作る。実行パーミッションを立てる。
#!/bin/sh
pppctl_socket=/var/run/ppp/main
peer_ip_file=/var/run/ppp/main.peer
if [ -S $pppctl_socket -a -s $peer_ip_file ]; then
  ping -c 5 -t 6 `cat $peer_ip_file` > /dev/null
  if [ "$?" = "0" ]; then
    exit 0
  fi
  echo ppp/checklink: try to recover link
  pppctl $pppctl_socket close
fi
ifの-SはUnixドメインソケットの場合に真になる。-aはandの意味で、-sはファイルサイズが0以上の場合に真である。pingの-cはpingを打つ回数、-tはタイムアウト秒数である(ちなみにping間隔は-i)。pingは少なくとも1つ応答が得られれば0を返す。よって、全体としては5個pingを打って、6秒待っても一つも応答が得られなかった場合にppp接続をやりなおすという意味になる。ちなみに、echoが実行されるとcronがメールをくれるので、メールをチェックしていると再接続されたことが分かる。

 あとはこれを/etc/crontabに放り込めばよい。
2-59/5  *       *       *       *       root    /etc/ppp/checklink
この例だと毎時2分から5分おきにリンクがチェックされ、もし接続が落ちていれば再接続されるはずである。あとは気長にメンテがあるまで待とう(笑)。ちなみに、再接続が起きるとpeerのIPアドレスファイルが作り直されるから、このファイルのタイムスタンプを見ると最後に再接続した時刻が分かる。periodicで報告させてもよいだろう。
2つの接続先に自動同時接続

要するにプロバイダとフレッツスクウェアを意識せずに同時に使う方法。工事中。

Copyright (C) 2006-2015 akamoz.jp

$Id: freebsd.htm,v 1.8 2015/12/27 13:42:26 you Exp $