2011年10月22日

OpenVPN+bridge-utilsのVPNでリモートの同一セグメントに乗っかる

 普段持ち歩くPCはWindowsなので、VPNはPPTPが一番楽である。クライアント1台のみのことなのでいちいちルーティングを設定して使うのは面倒で、PPTPはクライアント1台をVPNの向こう側の同一セグメント上に接続しているかのごとく見せるのが簡単にできるので結構なのである(LinuxのPPTPサーバの実装[PopTop]もある)。が、先日ブロバンルータを乗り換えたため、問題が発生した。PPTPはGREを使うのだが、古いバッファローのルータではプロトコルGREのパケットを特定ホストに転送が出来たのに、今度のコレガのルータではプロトコルIPv4のパケット(のTCPかUDPの特定のポート)しか内側に振れないのである。従って、PPTPはまるっきり使えないことになった。
 次善の策として、OpenVPNを使って、同じように、リモートからVPN越しにつないで、あたかもVPN先のセグメントに繋がってるが如くに振る舞うようにする設定したのであった。サーバーはCentOS5.7、クライアントはWindows7である。

サーバー側の設定
設定ファイルは、/etc/openvpnに置くことを仮定している。

1. OpenVPNのインストール
RPMforgeにあるので、yumで一発。また、bridge-utilsを使ってブリッジを作るので、それもインストール。

# yum install --enablerepo=rpmforge openvpn
[略]
# /usr/sbin/openvpn --version
OpenVPN 2.2.0 x86_64-redhat-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] built on Jun 6 2011
[略]
# yum install bridge-utils
# brctl --version
bridge-utils, 1.1
2. 鍵を作る
OpenVPNをブリッジで使うときは static-key が使えないみたいなので、CAを作って鍵を作って署名する。
# cd /etc/openvpn/ ※どこのディレクトリでやってもいいのだが。
# cp -r /usr/share/doc/openvpn-2.2.0/easy-rsa/2.0/ easy-rsa
# cd easy-rsa
# vi vars ※設定値を変えておくと作業が楽になる
export KEY_COUNTRY="JP"
export KEY_PROVINCE="ToKyo"
export KEY_CITY="ChiyoDaku"
export KEY_ORG="usoinfo"
export KEY_EMAIL="usoinfo_at_ahoaho.net"
# source vars
# ./clean-all

# ./build-ca ※CAを作る。プロンプトにはEnterでいいが適宜お好みで。
# ./build-key-server server ※サーバーの鍵。これもお好みで。
# ./build-key ahoaho ※クライアントの鍵。接続するクライアント毎に作る。

# cp keys/ca.crt /etc/openvpn/
※出来たCAの証明書をconfigのあるところへ配置。

# cp keys/server.crt keys/server.key keys/dh1024.pem /etc/openvpn/
※出来たサーバ用の鍵をconfigのあるところへ配置。
※ keys/ca.crt keys/ahoaho.crt keys/ahoaho.key はクライアントの動作に使う
3. ブリッジの用意
# cp /usr/share/doc/openvpn-2.2.0/sample-scripts/bridge-start /etc/openvpn
# cp /usr/share/doc/openvpn-2.2.0/sample-scripts/bridge-stop /etc/openvpn
※ブリッジの開始・停止スクリプトをコピー

# chmod 755 bridge-start bridge-stop ※実行ビットを付与

# vi bridge-start ※ブリッジ開始の設定を編集
br="br0" ※ブリッジインターフェース名。
tap="tap0" ※ブリッジするOpenVPNのTAPインターフェース名。
eth="eth0" ※ブリッジするローカルセグメントのインターフェース名。
eth_ip="192.168.x.y"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.x.255"

# vi bridge-stop ※ブリッジ停止の設定を編集
br="br0" ※bridge-startに合わせる
tap="tap0" ※bridge-startに合わせる
 ブリッジインターフェース名は、他にブリッジがなければbr0でいいだろう。TAPインターフェース名は、OpenVPNの設定と合っていないとダメ。ethの各項目は、ローカルセグメントに繋がっているインターフェースの設定を書く。
 OpenVPNでブリッジするときは、bridge-start → openvpn startの順で開始し、openvpn stop → bridge-stopの順で停止しないといけない。面倒なので、スタートアップスクリプトに開始と終了を埋め込む。
