WinNAT定義の強制削除

 article  Comments Off on WinNAT定義の強制削除
Apr 222017
 

Hyver-V仮想マシン用に設定していたWinNATが動作しなくなりました。

PS C:\WINDOWS\system32> Get-NetNat


Name                             : MyNATnetwork
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 192.168.0.0/24
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : False



PS C:\WINDOWS\system32> 

最後のActive:Falseになっているのが怪しいのですが、Trueにしようと思ってもSet-NetNatコマンドレットにはそのようなオプションはありません。
作り直そうと思っても、削除時にエラーになってしまいます。

PS C:\WINDOWS\system32> Get-NetNat|Remove-NetNat

確認
この操作を実行しますか?
対象 MyNATnetwork の PolicyStore Local に対して操作 Delete を実行しています
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y
Remove-NetNat : 要求された操作がサポートされていません。
発生場所 行:1 文字:12
+ Get-NetNat|Remove-NetNat
+            ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (MSFT_NetNat (In...yNATnetwork;0"):root/StandardCimv2/MSFT_NetNat) [Remove-NetNat]、CimException
    + FullyQualifiedErrorId : Windows System Error 50,Remove-NetNat

PS C:\WINDOWS\system32> 

なんとも方法がわからず途方に暮れていたら以下の記事に同じような事象がありました。
Set up a Hyper-V Virtual Switch using a NAT Network | Thomas Maurer
ちょっとコメントがつぶれていますが、以下のレジストリキーを削除したとのこと。
HKLM\System\CurrentControlSet\Control\NSI\{eb004a20-…..7759bc}\6\

今のままでは他に情報もないので、以下のキーをバックアップして削除してみたところ、Get-NetNatでエントリーが出現しなくなりました。
HKLM\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a20-9b1a-11d4-9123-0050047759bc}\6

PS C:\WINDOWS\system32> Get-NetNat

うーん、これで大丈夫なのかわかりませんが、とりあえずNew-NetNatでの再作成は成功したので暫く経過観察します。

PS C:\WINDOWS\system32> New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24


Name                             : MyNATnetwork
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 192.168.0.0/24
IcmpQueryTimeout                 : 30
TcpEstablishedConnectionTimeout  : 1800
TcpTransientConnectionTimeout    : 120
TcpFilteringBehavior             : AddressDependentFiltering
UdpFilteringBehavior             : AddressDependentFiltering
UdpIdleSessionTimeout            : 120
UdpInboundRefresh                : False
Store                            : Local
Active                           : True



PS C:\WINDOWS\system32>

ちゃんとActive:Trueになってるし。

Window XPのRRAS設定(Filter&NAT)

 article  Comments Off on Window XPのRRAS設定(Filter&NAT)
Apr 202011
 

Windows XPで動かすcoLinuxをNATで使いたいのですが、Windows Firewall/Internet Connection Sharing (ICS)ではNATで使用できる内部ネットワークアドレスに制限があります(192.168.0.0/24固定)。
Routing and Remote Access(RRAS)でもNATはできるのですが、ICSのFirewallと共存することはできません。

結局、NATとパケットフィルタリング両方にRRASを使うようにしているので、そちらの設定メモです。

ICSのサービスを止めてRRASサービスを有効にします。

C:\>net stop sharedaccess
C:\>net start remoteaccess

netshのrouting ipコンテキストでフィルタを設定します。

C:\>netsh
netsh>routing ip
netsh routing ip>set filter "Cable" input drop
OK

netsh routing ip>add filter "Cable" input 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 tcp-est 0 0
OK

netsh routing ip>add filter "Cable" input 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 udp 53 0
OK

netsh routing ip>add filter "Cable" input 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 udp 123 0
OK

netsh routing ip>add filter "Cable" input 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 icmp any any
OK

netsh routing ip>

設定したフィルタの確認。

netsh routing ip>show filter "Cable"

インターフェイス Cable のフィルタ情報
------------------------------------------------------------------

フラグメント チェックは 無効 です。

フィルタの種類        : INPUT
既定の操作            : DROP

    Src Addr       Src Mask         Dst Addr       Dst Mask      Proto  Src Port  Dst Port
------------------------------------------------------------------------------------------
        0.0.0.0         0.0.0.0         0.0.0.0         0.0.0.0 TCP-EST       0       0
        0.0.0.0         0.0.0.0         0.0.0.0         0.0.0.0    UDP      53       0
        0.0.0.0         0.0.0.0         0.0.0.0         0.0.0.0    UDP     123       0
        0.0.0.0         0.0.0.0         0.0.0.0         0.0.0.0   ICMP       0       0
出力フィルタが構成されていません。
デマンド ダイヤル フィルタが構成されていません。

netsh routing ip>

続いてNAT設定。coLinuxでインストールしたTapインターフェースをPrivate、Cableインターフェースをfullに設定します。

netsh routing ip>nat
netsh routing ip nat>install

netsh routing ip nat>add interface "Cable" full

netsh routing ip nat>add interface "Tap" private

netsh routing ip nat>

NAT設定内容の確認。

netsh routing ip nat>show interface

NAT Cable の構成
---------------------------
モード            : アドレスおよびポートの変換


NAT Tap の構成
---------------------------
モード            : プライベート インターフェイス


netsh routing ip nat>

最後にDNS Proxyを設定して終了。

netsh routing ip nat>dnsproxy
netsh routing ip dnsproxy>install
netsh routing ip dnsproxy>exit


C:\>

PPP Adapterに対するRRASのフィルタはデフォルトDROPらしい

 article  Comments Off on PPP Adapterに対するRRASのフィルタはデフォルトDROPらしい
Apr 102011
 

私はWindows XPのFirewall機能に、標準的なICS(Windows Firewall/Internet Connection Sharing (ICS))ではなくRRAS(Routing and Remote Access)を使っています。
ICSではNATで利用するIPアドレスに制限がある(192.168.0.0/24固定)ことや、RRASのほうがルーター等N/W機器の一般的なフィルタに近い感覚で設定できることが理由です(個々のプログラムレベルでの通信許可はできなくなるので、ウィルスやマルウェア対策面では不安が残りますが)。

で、RRASでは「ローカルエリア接続」等の各N/Wインターフェースに対してデフォルトポリシーを許可ルールを設定しますが、PPP Adapterに関してはこちらに一覧が出現しません。

C:\>netsh routing ip show filter
Input           Output          Demand-dial     Frag. Check     Interface
---------       ----------      -------------   --------------  ----------------
0   (FORWARD)   0   (FORWARD)   0   (FORWARD)   無効            ループバック
0   (FORWARD)   0   (FORWARD)   0   (FORWARD)   無効            内部
0   (FORWARD)   0   (FORWARD)   0   (FORWARD)   無効            VMnet8
0   (FORWARD)   0   (FORWARD)   0   (FORWARD)   無効            VMnet1
0   (FORWARD)   0   (FORWARD)   0   (FORWARD)   無効            Cable
0   (FORWARD)   0   (FORWARD)   0   (FORWARD)   無効            WiFi
0   (FORWARD)   0   (FORWARD)   0   (FORWARD)   無効            Tap


C:\>

※普段はInputをDROPにしてますが、テストのためFORWARDに変更しています

デフォルトはFORWARDなのかDROPなのか、リモートからnmapで確認してみました。結論からいうとRRASサービスを有効にしただけでPPP Adapterに対してはDROPの動作になるようです。

RRAS停止状態(net stop remoteaccess)

debian1:~# nmap 183.72.42.159

Starting Nmap 5.21 ( http://nmap.org ) at 2011-04-10 01:35 JST
Nmap scan report for u542159.xgsfmg18.imtp.tachikawa.mopera.net (183.72.42.159)
Host is up (0.15s latency).
Not shown: 988 closed ports
PORT      STATE    SERVICE
135/tcp   filtered msrpc
139/tcp   filtered netbios-ssn
161/tcp   filtered snmp
445/tcp   filtered microsoft-ds
902/tcp   open     iss-realsecure
912/tcp   open     unknown
2049/tcp  filtered nfs
2869/tcp  open     unknown
8222/tcp  open     unknown
8333/tcp  open     unknown
12345/tcp filtered netbus
31038/tcp open     unknown

Nmap done: 1 IP address (1 host up) scanned in 10.16 seconds
debian1:~#

RRAS開始状態(net start remoteaccess)

debian1:~# nmap 183.72.42.159

Starting Nmap 5.21 ( http://nmap.org ) at 2011-04-10 01:37 JST
Note: Host seems down. If it is really up, but blocking our ping probes, try -PN
Nmap done: 1 IP address (0 hosts up) scanned in 3.08 seconds
debian1:~#

Windowsのnotepadを別プログラムに置き換える

 article  Comments Off on Windowsのnotepadを別プログラムに置き換える
Apr 042011
 

レジストリにImage File Execution Optionsなんてものがあるのですね。

実際の手順

  1. レジストリHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options以下に置き換えたいプログラムの実行ファイル名でキーを作成する(notepadの場合はnotepad.exe)
  2. Debuggerの名前でREG_SZを作成し、文字列に置き換えたいプログラムを指定する

64ビットの場合のレジストリキーはHKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Optionsになるとのこと。

Notepad2で置き換え後にメモ帳を起動すると、Commnad Lineは以下のようになっていました(Process Explorerで確認)。
"C:\Program Files\Notepad2\Notepad2.exe" /z "C:\Windows\System32\notepad.exe"

どのテキストエディタにでも置き換えられるかというとそんなことはなく、置き換え前の実行イメージファイル名が引数として渡されることになるので(デバッグ用ですから)、それを無視できる動作が必要になります。Notepad2の場合”/z”オプションで後ろの引数を無視するようになっています。

Notepad2のページによると、SysinternalsのProcess Explorerがタスクマネージャを置き換える際も同様の手法を用いているとのことです。
試してみたところ、確かにHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution\taskmgr.exeのDebuggerにProcess Explorerが設定されました。
物理的に実行イメージを置き換えるんだろうかと思ってたのですが、そんなことはなかったのですね。

NTFSで1フォルダに大量のファイルを書き込む

 article  Comments Off on NTFSで1フォルダに大量のファイルを書き込む
Oct 172010
 

NTFSファイルシステムで1フォルダに大量のファイルを書き込む場合、8.3形式ファイル名の生成がボトルネックになると聞いたので実験。

こちらの情報によると「300,000ファイル以上」との記述があるので、1フォルダに500,000ファイルを作成する場合の処理時間をWindows XPで測定してみる。8.3形式ファイル名の有効化、無効化には、fsutils behaviorコマンドを使う。

測定結果はこちら。

ファイル数 処理時間(秒)
disable8dot3 = 0 disable8dot3 = 1
10000 7 5
20000 15 10
30000 49 16
40000 82 21
50000 286 26
60000 766 31
70000 1590 35
80000 2716 40
90000 4090 45
100000 5792 50
110000 6192 54
120000 6596 59
130000 8475 64
140000 10604 69
150000 13985 74
160000 18066 78
170000 22742 83
180000 27976 88
190000 33826 92
200000 97
210000 103
220000 108
230000 113
240000 118
250000 122
260000 128
270000 132
280000 138
290000 142
300000 146
310000 151
320000 156
330000 161
340000 166
350000 170
360000 176
370000 180
380000 186
390000 193
400000 198
410000 204
420000 208
430000 213
440000 218
450000 223
460000 229
470000 233
480000 238
490000 243
500000 248

8.3形式ファイル名が有効な状態では、190,000ファイル作成までにトータルで9時間以上を要する(途中で測定中止)。最初の10,000ファイルは7秒なのに、ファイル数が増えるに従い処理時間が増えて、180,000からの10,000ファイルでは97分という状態になる。
しかし8.3形式ファイル名を無効にした状態では、コンスタントに5秒前後で10,000ファイルを書き出すことができるようになった。

測定に使用したスクリプトはこちら。”TXT” + 6桁の数値 + “.txt”という形式でひたすらファイルを作成していく。

Option Explicit

Dim fileObj
Dim outFile
Dim outCount, maxCount, repCount
Dim startedTime, elapsedTime
Dim fileName

maxCount = 500000
repCount = 10000

Set fileObj = CreateObject("Scripting.FileSystemObject")

startedTime = Now()

For outCount = 1 To maxCount Step 1
	fileName = "TXT" & Right("000000" & outCount,6) & ".txt"
	Set outFile = fileObj.CreateTextFile(fileName)
	outFile.Close()
	If (outCount Mod repCount) = 0 Then
		elapsedTime = DateDiff("s",startedTime,Now())
		WScript.Echo outCount & "," &elapsedTime
	End If
	Set outFile = Nothing
Next

Set fileObj = Nothing
Dec 072008
 

sqlite3-rubyのgem updateを実行してみたらnmakeがないと言われて失敗してしまう。

C:\ruby\bin>gem update sqlite3-ruby
Updating installed gems
Updating sqlite3-ruby
Building native extensions.  This could take a while...
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.

C:/ruby/bin/ruby.exe extconf.rb update sqlite3-ruby
checking for fdatasync() in rt.lib... no
checking for sqlite3.h... no

nmake
'nmake' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。


Gem files will remain installed in C:/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4 for inspection.
Results logged to C:/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4/ext/sqlite3_api/gem_make.out

Visual Studio 2008 Expressは入れてあるのだがnmakeにパスを通しただけではうまくいかない。

C:\ruby\bin>"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
Setting environment for using Microsoft Visual Studio 2008 x86 tools.

C:\ruby\bin>gem update sqlite3-ruby
Updating installed gems
Updating sqlite3-ruby
Building native extensions.  This could take a while...
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.

C:/ruby/bin/ruby.exe extconf.rb update sqlite3-ruby
checking for fdatasync() in rt.lib... no
checking for sqlite3.h... no

nmake

Microsoft(R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

NMAKE : fatal error U1073: 'ruby.h' のビルド方法が指定されていません。
Stop.


Gem files will remain installed in C:/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4 for inspection.
Results logged to C:/ruby/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.4/ext/sqlite3_api/gem_make.out

どうやらsqlite自体のヘッダーファイルなど、ビルド環境を整えないといけないらしいが、そこまでやるのも大変だ。
で、いろいろ調べてみるとバイナリが提供されているバージョン番号を指定すればうまくいくことがわかった。

C:\ruby\bin>gem install sqlite3-ruby --version=1.2.3
Successfully installed sqlite3-ruby-1.2.3-x86-mswin32
1 gem installed
Installing ri documentation for sqlite3-ruby-1.2.3-x86-mswin32...
Installing RDoc documentation for sqlite3-ruby-1.2.3-x86-mswin32...

C:\ruby\bin>

ビルドされたバイナリが提供されているかどうかは、RubyForge: SQLite-Ruby: ファイルリストで、*-mswin32.gemなファイルがあるか否かでわかる(のだと思う)。

Nov 012008
 

Windowsのメモ帳で「a + 改行 + b」というデータを保存し、Cygwinでod -xしてみた結果。

  • "ANSI"で保存
    0000000 0d61 620a
    0000004
  • "Unicode"で保存 (UTF-16/UCS-2, little endien)
    0000000 feff 0061 000d 000a 0062
    0000012
  • "Unicode big endian"で保存 (UTF-16/UCS-2, big endien)
    0000000 fffe 6100 0d00 0a00 6200
    0000012
  • "UTF-8"で保存
    0000000 bbef 61bf 0a0d 0062
    0000007

メモ帳のUTF-8ってBOMつきだったのですね。また、Windowsの内部表現にはUTF-16が使われているそうです(保存形式"Unicode"のBOMなし)。

UTF-16 - Wikipediaより引用:

UTF-16符号化形式は、WindowsXPなど多くのOSで、内部表現に使われている。

Microsoft Windowsでは、リトルエンディアンのUTF-16符号化方式が使われている。内部表現では16ビット符号なし整数を符号単位するUTF-16符号化形式(CEFなのでBOMはなし)として扱い、ファイルなどではBOMありのUTF-16符号化方式(リトルエンディアン)が主である。

参考:

Oct 032008
 

SysinternalsのSDeleteというツールを使うと、ファイルシステムの空き領域をクリアすることができます(-zオプション)。

Usage: sdelete [-p passes] [-s] [-q] 
sdelete [-p passes] [-z|-c] [drive letter]
-c	Zero free space (good for virtual disk optimization).
-p passes	Specifies number of overwrite passes.
-s	Recurse subdirectories.
-q	Don't print errors (quiet).
-z	Cleanse free space.

Download SDelete (47 KB)

Linuxでも似たようなものがないかと思ってたら、Debian sidにはzerofreeというパッケージがありました(Ubuntuにもあるようです)。
Debian — sid の zerofree パッケージに関する詳細

ext3-usersというメーリングリストでも話題に上がってるようなのですが、もともと配布元はどちらなのでしょう?
ext3 zerofree option and RedHat back port?

ZoneIdとかNTFS Streamとか

 article  Comments Off on ZoneIdとかNTFS Streamとか
Sep 212008
 

ダウンロードしたファイルの「ブロックの解除」で出てくる情報はどこに記録されてるんだっけか、といつも忘れるのでメモ。

XP SP2以降でダウンロードしたファイルにはZoneIdという仕組みを使って情報が付与される。
@IT:Windows TIPS — Knowledge:XP SP2のZoneIdとは?
ちなみにFirefoxでダウンロードしても同じ情報は付与される。

このときの情報はNTFSのAlternate Streamを使って記録されており、ダウンロードしたファイル本体には記録されないので、ブロックの解除をおこなってもファイルサイズとかチェックサムは変わらない。

NTFSのStreamに関してはこちらの説明が一番わかりやすいかも。
8-3. NTFS のセキュリティ機能と落とし穴

Sysinternalsで配布しているStreamsを使うとコマンドラインで読み取ったり削除することができる。

2000とXPでは縮小表示の仕組みにNTFS Streamを使うかThumbs.dbを使うか、といった違いもあるらしい。
縮小表示を行うと NTFS で暗号化されたファイルが表示される

CATALINA_BASEを分けてTomcatを複数サービス化

 article  Comments Off on CATALINA_BASEを分けてTomcatを複数サービス化
Sep 202008
 

Tomcatのバイナリ1個で、複数のインスタンスをサービス登録してみました。
インスタンス別にCATALINA_BASE配下ディレクトリ(conf,logs,temp,webapps,work)を分けて、Tomcatが使うポート番号も変えてあげれば、バイナリは共通のまま複数インスタンス化することができます。

設定項目 デフォルト インスタンス1 インスタンス2
サービス名 Tomcat6 Tomcat6Instance1 Tomcat6Instance2
JAVA_HOME C:\Program Files\Java\jdk1.6.0_07
CATALINA_HOME C:\apache\tomcat-6.0.18
CATALINA_BASE C:\apache\tomcat-6.0.18 C:\apache\tomcat-instance1 C:\apache\tomcat-instance2
Server Componentの
port番号
8005 18005 28005
HTTP Connectorの
port番号
8080 18080 28080
AJP Connectorの
port番号
8009 18009 28009

まずは以下の手順で各種ディレクトリと設定ファイルを準備。

  • apache-tomcat-6.0.18.zipを入手し、C:\apache\tomcat-6.0.18に展開
  • C:\apache\tomcat-instance1を作成し、C:\apache\tomcat-6.0.18からconf,logs,temp,webapps,workディレクトリをコピー
  • C:\apache\tomcat-instance1\conf\server.xmlのポート番号を変更
  • C:\apache\tomcat-instance2も同様に作成

デイレクトリと設定ファイルが準備できたら、service.batコマンドで登録。

C:\apache\tomcat-6.0.18\bin>set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_07"
C:\apache\tomcat-6.0.18\bin>set CATALINA_BASE=C:\apache\tomcat-instance1
C:\apache\tomcat-6.0.18\bin>service.bat install Tomcat6Instance1
Installing the service 'Tomcat6Instance1' ...
Using CATALINA_HOME:    C:\apache\tomcat-6.0.18
Using CATALINA_BASE:    C:\apache\tomcat-instance1
Using JAVA_HOME:        "C:\Program Files\Java\jdk1.6.0_07"
Using JVM:              auto
The service 'Tomcat6Instance1' has been installed.

CATALINA_BASE環境変数を変えて、2個めのインスタンスも同様に登録します。

C:\apache\tomcat-6.0.18\bin>set CATALINA_BASE=C:\apache\tomcat-instance2
C:\apache\tomcat-6.0.18\bin>service.bat install Tomcat6Instance2
Installing the service 'Tomcat6Instance2' ...
Using CATALINA_HOME:    C:\apache\tomcat-6.0.18
Using CATALINA_BASE:    C:\apache\tomcat-Instance2
Using JAVA_HOME:        "C:\Program Files\Java\jdk1.6.0_07"
Using JVM:              auto
The service 'Tomcat6Instance2' has been installed.

今回は簡単に済ませるためにservice.batコマンドを使いましたが、tomcat6w.exeを使うともっと細かいパラメータを指定して登録することができます。登録したサービスの設定変更をおこなうことも可能です。
詳しくはApache Tomcat 6.0 – Windows service HOW-TOをご覧ください。