2014年12月31日水曜日

一方からpingが通るが逆方向からはpingが通らない問題

ネットワークの疎通できない問題で、たまに遭遇してしまうタイトルの件。トラブルシュートの方法をまとめておく。

状況説明

以下のように、一方のサーバーAからはpingが通るのにもう一方のサーバーBからはpingが通らないという事象。以下の文章では、この例を用いて説明を行う。

○:[サーバーA] ---> [ルーター(DGW)] ---> [サーバーB]
×:[サーバーA] <--- [ルーター(DGW)] <--- [サーバーB]

一見するとpingはecho requestを送信して、requestを受け取った相手サーバーからecho replyをもらうという動作(つまり相手サーバーまで到達して帰ってくるイメージ)なので、片方通ればもう片方も問題なく通ってしまうと考えがち。

トラブルシュート

例で示した内容であれば、まず間違いなく「サーバーA」側に問題があるが、以下の通り順番に確認を取っていく。

①Windowsの場合は、Windowsファイアーウォールを無効化する(Linuxの場合も同様にiptables等を無効化する)

②「①」で復旧しない場合、ルーティングを確認する。デフォルトゲートウェイやstatic routeを入れている場合はその設定が正しいか確認する。特にサーバーが複数NICを持っている場合は、正しいNICから戻りパケットが出力されるようルーティング設定がされているかを確認する

③「①」「②」で復旧しない場合、DGWとなっている機器(ルーター・L3スイッチ)からpingを飛ばしてみたり、ArpテーブルやMAC Addressテーブルに正しく双方の機器が登録されていることを確認する。またaccess-list等でアクセス制御をしている場合はルールのチェックも行う

④以上全てで問題が無いのにpingが通らない場合、別の機器を同一ネットワークに繋ぐ等して切り分けを進めるしか無い


WIndows コマンドでのIPアドレスを変更する方法

Windows 7以降は、コントロールパネルからネットワークアダプターの設定まで辿り着くまでが大変になった印象がある。そのため、特にIPアドレスを頻繁に変える必要のある作業を行う際はとても面倒で非効率となってしまうことがあった。

なので、コマンドをバッチファイル化しておくことでダブルクリックでIPアドレスが変更できるようになるので、効率化が可能となる。

コマンド

コマンド書式は以下の通り。"ローカル エリア接続"はネットワークアダプタ名を指定すること。

netsh interface ip set address "ローカル エリア接続" static <address> <subnet> <gateway>

例:netsh interface ip set address "ローカル エリア接続" static 192.168.33.2 255.255.255.0 192.168.33.1

DHCPに設定するには以下コマンド。

netsh interface ip set address "ローカル エリア接続" dhcp

上記を実施すればDNSもDHCP取得になるが、DNSだけdhcp取得に設定するコマンドもある。

netsh interface ip set dns "ローカル エリア接続" dhcp

Windows 8.1からの電源管理

最近Windowsタブレットを購入した時にスリープや休止状態ができたりできなくなったりした際に調べた備忘。

種類と違い

違いは以下の通り。
  • スリープ:メモリ状態維持のための最低限の電源状態での稼働を維持
  • 休止状態:メモリを退避のためのファイル(C:\hiberfil.sys)に退避し完全にパワーオフ
  • 高速シャットダウン:Windows 8.1からの新機能。休止状態同様、必要なメモリ情報を退避してからシャットダウンすることで次回起動を早める。ただし、シャットダウンなのでアプリ等の状態は復旧できない
少しでも早く復旧なら「スリープ」を選ぶ。タブレットはWindowsでもAndroidでも、使いたいと思ったら直ぐに使えることが重量だと思うので、個人的には「スリープ」が良いと思う(自分のWindowsタブレットは一時期スリープが使えなくなってしまったので参った)。

コマンド(基本)

知らなかったのだが、Windows 7から休止状態はGUIからON・OFFができなくなったらしい。デフォルトONだと思うので気にする場面はあまり無いかもしれないが、代わりにコマンドで設定できるようになった。

Windows 8の「スタートメニュ」→「cmd」入力→右側にコマンドプロンプトのアイコンが出てくるので「右クリック」→「管理者として実行」を選択する(面倒くさ!)。