# vi /etc/rc.d/init.d/openvpn
[略]
case "$1" in
start)
echo -n $"Starting openvpn: "
/etc/openvpn/bridge-start ※開始時OpenVPNが始まる前にブリッジ開始
/sbin/modprobe tun >/dev/null 2>&1
[略]
stop)
echo -n $"Shutting down openvpn: "
for pidf in `/bin/ls $piddir/*.pid 2>/dev/null`; do
if [ -s $pidf ]; then
kill `cat $pidf` >/dev/null 2>&1
fi
rm -f $pidf
done

# Run shutdown script, if defined
if [ -f $work/openvpn-shutdown ]; then
$work/openvpn-shutdown
fi
/etc/openvpn/bridge-stop ※OpenVPNが停止した後でブリッジ停止
4. OpenVPNサーバーの設定
 OpenVPNサーバーの設定は、設定ディレクトリ(/etc/openvpn)に、xxxx.confという名前で保存しておくと、スタートアップスクリプトが .conf の設定を読み込んで実行してくれる。/usr/share/doc/openvpn-2.2.0/sample-config-files/server.conf にサンプルの設定ファイルがあるので、これをベースに書き換えてもいい。
OpenVPNサーバー設定のポイントを抜粋:
server-bridge 192.168.1.1 255.255.255.0 192.168.1.222 192.168.1.230
dev tap0
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
client-to-client
push "route 192.168.2.0 255.255.255.0"
push "dhcp-option DNS 192.168.1.1"
server-bridgeが、ブリッジモードを指定する。1,2番目がローカルセグメントの(つまりeth1の)アドレスとネットマスク、3,4番目が、クライアントに割り当たるアドレスの開始アドレスと終了アドレスである。
dev tap0で、OpenVPNのTAPインターフェースを指定する。bridge-start/stopで指定したインターフェース名を、数字も込みでで指定する。"dev tap"ではダメである。
ca cert key dhは、2.で作った証明書と鍵をOpenVPNに読み込ませる設定。
client-to-clientは、OpenVPNクライアント同士が通信するときに必要。クライアントが1台だけならいらない。
push "route 192.168.2.0 255.255.255.0"は、他のネットワーク(ここでは192.168.2.0)への通信がVPNを経由するようにクライアントに経路を設定させる。
push "dhcp-option DNS 192.168.1.1"は、クライアントにDNSサーバーのアドレスを通知する。

TCPサーバーモード、ポート5000で動かす場合の設定ファイルのサンプルはこちら

5. 設定ファイルを配置したら、service openvpn startでデーモン開始。ブリッジを開始するときにしばらく通信できなくなることがある(ブリッジの設定を失敗するとずっと通信できなくなる)ことがあるので、実行はコンソールからやるのがお勧め。
正常動作を確認できたら、chkconfig openvpn onで自動的に開始するようにしておく。

クライアント側の設定
1. OpenVPNのインストール
http://www.openvpn.net/index.php/open-source/downloads.htmlから Windows Installer をダウンロードしてきて、インストールする。

2. クライアントの設定
 サーバーの2.で作ったクライアント用の鍵と証明書のファイル(ca.crt,ahoaho.crt,ahoaho.key)を、クライアントのconfigフォルダに置く。デフォルトでは、C:\Program Files\OpenVPN\config
 configフォルダにクライアント用の設定ファイルをxxxx.opvnという名前で作成する。
OpenVPNクライアント設定のポイントを抜粋:
dev tap
ca ../config/ca.crt
cert ../config/barkhorn.crt
key ../config/barkhorn.key
tls-client
pull
float
dev tapで、OpenVPNのTAPインターフェースを指定する。
ca cert key dhは、2.で作った証明書と鍵をOpenVPNに読み込ませる設定。
tls-clientで、TLSクライアントを指定する。
pullで、サーバーからconfigを読み取る。サーバーがpushで設定した項目が設定される。
tls-clientで、IPアドレスが可変であることを指定する。

TCPクライアントモード、ポート5000で動かす場合の設定ファイルのサンプルはこちら

