静的ルーティングのお勉強(その2)

昨日の続き。というか、結果。

結論から言えば、単純にルーター2のNAT/IPマスカレード機能が有効になっていた(というか、無効にできない)のが原因だった。

メトリックの設定は今回は関係なし。やっぱり気のせいだった(苦笑)。

昨日、PINGが届かなかったことがどうしても気になって仕方がなかったので、昼間にハードオフに行って野口さん1人相当の中古ルーターを購入してきた次第。

購入してきたルーターは、以前知人からいただいたものの、WAN側のポートの接触不良(※)で使えなかったものと同じ型番(BLR3-TX4)だった。

※今日知ったのだけれど、このルーター(BLR3-TX4)の接触不良の話は割と有名な話だったようで……。

一応、接触不良もなく無事に動いてくれたので、ラッキーだったかも。

NAT/IPマスカレード機能を無効にしたところ、ちゃんとデスクトップPCからラップトップPCまでPINGが届くようになった。

その後、知人からいただいたルーターの接触不良の部分を見てみようと何気なく分解して再び組み立ててみたところ、たまに途切れることがあるけれど、WAN側のポートが反応するようになった。

なんという運命のいたずら。

購入する前に分解してみるべきだったかも。

ルータが増えたので、調子に乗って以下のような構成も試してみたが、全く問題なし。

どのポイント(PC/ルーター/アクセスポイント)からでもPINGはちゃんと届く。

今回の収穫というか覚え書き。

  • ルーターのNAT/IPマスカレード機能の有効/無効の状態を確認。
  • 静的ルーティングの設定は、デフォルトゲートウェイをうまく活かして必要最小限に。

とりあえずNAT/IPマスカレード機能を無効にできないほぼワンコインだったルーターは、処分決定かな。

2010年08月21日(土) 23時19分  

静的ルーティングのお勉強

自宅から一番近いハードオフで格安(525円)で入手して以来、ずっと放置していた中古ルーターの存在を思い出したので、静的ルーティングのお勉強。

ネットワーク構成は、以下の図の通り。

今回は、有線のみでネットワークを構成。

図のうち、ルーター1はISPから提供されているもので、ルーター2がハードオフで入手したもの。

ルーター1には有線ポートが1ポートしかないので、昔購入した無線LANアクセスポイントの有線ポートを使用。

各機器に静的IPアドレスとルーティングの設定をして、早速実験開始。

してみたのだけれど、ルーティングの設定がうまくいっていないのか、PINGがうまく届かない。

具体的な結果は、以下の表の通り。

デスクトップPC(192.168.0.14) → ラップトップPC(192.168.10.14) へのPINGのみ通らないという……。

調査すること小一時間。

ふと、ルーター1にメトリックを設定する欄がなかったことを思い出した、というか気づいた。

無関係だろうか。

怪しいのだけれど、設定欄がない以上設定できないので、検証できない。

もう1台、ハードオフで格安の中古ルーターを買って検証したいところだけれど、

  • 自宅から一番近いハードオフで、全く同じ型の(=メトリックを設定できる)ルーターが入手できる可能性は低い。
  • 違う型のルーターがはずれ(メトリックを設定できないルーター)である可能性は高い気がする。
  • そもそも格安の中古ルーターなので、動作や欠品なしは保証されない。

という理由から、なかなかハードオフまで足を運ぶ気にならない。

中古格安ルーターは、くじ引きに近い。

今回の収穫らしい収穫は、Windowsのネットワークコマンドを1つ新しく覚えたことぐらいかも。

  • ping
  • tracert

あたりは定番中の定番なので、ネットでよく見かけるけど、

  • pathping

というコマンドの存在は初めて知った。

ちなみにpathpingコマンドは、pingコマンドとtracertコマンドを併せたようなコマンドで、なかなか便利かも。

参考

ネットコマンドの使い方

2010年08月20日(金) 22時47分  

Windows上にNFSサーバーを構築する

WindowsとLinuxとの間でファイルを共有したいと思った場合、LinuxにSambaを導入してLinux上に共有フォルダを作成するか、Sambaに含まれているsmbmountコマンドでWindows上の共有フォルダにアクセスする方法がある。

また、samba-clientパッケージを導入すれば、mountコマンドでWindows上の共有フォルダにアクセスするという方法もある。

しかし、今回は、LinuxにSambaやsamba-clientなどのパッケージをせずにWindows上にNFSサーバーを構築することでファイル共有してみた。

今回、Windows上にNFSサーバーを構築する際に使用したのは、Windows  Services for UNIX(以降、SFU)というソフト。

cygwinやMinGWのようにWindows上にUNIXライクな環境を提供してくれるソフトである。調べてみると、2004年に無償化された模様。

SFUの機能や詳細については、以下のリンク先を参照。

【特集】マイクロソフトSFU vs Cygwin – Windows上のUNIX互換環境を徹底比較(1) マイクロソフトの提供するUNIX互換環境SFU (マイコミジャーナル)