まずは、ヘルプを見てどんなオプションがあるかは見ておこう。

powercfg /?

電源の状態を確認。

powercfg /a

休止状態をON・OFFするには以下コマンド。

powercfg /h on
powercfg /h off

コマンド(レポート出力)

私みたいに休止状態が選択できない・スリープが選択できない問題に遭遇したら、以下コマンドにてトレースログが取得して診断ログを出力させると何かわかるかもしれない(私の場合は原因特定はできなかったが)。

powercfg /ENERGY

ログはC:\Windows\system32\energy-report.htmlに出力されるので、ブラウザで開いて確認する。以下の様なある意味余計なお世話的なログがほとんどだが、本当に問題がある場合は何か調査のきっかけになるものが見つかるかもしれない。

  • 電源ポリシー:ディスプレイ タイムアウトは無効になっています (電源接続時)
  • CPU 使用率:プロセッサ使用率は高レベルです
  • 電源ポリシー:ディスプレイのタイムアウトが長く設定されています (バッテリ使用時)

他にも以下コマンドがある。どういう時に使えばよいかはちょっと分からないが、一度使ってみてレポート結果を見てみるのはアリ。

powercfg /SLEEPSTUDY
powercfg /BATTERYREPORT


任意のフォルダをドライブレターを付けて別ドライブとして表示させる方法

以下バッチファイルを作成してスタートアップに登録するのみ。
※以下例は、ドライブレター「C:\mydoc」を「D:」として割り当てる例なので、適宜変更すること

@echo off
subst D: C:\mydoc

個人的にはドキュメント系のデータはCドライブとは別ドライブで管理したいため、会社PCのスタートアップに上記を組み込んで使用している。というか会社PCが配給された時、Cドライブ1つで構成されていたので「ディスクの管理」からパーティション分割をしようとしたら、「空き容量が不足している」という謎のエラーが発生して失敗したので回避策として利用した。

ギガバイトとギビバイトの違い

昔はそこまで気にしなくても誤差の範囲で済ませることができたギガバイト(GB)とギビバイト(GiB)の件。最近はディスク容量がペタとか平気で行く時代なので、サイジングをどちらの単位でするかを考慮しないと容量の差が大きくなるので注意しないといけない。

用語的にはGB系をSI接頭辞、GiBを2進接頭辞と呼ぶらしい。

結局違いって何?

以下が違いの全て。
  • 1GB = 1000MB = 10^9Byte
  • 1GiB = 1024MiB = 2^30Byte
1000毎に単位が変わるのがGBで、1024毎に単位が変わるのがGiBとなる。

1000と1024なので大きな差がないと思ったら大間違いとなる。1GiB - 1GB = 73MBとなり、数百TBの容量を扱うことが当たり前となっている現在では、決して無視できない容量の差となる。

単位の違いが混乱を招く理由

では、Windowsでは容量表記はGBとなっていることから、容量は1000を掛けて計算すれば良いかといえば、そうではない所にこの単位の問題がある。

WindowsなどのOSの容量は、GBやTBというSI接頭辞で記載されていたとしても、伝統的に1024毎での単位変更を実施している。そのため、HDDを買ってきてフォーマットすると容量が減るのはそれが原因で、HDDメーカーの容量記載が誤っているということではない。

さらに、ストレージ装置においては、製品によって1000毎と1024毎の容量表記がマチマチとなっている。そのため、ストレージ装置でボリュームを作成してOSに割り当てたら容量が小さくなる場合もあるので、どちらの単位で計算しているかを確認したうえでサイジングした方が良い。例えばストレージ装置上では2TBでボリュームを作ったのに、OS上では1.81TBのディスクとして見えることは往々にしてある。

ちなみに、ネットワークの帯域等は、一般的には1000毎で単位変更となるらしい。

計算式

以下の要領でやれば良い。一度Byteまで値を戻した後、1000または1024で割りなおす。Excelで計算式でも作っておくと良い。

  • αGB→βGiB変換:β=(α*1000*1000*1000)/(1024*1024*1024)
  • αGiB→βGB変換:β=(α*1024*1024*1024)/(1000*1000*10200)



人気の投稿