3. スタートメニューから、OpenVPN GUIを実行し、通知領域アイコンを右クリック、「Connect」を実行する。うまくいけば、"Initalization Sequence Completed" と出て、TAPアダプターにIPアドレスが付与されるはずである。


ブロバンルータで、OpenVPNのポートを内側のホストにアドレスに振っておくのを忘れずに。
タグ:Linux VPN OpenVPN
posted by usoinfo at 11:07 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2011年09月20日

Windowsの「送る」メニューからドライブを消す

 Windowsで、右クリックすると出てくるコンテキストメニューの中に、「送る」というのがある。C:\Users\(ユーザー名)\AppData\Roaming\Microsoft\Windows\SendTo などにショートカットを置いて使っているが、ここのフォルダに置いていないのに勝手に出るアイコンがある。リムーバブルドライブである。うっかり光学ドライブに間違えて放り込んでしまい、「書き込み可能なディスクを入れてください」などと言われ、鬱陶しい。

 そこで、「送る」のメニューからリムーバブルドライブを消す方法である。
 レジストリエディタで HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer を開き、右ペインを右クリックでDWORD値を新規追加する。名前は "NoDrivesInSendToMenu"、値は "1"。
.reg的に書くとこうである。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoDrivesInSendToMenu"=dword:00000001
 これで、リブートなりなんなりすれば、めでたく「送る」からリムーバブルドライブが消えてくれる。



 
タグ:Windows
posted by usoinfo at 06:52 | Comment(0) | Windows | このブログの読者になる | 更新情報をチェックする

2011年09月02日

pdfからjpegを引っこ抜く

 Jpeg(画像データ)の含まれたPDFを画像データに変換したい。多分よくある話である。
 方法はいろいろあると思うが、Xpdfを使うのが手っ取り早そうだ。

 http://www.foolabs.com/xpdf/download.html から、コンパイル済みバイナリのzipを持ってくる。(Linuxならばtgzを持ってくるか、RPMForgeからxpdfをインストールしてもいい。)
 ダウンロードしたら解凍。いくつかコマンドが出てくるが、JPEGを引っこ抜くには、pdfimages を使用するようである。
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:\xpdf\xpdfbin-win-3.03\bin64>pdfimages.exe -j C:\source.pdf .\

C:\xpdf\xpdfbin-win-3.03\bin64>

C:\source.pdf というファイルからjpegを抜いて、カレントのフォルダにに置く時の例。
posted by usoinfo at 08:37 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年08月21日

CentOS5.6に最新のカーネルを適用する

 今日(2011/08/21)現在、CentOS5.6の標準のカーネルは2.6.18-238.19.1.el5。標準のカーネルでは、Intel以外のCPUのクロック変更モジュールが入っていないので、VIAのマシン等でcpuspeedが使えない。なので、カーネルを再構築する必要がある。
 www.kernel.orgから2.6.x系の最新のカーネル(今日の段階で2.6.39.4)を取ってきて/usr/src/kernelsに展開し、デフォルトの設定でカーネルを作って入れてみると
# cd /usr/src/kernels/linux-2.6.39.4/
# cp /boot/config-2.6.18-238.19.1.el5 .config
# make oldconfig
(全部ENTER)
# make bzImage;make modules;make modules_install;make install
 ぱぱっとやって再起動したら、標準カーネルでは正しく動いていたのにLVMの"VolGorup00"が見えないのでrootをマウントできないと言ってカーネルがpanicする。ブートできない。

 だいぶ試行錯誤の挙げ句たどり着いた決着。問題点は、カーネルのconfigはそのままではなく2カ所変更しないといけない。
General Setup --->
[*] Enable depracated sysfs features to support old userspace tools
[*] Enable depracated sysfs features by default
 これをオンにすれば動く。分かるかこんなの!

posted by usoinfo at 13:50 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2011年08月19日

CentOSのyumリポジトリにRPMforgeを追加する

いつも忘れてしまうので備忘的にメモ。