@IT:製品レビュー:企業ユーザーのためのSFU 3.5活用ガイダンス 第1回 SFU 3.5の概要とNFS機能

SFUは、以下のサイトからダウンロードできる。

Windows Services for UNIX

SFUのインストールは、インストールウィザードに従いながら途中でカスタムインストールを選択。

コンポーネントの選択では、今回はNFSサーバーの構築が目的なので、

  • NFSクライアント
  • NFSサーバー
  • ユーザー名マッピング
  • NFS認証サーバー

のインストールをオンにし、それ以外はオフに設定。

その後のユーザー名マッピングの項目では、[ローカルユーザー名マッピングサーバー(L)]の[パスワードおよびグループファイル]を選択。

次の画面でパスワードファイルとグループファイルの名前とパスを聞かれるが、後からでも設定できるので、ここでは何も設定せずに次へ。

あとはインストール先を設定すればインストール完了。

再起動を促されるので、指示に従ってPCを再起動。

再起動後、「Services for UNIX の管理」を起動して、各種項目を設定していく。

「NFSサーバー -> クライアントグループ」で、クライアントPCを登録。

「ユーザー名マッピング -> 構成」では、インストール時に設定を省略したパスワードファイルとグループファイルを設定する。

パスワードファイルとグループファイルの内容は、クライアントとなるLinuxのパスワードファイル(/etc/passwd)とグループファイル(/etc/group)をそのままコピーしてくるだけ。

何らかの理由でコピーできない場合は、とりあえず管理者(root)や管理者用一般ユーザーの行だけを抜き出して、テキストエディタで保存すればいい。

grep '^root\|emanon' /etc/passwd
grep '^root\|emanon' /etc/group

「ユーザー名マッピング -> マップ」では、WindowsユーザーとUNIXユーザーのユーザーの紐付けを行なう。

以上まで設定できたら、次は共有フォルダの設定。

SFUをインストールすると、フォルダのプロパティに「NFS 共有」というタブが表示されるようになる。

ここで共有したいフォルダを選択し、[このフォルダを共有する]をオンにして、共有名とエンコードを設定する。

続いて、[アクセス権(P)]をクリックして、適宜アクセス権を設定する。

NFS共有の設定は、ここまで。

最後に、NFS共有がきちんとできるかどうかテスト。NFS共有フォルダ(d:/share/)には、以下のようなテキストファイルを用意してみた。

さて、クライアント(Linux)からマウントしてみよう。

マウントできました。

けれどもただ一つ、欠点が……。

Windows上のNFSサーバーをマウントする際、クライアントPCと接続しているローカルエリア接続の「Windowsファイアウォール」を無効にしなければならないということ。

この点については、CygwinでNFSサーバーを構築しても同様なのだけれども……。

一応、マイクロソフト サポート オンラインの「UNIX 3. 5 の Windows サービスにアクセスできるようにする」を参考にポートを開放してみたけれども、設定をミスったのかマウントすることができなかった。

LinuxのNFSサーバーのように、ある程度開放するポートを固定できないかなぁ。

まあ、ファイアウォールを越えてのNFSマウントは、昔から一筋縄ではいかないようで……。

2010年08月01日(日) 22時38分  

SFUとCygWinのNFSサーバーの共存

覚え書き。

Windows Services for UNIX(以降SFU)かCygwinのnfs-serverのどちらかがインストール済みである場合、SFUのportmapとCygwinのportmapとが競合してサービスの登録や起動に失敗するので、注意が必要。

SFUが使用しているサービス

  • User Name Mapping
  • Server for NFS
  • Client for NFS

Cygwinが使用しているサービス

  • Cygwin portmap
  • Cygwin nfsd
  • Cygwin mountd

2010年07月31日(土) 23時26分  

コマンドプロンプトのコマンドライン文字列の制限

メモ書き。

コマンド プロンプト (Cmd.exe) のコマンド ライン文字列の制限より。

Microsoft Windows XP 以降を実行しているコンピュータでは、コマンド プロンプトで使用できる文字列の最大長は 8191 文字です。Microsoft Windows 2000 または Windows NT 4.0 を実行しているコンピュータでは、コマンド プロンプトで使用できる文字列の最大長は 2047 文字です。

文字数=バイト数。

2010年06月26日(土) 21時08分  

制限付きユーザーから管理者のユーザー権限でプログラムを実行する

Windowsに制限付きユーザーでログインしている時に管理者のユーザー権限でプログラムを実行したい場合、コンテキストメニューから「別のユーザーとして実行(A)…」を選択するか、runasコマンドを使う。

runasコマンドの基本的な使い方は、以下の通り。

runas /user:ユーザー名 プログラム

詳しい使い方はrunas /?に譲るとして、大抵の場合、管理者のユーザー権限でプログラムを実行したい場合は、ユーザーのパスワードの入力が必要となる。

JScriptを使って管理者のユーザー権限でプログラムを実行し、パスワードを自動的に入力したい場合は、以下のようなスクリプトになる。