1. http://dag.wieers.com/rpm/FAQ.php#Bから、RPMパッケージ rpmforge-release-0.3.6-1.el5.rf.i386.rpm (x86_64版はこっち) を取ってくる。
[root@usouso ~]# wget http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
--2011-08-19 06:37:11-- http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
apt.sw.be をDNSに問いあわせています... 193.1.193.67
apt.sw.be|193.1.193.67|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 16698 (16K) [application/x-redhat-package-manager]
`rpmforge-release-0.3.6-1.el5.rf.i386.rpm' に保存中

100%[================================================>] 16,698 34.1K/s 時間 0.5s

2011-08-19 06:37:14 (34.1 KB/s) - `rpmforge-release-0.3.6-1.el5.rf.i386.rpm' へ保存完了 [16698/16698]
2. RPMを入れる
[root@usouso ~]# rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm
警告: rpmforge-release-0.3.6-1.el5.rf.i386.rpm: ヘッダ V3 DSA signature: NOKEY, key ID 6b8d79e6
準備中... ########################################### [100%]
1:rpmforge-release ########################################### [100%]
3. デフォルトで無効にする
(しなくてもいいが、毎度更新に時間がかかるので。。。)
[root@usouso ~]# vi /etc/yum.repos.d/rpmforge.repo

enabled = 1 を
enabled = 0 に変更
4. sdparm をインストールする例
[root@usouso ~]# yum install --enablerepo=rpmforge sdparm
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.mirror.cdnetworks.com
* extras: centos.mirror.cdnetworks.com
* rpmforge: ftp-stud.fht-esslingen.de
* updates: centos.mirror.cdnetworks.com
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package sdparm.i386 0:1.06-1.el5.rf set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================
Package Arch Version Repository Size
==========================================================================================
Installing:
sdparm i386 1.06-1.el5.rf rpmforge 115 k

Transaction Summary
==========================================================================================
Install 1 Package(s)
Upgrade 0 Package(s)

Total download size: 115 k
Is this ok [y/N]: y
Downloading Packages:
sdparm-1.06-1.el5.rf.i386.rpm | 115 kB 00:01
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : sdparm 1/1

Installed:
sdparm.i386 0:1.06-1.el5.rf

Complete!

posted by usoinfo at 06:47 | Comment(0) | Linux | このブログの読者になる | 更新情報をチェックする

2011年08月10日

WindowsUpdateでKB2497281に飛ばされてしまうことへの対処

 いろいろあって、WindowsXPをクリーンインストールした。SP3を当て、WindowsUpdateを掛けようとしたところ、アクセスするとKB2497281に飛ばされてしまい、WindowsUpdateが使えない。
 インストール直後の状態ではIEがIE6なので、そのせいかと思い、IE8をダウンロードしてインストールしたが、やっぱり状況は変わらない。なにをやってもこの画面である。
kb2497281.png

 どうやら、Microsoft側で、WindowsUpdateのサーバーが新バージョンになり、それにXPSP3がついて行けてないようである(MSも、本格的にXPを切り始めたのであろう。まあ企業としては実に妥当であるが、こっちの動かそうとしているPC資産では7は動かないので、まだしがみつくしかないのである)。

 解決法を試行錯誤した結果、恐らく、Windows Update エージェントを最新版に更新すれば、WindowsUpdateが使えるようである。

1. KB946928: Windows Update エージェントの最新バージョンを入手する方法に関する、ネットワーク管理者向けの情報 から、WindowsUpdateAgent3.0のパッケージをダウンロードする。

2. IEを全て終わらせてから、ダウンロードしたパッケージを当てる。エラーは何も吐かないが、IEを終わらせないと正しくコンポーネントが更新されないようである。

3. リブートしてWindowsUpdateを実行。リダイレクトされなければ成功。

今回はこれで解決したが、ダメな場合、更に

Automatic Updateサービスを停止した上でKB971058: Windows Update コンポーネントをリセットする方法 のFixitから、「完全復旧」を実行する

・Automatic Updateサービスを手動で登録し直す。コマンドプロンプトから
net stop wuauserv
regsvr32 %windir%\system32\wups2.dll
net start wuauserv

という情報もあったので、付け加えておく。
タグ:Windows tips XP
posted by usoinfo at 07:17 | Comment(0) | Windows | このブログの読者になる | 更新情報をチェックする

2011年06月11日

Tinycoreでsshdを動かす

Tinycoreをサーバにしようと思う人がどれくらいいるのか分からないが、sshdを使えるようにする手順。
使用したのはTinycore 3.6。

1. openssh.tcz をインストール
Apps から検索して入れてもいいし、tce-load -wi openssh.tcz してもよい。必要な他のtczも勝手に入るはず。

2. sshdのための設定
動作に必要な sshd_config を作成して必要なら編集、ホスト鍵を作成する。
tc@box:~$ sudo sh
root@box:/home/tc# cd /usr/local/etc/ssh
root@box:/usr/local/etc/ssh# cp sshd_config.example sshd_config
(※必要であれば sshd_config を編集する)
root@box:/home/tc# /usr/local/etc/init.d/openssh start
Generating public/private rsa key pair.
...(略)
(※一度sshdを実行してホスト鍵を作成しておく)

3. sshdでログインするユーザーを作成
adduser でユーザーを作成する。ログイン名はお好みで。RSA認証だけで使う場合にはパスワードを付ける必要はない。その辺はお好みで。
root@box:/home/tc# adduser usost
Changing password for usost
New password:
Retype password:
Password for usost changed by root

この状態で、/etc/passwd, /etc/shadow にアカウント情報ができるので、メモする。
こんな感じでgrep。
root@box:/home/tc# grep usost /etc/passwd
usost:x:1000:1000:Linux User,,,:/home/usost:/bin/sh
root@box:/home/tc# grep usost /etc/shadow
usost:$1$RPG9zR3i$pxjWO47JkotnvIpfni6Fo/:15136:0:99999:7:::

これを元に、ブート時にユーザーを足すスクリプトを作る。グループは(面倒なので)0にしてあるが、別のものでもいい。sudoersの設定も、必要なら、特定のものだけ許可するようにした方がいいかも。
root@box:/home/tc# vi /opt/userinit.sh
----
#!/bin/sh
# /opt/userinit.sh
# add user on boot.

echo 'usost:x:1000:0:Linux User,,,:/home/usost:/bin/sh' >> /etc/passwd
echo 'usost:$1$RPG9zR3i$pxjWO47JkotnvIpfni6Fo/:15136:0:99999:7:::' >> /etc/shadow
echo 'usost ALL=NOPASSWD: ALL' >> /etc/sudoers
----
root@box:/home/tc# chmod 755 /opt/userinit.sh

4. 自動起動するように設定
ユーザー追加スクリプトと、sshd起動スクリプトを、ブート時に実行するように /opt/bootlocal.sh に書いておく。
root@box:/home/tc# vi /opt/bootlocal.sh
----
#!/bin/sh
# put other system startup commands here

/opt/userinit.sh
/usr/local/etc/init.d/openssh start
----

5. 設定ファイルを保存するようにしておく
このままだと、sshd_configやホスト鍵、作成したユーザー追加スクリプトも忘れてしまうので、保存するように /opt/.filetool.lst に書いておく。
root@box:/home/tc# vi /opt/.filetool.lst

opt/userinit.sh
usr/local/etc/ssh
の2行を追加。


6. Exit でリブート
これで、自動的にsshdが上がり、作ったユーザーでログインできるようになっているはずである。
sshdが上がってないときは、ホスト鍵、sshd_config を忘れていないか(/opt/.filetool.lst)確認。
sshdは上がっているけどログインできない時は、ユーザーが正しく追加されているかどうか確認。



 ついでに、Tinycore 3.6では、カーネルのブートオプションに kmap=jp106 をつけても、キーマップ変更はコンソールだけで、Xのキーマップは変わらないようである。
 Xでもjp106キーマップにするには、kmap.tcz をインストールした上で、/opt/bootlocal.sh にloadkmapを書いておくとよいようだ。合わせると、bootlocal.shはこんな感じ。
tc@box:~$ tce-load -wi kmap.tcz
tc@box:~$ vi /opt/bootlocal.sh
----
#!/bin/sh
# put other system startup commands here
loadkmap < /usr/share/kmap/qwerty/jp106.kmap

/opt/userinit.sh
/usr/local/etc/init.d/openssh start
----

タグ:Tinycore Linux
posted by usoinfo at 12:45 | Comment(1) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年05月25日

PocketPC 2002エミュレータ日本語化