var userFile = "user.txt";
var passFile = "pass.txt";
var args = WScript.Arguments;

if (args.length != 1) {
    WScript.Quit(1);
}

var AppPath		= args(0);
var AppExecUserName	= getTextFileData(userFile);
var AppExecUserPass	= getTextFileData(passFile);

//実行したいプログラムを指定する。
//runasコマンドのコマンドラインオプションは、"runas /?"を参照
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("runas /user:" + AppExecUserName + " " + AppPath + " ", 2);
//savecred
delayedSendKeys(AppExecUserPass);

//実行するパスワードを送信
function delayedSendKeys(str) {
    WScript.Sleep(300);
    for (var i = 0; i < str.length; i++) {
        WScript.Sleep(100);
        WshShell.SendKeys(str.substring(i, i + 1));
    }
    WScript.Sleep(300);
    WshShell.SendKeys("{enter}");
}

function getTextFileData(fileName) {
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var s = fso.OpenTextFile(fileName, 1, false).ReadAll();
    return s;
}

パスワードの自動入力は、SendKeysで行なっている。

このスクリプトを使うと、管理者のユーザー権限とパスワードが設定済みならば、制限付きユーザーであってもほぼ何でも実行できてしまうようになるので、スクリプトの取り扱い(特に利用環境)とパスワードの漏洩には十分に注意しましょう。使用する場合は、自己責任で。

このJScriptを一歩進めてExcelVBAで実装してみると、以下のような感じになった。

パスワードの管理がほんの少しだけましになるけれど、やっぱり取り扱いには十分な注意が必要。

2010年03月13日(土) 23時53分  

タスクをコマンドプロンプトから登録する

昨日の続きのようなもの。

タスクをコマンドプロンプトから登録する方法。

以下は、バッチファイルを15分毎に実行するよう、タスクに設定する例。

schtasks /create /tn "beacon" /tr "C:\mytask.bat" /sc minute /mo 15 /st 00:00:00 /sd 2009/07/01

登録したタスクの削除は、

schtasks /delete /tn "beacon"

となる。

参考:

タスクをコマンドプロンプトから登録する理由は、次回以降の同様のタスクの再設定にかかる時間を短縮するためである。

バッチファイルとして保存しておけば、いろいろ使い回しが効いて便利。

2009年07月05日(日) 23時13分  

タスクを非表示で実行する

WindowsでPerlなどで記述したスクリプトをバッチプログラムで定期的に実行させる場合、ウィンドウは最小化して非表示にすることはできても、タスクボタンは実行が終了するまでの間(たとえ一瞬でも)どうしてもタスクバーに表示されてしまう。

自分の操作とは無関係に定期的にタスクボタンやウィンドウが一瞬表示されたりすると、気になってなかなか作業に集中できないことが多い。

というわけで少し調べてみたところ、以下のようなVBScriptを記述すれば、バッチプログラムのような定期実行されるプログラムのタスクボタンを非表示にすることができることがわかった。

hidetask.vbs

Dim ws
Set ws = CreateObject("WScript.Shell")
ws.run "C:\mytask.bat", vbhide

あとはこのVBScriptを使ってタスクを登録し直せば、タスクボタンが表示されないバッチプログラムの完成。

2009年07月04日(土) 23時31分  

コマンドプロンプトで文字を自動的に入力する

コマンドプロンプトで実行したコマンドに文字を自動的に入力するには、echoコマンドを使用するとよい。

使い方は、以下の例の通り。

echo y | del *.*

なお、使う場所やコマンドによっては危険どころか取り返しがつかなくなるので要注意。

例えば……いや、上記の例から十分想像できると思うので、やめておこう。

2008年01月13日(日) 23時51分  

マウスからコマンドプロンプトを起動

マウスで選択したディレクトリをカレントディレクトリとしてコマンドプロンプトを起動する方法。

レジストリの値を編集したりソフトをインストールすれば簡単にできるようになるが、実はバッチファイルとショートカットだけで簡単に実現できる。

まず、バッチファイル(cmd.bat)を、環境変数PATHの通ったディレクトリ上(C:\など)に作成する。

cmd.bat

@rem 選択したディレクトリをカレントディレクトリとしてコマンドプロンプトを起動する。
@%SystemRoot%\system32\cmd.exe /K "%~d1&&cd %1"

cmd.batを作成したら、cmd.batのショートカットを%USERPROFILE%\SendTo以下に作成する。

ショートカットの名前は、適宜わかりやすいものに変更したほうが良いでしょう。

以下の例では「コマンド プロンプトを開く」へ名前を変更。

あとは通常通りコマンドプロンプトを起動したいフォルダ(ディレクトリ)の上でマウス右クリックを押下し、コンテキストメニューを表示して先ほど作成した「コマンド プロンプトを開く」を選択するだけ。

以上、CGIの動作確認をする時によく利用していた方法でした。

2008年01月12日(土) 23時21分