昨日の続き。

PPC2002エミュレータの日本語化は、マイクロソフトからまだダウンロード可能の模様(http://download.microsoft.com/download/pocketpc/Utility/2002.1/NT5XP/EN-US/Japanese-NoRadio.exe)。
ダウンロードして解凍したら、(SDKのインストール先)\Windows CE Tools\wce300\Pocket PC 2002\emulation の下に "Japanese-No Radio"フォルダをフォルダごとコピーして、レジストリを変更。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Tools\Platform Manager\{F384D888-F9AA-11D1-BB9E-00A0C9C9CCEE}\{DE9660AC-85D3-4C63-A6AF-46A3B3B83737}\{F384D894-F9AA-11D1-BB9E-00A0C9C9CCEE}\{67C8D913-F0CF-486A-8CF0-CE7D116225E8}]
"Path"="(SDKインストール先)\\Windows CE Tools\\wce300\\Pocket PC 2002\\emulation\\japanese-no radio\\jpnnoril.bin"
 こんな内容のテキストファイルを作って、"ppc2k2emujp.reg"(リンク先のファイルはサンプル)とか適当な名前で保存して、ダブルクリックするとよい。

 これでエミュレータが日本語に。
ppc2002emu-jp.png
タグ:EVC PocketPC WinCE PDA
posted by usoinfo at 07:12 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年05月24日

PocketPC 2002 のコンパイル環境

 今更に、PocketPC 2002のコンパイル環境を整える。
 なんでPPC2002なのかと言うと、昔のPDAが安くジャンクで出回っていて、当時人気だったカシオのカシオペア、東芝のGENIO、コンパック(HP)のiPAQなどが今手に入る。
 それで、手に入ったのはいいものの、それをどう活用していくかというと、問題に直面する。今更PPC2002のアプリケーションが開発・メンテナンスされているわけはないので、ちょっとしたものは自分で作っしまおうと言うことになる。今のVisual Studioはスマートデバイスの開発環境も統合されているが、PPC2002用なんていう大昔の遺物のコンパイルは、当然Visual Studioではできない。それどころか、eMbedded Visual Tools 4.0でもできない。開発には、eMbedded Visual Tools 3.0が必要である。
 ここで問題にぶち当たるわけだが、もうマイクロソフトからeMbedded Visual Tools 3.0はダウンロードできない。公開終了なのである。そして、PPC2002のためには当然、PocketPC 2002 SDKが必要である。が、これももうマイクロソフトからはダウンロードできない。公開終了なのである。要するに、もう触れてくれるな黒歴史、ということなのであろう。

 そうは言っても、コンパイル環境が欲しいので、なんとか入手の法。すべて2011/05/24現在の情報。

1. eMbedded Visual Tools 3.0 を探してきて入手。HPC:Factorからダウンロードした(http://www.hpcfactor.com/downloads/details.asp?r=0D692AFF-501F-48D1-9D1C-C494078E201D 要アカウント登録)。或いは、他の所から探す場合、ファイル名は EN_WINCE_EMBDVTOOLS30.exe である。参考にされたい。

2. PocketPC 2002 SDK を探してきて入手。これは cnet Downloads から。http://download.cnet.com/Pocket-PC-2002-SDK/3000-2206_4-10731597.html

3. 開発用のマシンを用意。当然、WindowsCEベースなのでActiveSyncで接続することになる。Windows Vista以降からCEベース機との接続はWindows Mobile デバイスセンターに取って代わられ、ActiveSyncは非対応である。デバイスセンターはPPC2002は非対応である。なので、XPの走るマシンを1台用意するのがいいのではないかと思われる。ActiveSyncは、まだマイクロソフトからダウンロードできる(http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=9e641c34-6f7f-404d-a04b-dc09f8141141)。まあ、コンパイル環境を整えるだけなら、ActiveSyncは使わないという選択肢もあり得る。

 マシンに、eVC3をインストールし(CE2.11ベースのSDKも付いているので、それも入れればコンパイルできる。MIPSのMobileGearとか古いカシオペアとか。)、PPC2002SDKもインストールする。全てをインストールするなら、だいたい2Gくらいのディスクがあればよい。eVCは英語だけど、まあ仕方ない。これで、プラットフォームに"Pocket PC 2002"を選べば、今さらPDAのバイナリが作れるというわけである。

 ついでなので、さっそく、昔ソースコードが公開されていたGSPlayerという音楽再生ソフトをビルドしてみる。
 まずソースを入手(http://www.afterdawn.com/software/source_codes/gsplayer.cfm)。開発元は既に公開していない模様であるが、探したところ、2.28が入手できた。
 これを開発環境に持っていき、解凍する。

 まず、libをビルドする。libmad libovd maply の各フォルダがあるので、それぞれ、

・libmad.lib
  1. (解凍先)\libmad\libmad.vcw をeVC3で開く
  2. Active WCE Configurationに"Pocket PC 2002"を選択
  3. Active Configurationに"Win32 (WCE ARM) Release"を選択
  4. Build
  5. (解凍先)\lib\ARMRel\libmad.lib ができる
・libovd.lib
  1. (解凍先)\libovd\libovd.vcw をeVC3で開く
  2. Active WCE Configurationに"Pocket PC 2002"を選択
  3. Active Configurationに"Win32 (WCE ARM) Release"を選択
  4. Build
  5. (解凍先)\lib\ARMRel\libovd.lib ができる
・maplay.lib
  1. (解凍先)\maplay\maplay.vcw をeVC3で開く
  2. Active WCE Configurationに"Pocket PC 2002"を選択
  3. Active Configurationに"Win32 (WCE ARM) Release"を選択
  4. Build
  5. (解凍先)\lib\ARMRel\maplay.lib ができる

 次に本体をビルドする。
  1. (解凍先)\GSPlayer2\WinCE_PPC2\GSPlayer2.vcwを開く。(WinCE_* は、動かしたいデバイスによって適当な物を。英語版はGSPlayer2e.vcwを。)
  2. (解凍先)\lib\ARMRel\ の下にある *.lib を (解凍先)\lib\ARMV4Rel\ にコピー
  3. Active WCE Configurationに"Pocket PC 2002"を選択
  4. Active Configurationに"Win32 (WCE ARM) Release"を選択
  5. プロジェクトにUIHelper.h/UIHelper.cppが入っていないようなので、FileViewの"GSPlayer2 files"を右クリック→"Add Files to Project..."→UIHelper.hとUIHelper.cpp選択してOK
  6. Build
  7. (解凍先)\bin\jpn\WinCE_HPC\ARMRel\GSPlayer2.exe ができる


 これで完成。
 後は、できたexeをデバイスに持っていって実行すればよい。カシオペアE-3000で動作を確認。

IMG_8001s.jpg

 動いたのだが、何故か手元の実機は、母艦のSDカードリーダーで書き込んだサイズの小さいファイルがE-3000で正しく読めない。本体が古いから、故障かなあ。。。(ちなみに、ジャンクPDAは、電脳売王でよく掘り出し物が出るので、買っている。参考になれば幸い。)
タグ:EVC PocketPC WinCE PDA
posted by usoinfo at 14:49 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする

2011年05月17日

iptables で日本以外のアクセスを全部拒否する

 今日たまたまサーバの様子をmuninで見たら、普段は見かけないCPU usageが出ていたので、どうしたんだろうと思って調べると、sshdが余計に動いている。不審に思ってnetstatしてみると、.cnからのsshブルートフォース攻撃を受けていた。本来、JPのアドレスから以外のアクセスはiptablesで叩き落としていたのだが、先日いろいろカーネルをいじっていた時にiptablesの設定を変更して、そのJPフィルターを外したままにしてしまっていたのである。反省しきり。

 と、いうのは経験談として、日本以外のアクセスを全部拒否する、である。やりたいことは、RIRから日本に割り当てられているアドレスだけをリストアップして、iptablesでACCEPTし、該当しないものはDROPへ落とす、ということである。
 割り当て済みIPアドレスのリストはAPNICが配布している(http://ftp.apnic.net/stats/apnic/delegated-apnic-latest)が、このアドレスの一覧はiptablesにそのまま流し込めるようなフォーマットをしていない。しかし、このリストを使いやすいようにアドレス/マスクの形式に変換して提供している Office Namiという素晴らしいサイトがあるので、有り難くこれを使用させて貰うことにする。

 とりあえず、cidr形式のリストをダウンロードして、コマンドに列挙するなら、こんな感じになる。
% wget -q -O - http://nami.jp/ipv4bycc/cidr.txt.gz | \
gzip -d | \
grep "JP" | \
awk '{print "iptables -I RH-Firewall-1-INPUT 1 -p all -s ",$2," -j ACCEPT"}' \
> jpfilter.sh
% head jpfilter.sh
iptables -I RH-Firewall-1-INPUT 1 -p all -s 1.0.16.0/20 -j ACCEPT
iptables -I RH-Firewall-1-INPUT 1 -p all -s 1.0.64.0/18 -j ACCEPT
iptables -I RH-Firewall-1-INPUT 1 -p all -s 1.1.64.0/18 -j ACCEPT
iptables -I RH-Firewall-1-INPUT 1 -p all -s 1.5.0.0/16 -j ACCEPT
(略)
 awkのiptableコマンドの引数は環境に応じて適当に変更が必要だが、これで出てきたjpfilter.shをrootで実行すれば、今のiptablesにJPフィルターが追加できる。

 しかし、日本からのアクセスだからと言って無条件に許可するわけではないので、もう少し手を加える。
 INPUTチェインに入ってきたパケットは、日本以外のアクセスであれば叩き落とし、日本からのアクセスであれば、通常のフィルター動作を適用したいので、

1. 日本のアドレスのリストは ALLOW-JP-INPUT という別チェインにし、
2. INPUTチェインでは通常のフィルター(RH-Firewall-1-INPUT)でなくALLOW-JP-INPUTに渡し、
3. ALLOW-JP-INPUTチェインでは許可したものだけをRH-Firewall-1-INPUTに渡す

という風にする。
というわけで、まず /etc/sysconfig/iptables は、こんな感じ。
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:ALLOW-JP-INPUT - [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -s 127.0.0.0/8 -j ACCEPT
-A INPUT -s 192.168.0.0/16 -j RH-Firewall-1-INPUT #これはローカルネットワークの許可用
-A INPUT -j ALLOW-JP-INPUT
-A INPUT -j DROP
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
(略)
 そして、{{{ALLOW-JP-INPUTチェインを生成する}スクリプトを作る}スクリプトを作る}。ややこしい。起動毎に適用したいので、/etc/sysconfig/iptabels-allowjp にフィルター内容を保存することにして、そのスクリプトを作るためのスクリプトを(get-iptable-jp.sh)作成。スクリプト get-iptable-jp.sh によって、スクリプト iptabels-allowjp が作成され、iptables の起動毎に iptabels-allowjp を実行させる、ということだ。
#!/bin/sh
wget -q -O - http://nami.jp/ipv4bycc/cidr.txt.gz |\
gzip -d |\
grep "JP" |awk '{print "iptables -A ALLOW-JP-INPUT -p all -s ",$2," -j RH-Firewall-1-INPUT"}'\
> /etc/sysconfig/iptables-allowjp
 次いで、/etc/rc.d/init.d/iptables に、起動時にJPフィルターを適用するように変更を加える。start() 内で、
:
if [ -n "$IPTABLES_MODULES" ]; then
echo -n $"Loading additional $IPTABLES modules: "
ret=0
for mod in $IPTABLES_MODULES; do
echo -n "$mod "
modprobe $mod > /dev/null 2>&1
let ret+=$?;
done
[ $ret -eq 0 ] && success || failure
echo
fi

if [ -s /etc/sysconfig/iptables-allowjp ]
then
/bin/sh /etc/sysconfig/iptables-allowjp
fi

touch $VAR_SUBSYS_IPTABLES
:
 以上のものが出来たら、get-iptable-jp.sh を実行してJPフィルター設定スクリプトを作成した後、service iptables restart。iptables -nL でフィルターが出来ているか確認する。

 アドレスの割り当ては変更されることがあるので、何日かに1回定期的に、get-iptable-jp.sh をしてiptablesをrestartするように、cronを回しておくとよい。
posted by usoinfo at 10:05 | Comment(0) | 開発 | このブログの読者になる | 更新情報をチェックする