2016年7月15日金曜日

Vpnの方は動くようになった

openvpn はまあまあ快調である。
ただ wake on lan はやっぱり効かない。lanには接続できているブロードキャストが届かない。
スイッチングハブかコンバーターかvirtualbox ブリッジのどれかの時点で学習してブロードキャストをブロードキャストせず知らんという奴がいてそう。
ノートPCのポートに到着してなさそう。
スイッチングハブはそもそもipアドレス面倒みないのでarpを削除してしまえば、こいつが犯人では無いと思う。
bridgeも然り。またrpi に送ってもらっても届かないので経路地図的に可能性は低い。プラネックスが怪しい。コンバーターも本来いらんことをしないがプラネックスのmf300nは信用ならない。なんかこいつがいらんことしてそう。でも確証はない。しかしこいつには前科がある。

Wake On LANが効かない事があるのは、スタンバイに入ってしまうとWake On LAN が効かなくなるのが原因だった。自分でも意識しないうちにスタンバイに入ってしまうパスがあったらしい。

ハード的にはスタンバイでもWake On LANにする方法はありそうな気もするのだけど、そこまでわからんので、スタンバイや省電力モードの設定をことごとく見直し、電源オフ、ログアウト、再起動以外を選択できないように調整した。

結果、Wake On LANが効かなくなる状況は発生しなくなった。

OpenVPNはすこぶる快調。

リモートデスクトップの方は回線の質によってパフォーマンスにだいぶ差が出る印象。

クライアントのCPUはちょっと前のATOM程度の能力があれば実用に耐えそう。

同じ有線LANネットワークでは音飛びが主な不具合だが、
無線LANになると、JPEGのようなもや付きが少し気になるようになり、
インターネット回線1Mbps くらいになってしまうと間引かれたコマのせいでだいぶカクカクする。
艦これでいうと、何回かの攻撃エフェクトがとんでいつの間にか大破してるくらいの感じ。
それでも艦これはネイティブ版よりリモートデスクトップの方が早い気もしないでもない。
オフィス関係であれば、ここまでしんどくないだろう。

通信量はかなり大きく、やっては見たが、通信量の壁をサクッと超えてしまう勢いなので、
Wifi フリースポットの無いところでは飲み会での小ネタで見せびらかす以外に使い道はなさそうな感じ。dock操作だけでたぶんパンクする。

OpenVPNも試してみる

ちょっと煮詰まったので、strongswan の方は人に訊くことにして
OpenVPNで遊ぶ。OpenVPNの方はOpenWRTでやる場合は特に簡単。
OpenWRTのHOWTOの完成度が高く、ほぼコピペでいける。

無事 Android から通信の秘密を守りながら軍事機密の多い提督業を遂行できたが、
外から接続したときは提督業は遂行できなかった。

正確に言うと外から外へはアクセスできる。外から中はできない。

中国に機密情報を漏らしながら、提督業などとあり得ないハナシだ。
チャイナの赤盾回避には使えそう。

だが、あえて敵の懐に潜り込んだまま、機密通信で指令を出したい時もあるではないか。
時には外からもLANにアクセスしたいのである。

それはOpenVPNがRouterモードで起動していてやっぱり自己の名乗るIPは外のままだから弾かれているようだ。これを回避するには2通りあるかなと思った。一個はブリッジモードでOpenVPNを使うかもう一つはOpenVPNで作ったトンネルデバイス毎にNATを設定してやる事かな。

~~~~

(7/21 追記)
これはpush route add 198.168.1.1/24
みたいなのを設定ファイルに書く事で実現できるので↓の思考は無駄であった。
push route add openwrt で検索。

~~~

Googleで調べたら、こんなのが出てきた。

OpenVPNクライアントをゲートウェイとして、LAN内の別クライアントがVPN先のマシンにアクセスする

こいつは素晴らしい。
でもdefaultに設定されてないトンネルデバイスはNATの対象にならないため、サーバ側と逆のハナシになるみたいでちょっと違うな。

デフォルトゲートウェイはあってるが、割り当てたtunインターフェイスについてNATしてほしい。

2016年7月14日木曜日

Windows 10 でWifiが起動直後だけつながらない場合の対処法

Windows 10 が起動直後だけネットにつながらないマシンがあった。

ルータのOpenWRTとバッファローのWHR-300HPの組み合わせはド安定しているからルータの責任ではない。
1日2回再起動していたのがウソのようで何週間もほったらかしで再起動の必要もない状態。

ちなみに電源OFFのあとの起動は繋がらないが、リブート直後はつながる。

VISTAではちゃんと動いていたので、たぶん高速起動が原因っぽい。

高速起動OFFにして様子見。

今のところ問題無さそう。

たぶん治るだろう。

ところでバッファローのルーターは完璧ではないけどなかなか好きだな。
また買うかもしれない。遊べるルーターなので。

安定度でいうと?なのだけど、使えないほどではないし、使用者も多いので前評判を得やすい。さらにOpenWRT等のフリーのファームが対応している確率が高く、完全に使えないゴミクズにはなりにくい。elecom とは違うのである。

フリーのファームウェアOpenWRTはうまく動けばかなり安定性が高い。

300HPの方は標準ファームウェアではルータとしての機能、安定性では一流メーカーには及ばないだろうが値段が倍以上するのであまり比べてあげるのはかわいそう。

腐ってもアクセスポイントとしての安定度は素晴らしいので有線ルータで安定性の高いものと組み合わせればそれなりに使えて、ダメージ無いのがいい。

2016年7月13日水曜日

CA Cert はふつうの認証ファイルではないとかぐだぐだぐだ

L2TP/IPSecを諦めて Public key によるサイト認証の設定してる。
L2TP諦めたけど、なんだか、もうちょっと頑張るべきだったか。

サーバ側のログの見方が少しわかってきたので、もう少し頑張るネタあったかもと思ったり。

ipsec.conf の

config setup セクションに

charondebug="ike 2, knl 2, cfg 2, net 2"

を書き込んだ後で、ipsec restart をする。

↑に書いてある。他にも出力を制限したり増やしたりできるオプションはある。

出力に設定したログは
openwrt では cat や tail -f で見る感じではない。
ふつう/var/log/messageとかかと思ってたけどそんなファイルない。

logread というコマンドを打てば読める仕組み。

ストレージが小さいからそうしたのかも。

さて、サーバー認証をやっているが、なかなかこれもうまくいかない。

仕組みが難しい。

openssl を勉強する。

http://d.hatena.ne.jp/ozuma/20130511/1368284304
等をみてカギ、認証要求、証明書等用語の意味と作り方はだいたいわかってきたのだけど、
ただ、CA 認証ファイルはふつうの認証ファイルとして作成してはいけないようなので完全に正確ではないようだ。

ソフトによってはbasic constraints に引っかかって無視される。
strongswan もbasic constraints に従わない証明書は受け付けないみたい。

なので

strongswan でも通るCA証明書を作るには別の方法が要りそうだ。
http://int128.hatenablog.com/entry/20090117/1232124815
これかなあ。

ざっと見た感じ、CA.sh で作って見てそれでもおかしくなるのであれば、別の方法考える。

ちなみに cygwin 32bit の openssl の場合、CA.sh がどこだか分らなかったので、
find . | grep CA.sh
してみたところ
/usr/ssl/misc以下みたいで

openssl 関係のファイルは
/usr/ssl以下を探ればいいということらしい。

あと、32bitのPCで使ってる方のVirtualBoxがどうしてもVMにUSBデバイスを割り当てできない。
64bit の Intel CPUのほうは全く問題なくデバイスの割り当てができるが、
AMD のC60のほうではまるでダメ。
たぶんVirtualboxが動く最低スペックなので文句が言える立場でもない気がする。

で、Cygwinで出力した認証ファイルをopenwrtに持ち込むのに難儀した。

wget でやり取りするとか
もっとトリッキーにiso ファイルでやり取りするとか。

iso でやり取りする場合は

cygwinにmkisofs をインストールして

mkisofs -r -o cert.iso ./path_to_cer_folder
したのち cert.iso ファイルを GuestAdditions.iso みたいな感覚でマウントしてあげればよい。
-r オプションが無いとファイル名が短くなって使いづらい。

openwrt には fstab が無いのでマウント時は全部オプション指定しないと文句言われる。

mount /dev/sr0 /mnt -t iso9660

cd /mnt

このあたりのコマンドは最近のLinuxは打つ必要がないので久しぶりな感じ。

raspberrypi に nfs とか入れてみたいけどなー。

認証局の管理ツール。

http://www.openvpn.jp/vpnux-pki/

これ良さそうだ。

2016年7月12日火曜日

L2TP/IPSecなサーバを立てたい(迷走メモ) Vol.4

作業記録。めちゃくちゃな走り書き。VOL4

★★★ Step 10 L2TP は諦める ★★★

13:11:41.633586 IP 192.168.1.156.56747 > 192.168.1.32.1701:  l2tp:[TLS](0/0)Ns=0,Nr=0 
*MSGTYPE(SCCRQ) *PROTO_VER(1.0) *HOST_NAME(anonymous) *FRAMING_CAP(AS) *ASSND_TUN_ID(31946) 
*RECV_WIN_SIZE(1)
13:11:41.633688 IP 192.168.1.32 > 192.168.1.156: 
ICMP 192.168.1.32 udp port 1701 unreachable, length 105
13:11:41.634490 IP 192.168.1.156.56747 > 192.168.1.32.1701:  l2tp:[TLS](0/0)Ns=1,Nr=0 
*MSGTYPE(StopCCN) *ASSND_TUN_ID(31946) *RESULT_CODE(6)
13:11:41.634542 IP 192.168.1.32 > 192.168.1.156: ICMP 192.168.1.32 udp port 1701 unreachable, length 72

どんなに設定を見直しても OpenWRT 側 Firewall で1701のポートが閉じているなどという事は無いように思う。port unreachable で見直すのはたぶんfirewall だけではないのではないか?もしfirewall を適切に設定していたとしても、port unreachable が発生するパスがあるような気がするのだけど、全く確証もない。なんにせよ、Android から要求があった時点でポート1701の準備ができてないのは間違いないようで、それ以上何もヒントがなくなってしまった。

Android の期待するシーケンスと、strongswan の期待するシーケンスが違うのではないかって気がするのだが、確証はない。
設定によって避けれるのかどうかもよくわからなかった。strongswan と違ってandroid の方は特にエラーメッセージも吐かないし。

L2TP/IPSec はもうちょっとデファクトスタンダードな、これを選べば間違いないものが決まってきたらいいんだろうけど、そういうのが無い。IKE のバージョンやら plute charon やら NAT Traversalやら認証方式も暗号化や、使えるソフトも多すぎてよくわからない。

みんなが使うであろう一番簡単なオプションを選択しているつもりでもわずかに違うものを選択するだけで動かなくなる可能性がある。バージョンアップなどで動かなくなるリスクもかなり高い。メールサーバ以上に設定が疲れる。
とりあえずL2TPを使う事はいったん忘れることにする。

いつかまたやるかも。

L2TP/IPSecなサーバを立てたい(迷走メモ) Vol.3

作業記録。めちゃくちゃな走り書き。VOL3

★★★ Step.9 fresh install again 5回目★★★

設定がごちゃついてきたのでまたVirtualBox に OpenWRTインストール。

5回目。寝ていてもできそうだ。

IPSec の設定が難しいというのはやっぱりステップバイステップで動作確認しながら設定するのが難しいからだと思う。もし、仮想PCのソフトが無い時代だったらほんとに吐きそうになっただろうな。

ハードディスクの初期化だけじゃなくて配線とかもしないといけないわけだし。

今日はAndroid との接続を試してみているがどうにもつながらない。

今日のダメ記録
13:11:41.633586 IP 192.168.1.156.56747 > 192.168.1.32.1701:  l2tp:[TLS](0/0)Ns=0,Nr=0 
*MSGTYPE(SCCRQ) *PROTO_VER(1.0) *HOST_NAME(anonymous) *FRAMING_CAP(AS) *ASSND_TUN_ID(31946) 
*RECV_WIN_SIZE(1)
13:11:41.633688 IP 192.168.1.32 > 192.168.1.156: 
ICMP 192.168.1.32 udp port 1701 unreachable, length 105
13:11:41.634490 IP 192.168.1.156.56747 > 192.168.1.32.1701:  l2tp:[TLS](0/0)Ns=1,Nr=0 
*MSGTYPE(StopCCN) *ASSND_TUN_ID(31946) *RESULT_CODE(6)
13:11:41.634542 IP 192.168.1.32 > 192.168.1.156: ICMP 192.168.1.32 udp port 1701 unreachable, length 72

156の方がアンドロイドマシン で.32の方がxl2tpd + strongswan の方
android が繋ごうぜって言ってる気がするのだが
サーバの方が、さっきのパケットは届かなかったみたいな返答してじゃあやめる
ってなってる気がするんだよね。

ただ、ファイヤーウォールとか1701INPUT ACCEPT 設定にしてるんだけどなんで弾くのか。
即答で着かないってくそー。オレのPCヤギが棲んでるな。

L2TP/IPSecなサーバを立てたい(迷走メモ) Vol.2

作業記録。めちゃくちゃな走り書き。VOL2

★★★ Step.6 StrongSwan以外に必要そうなヤツいれる ★★★

vpn.ipsec.basics 

strongswan のインストール時がちょっと変だったが
vpn.ipsec.basics にも strongswan ではなく strongswan-defaultと書かれているので
strongswan-defaultのインストールが成功し、
strongswan パッケージのインストールが失敗したけどまあいいか。

(後記:strongswan パッケージは無視して、strongswan-full をインストールすべし、strongswanパッケージは-fullを入れれば勝手に入る。入れないとコンフィギャ失敗する)

StrongSwan以外にip、iptables-mod-nat-extra、djbdns-toolsが要るようだ
 
opkg update
...(略
opkg list ip
opkg install ip


opkg list iptables-mod-nat-extra
opkg install iptables-mod-nat-extra


opkg list djbdns-tools

むむむむ、んなファイル無い。
djbdns-tools は何故必要とされていたんだろうか?

現状このパッケージは無視の方向。

diff を使いたいので

opkg install diffutils

★★★ Step.7 OpenWRTなマシンをもう一つ作る ★★★

ここまで来て気づいたが、IPSecを試験するには単体では無理だ。
VMをクローンする

Oracle VM Virtualbox マネージャ

仮想マシンを選択して クローン(O)
全てのネットワークカードのMACアドレスを再初期化(R)にチェック

シリアルポートの パス/アドレスを変更
\\.\pipe\vbox2

クローン先のネットワークアダプター2はクローン元のアダプター2と独立している必要がある。
Oracle VM Virtualbox マネージャ
ファイル(F)⇒環境設定(P)⇒ネットワーク⇒ホストオンリーネットワーク(H)→+追加
アダプター(A) IPv4 アドレス 192.168.178.2 ネットマスク 255.255.255.0

クローンを起動
/etc/conf/network

config interface 'lan'
        option ifname 'eth1'
#       option type 'bridge'
        option proto 'static'
        option ipaddr '192.168.178.1'
        option netmask '255.255.255.0'
        option ip6assign '60'

ここで構成図を書き直した方がいいんだろうな。
HostOnly1[192.168.254.2]<->[192.168.254.1]OpenWRT1[192.168.1.202]<->[192.168.1.116]OpenWRT2[192.168.178.1]<->[192.168.178.2]HostOnly2

で、ホストからはHostOnly
以外に192.168.1/24にもアクセスできる状態。
この状態でOpenWRT1をネットワーク192.168.254.0/24 へのゲートウェイトしてOpenWRT2からIPSec を試みる。




★★★ Step.8 最低限のIPSec connection★★★

ドキュメントを読んでいるとなんかIPSec = VPN という気がしない。
VPNを達成するのにIPSec を使っているだけであって本来は
Ethernet 接続を セキュアにする目的。
そこが設定が難しいと言われる根源なのではないかという気がしてきた。

ikev1 PSK IPv4

の例を参考にする。
OpenWRT1が moon 的位置づけ
OpenWRT2が carol という事になるんだろうなあ。

まずファイヤーウォールをどげんかせんといかん。
まず、INPUT,FORWARD,OUTPUT DROP,REJECT,ACCEPTの意味もよくわかっとらんので
Linuxで作るファイアウォール[パケットフィルタリング設定編] (1/2)
を読んでみる
おそらくここの設定がOpenWRT の FireWall 設定General Setting のところになるだろうか。
OpenWRT1のWAN->LANは自らサービスを提供するから INPUTはACCEPTにしなければならないだろう。
OUTPUTもACCEPTでいいだろう。FORWARDもACCEPTでいいか。
NAT が要るか要らないか。
現段階では192.168.1.0/24のネットワークだけのハナシで要るようなきがしない。
HostOnlyNetworkにつなぐようになる場合も
適切にStatic Routeを設定さえすれば、いいのではって気がする。
今はとりあえずOFFにしておく。

OpenWRT1は ipsec を誰かに任せるわけではないので今のところPortForwardも設定不要か。

OpenWRT2の方は実際に指定するIPが違うだけでパターンは同じで良さそうだな。

現段階ではかなりのノーガードになってしまうが、こいつがすぐにFirewallになる事もないしDMZに配置されることもないから、遊んでる現状ではこれでいいだろう。
不要なポートの戸締りは実用化段階で検討。

OpenWRT1
/etc/ipsec.conf
config setup
        # strictcrlpolicy=yes
        # uniqueids = no
conn %default
        ikelifetime=60m
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev1
        authby=secret

conn openwrt2
        also=rw
        right=192.168.1.116
        auto=add

/etc/ipsec.secrets
# /etc/ipsec.secrets - strongSwan IPsec secrets file

192.168.1.202 192.168.1.116 : PSK 0sFpZAZqEN6Ti9sqt4ZP5EWcqx

OpenWRT2
/etc/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file

# basic configuration

config setup
        # strictcrlpolicy=yes
        # uniqueids = no
conn %default
        ikelifetime=60m
        keylife=20m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev1
        authby=secret

conn home
        left=192.168.1.116
        leftfirewall=yes
        right=192.168.1.202
        rightsubnet=192.168.254.0/24
        auto=add

/etc/ipsec.secrets
# /etc/ipsec.secrets - strongSwan IPsec secrets file

192.168.1.116 : PSK 0sFpZAZqEN6Ti9sqt4ZP5EWcqx


以降 OpenWRT2から実行

ipsec restart

ipsec up home


なんかつながってはいるようだ。
ただ、暗号化されているかパケットが見えない。
oot@OpenWrt:/etc# ipsec status
no files found matching '/etc/strongswan.d/*.conf'
Security Associations (1 up, 0 connecting):
        home[1]: ESTABLISHED 11 minutes ago, 192.168.1.116[192.168.1.116]...192.168.1.202[192.168.1.202]
        home{1}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: c326ca0a_i c3dc83fc_o
        home{1}:   192.168.1.116/32 === 192.168.254.0/24
root@OpenWrt:/etc# ping 192.168.254.2
PING 192.168.254.2 (192.168.254.2): 56 data bytes
^C
--- 192.168.254.2 ping statistics ---
15 packets transmitted, 0 packets received, 100% packet loss

うーんPINGが通らない。192.168.254.1へは通るようになったが…。

問題切り分けのためにOpenWRT1からtraceroute をすると traceroute 192.168.254.2 が通らない。
traceroute を試してみたがbusybox の traceroute は -I オプションでもICMPを送らないような設定にできるらしく、OpenWRTのbusybox もビルドオプション見てない
CONFIG_FEATURE_TRACEROUTE_USE_ICMP was set to n っぽい。
busybox は Trace route は UDP ガチガチでICMPと結果は違うものになる。

WindowsファイヤーウォールをOFFにしたら traceroute が通るようになったかも。
まさかと思ったがWindows firewall 仕事してるんだ…。

でもやっぱりOpenwrt2 192.168.1.116から192.168.254.2へはPINGもtracerouteも通らない。

Secure connection は張れてるっぽい。でも接続先のGatewayがFirewallになってしまっている状態。

route の設定をちゃんとしても、ポートの設定をどうやって設定してもそっから先に
Pingが飛ばなかった。

うーんとにかくやたらめったにコマンドを打って様子を観察した。

wiresharkをやろうと思ったが、流石にハードルが高いのでtcpdump で観察したり。

原因の一つはルートをちゃんと設定できてなかったこと。
クライアント側はデフォルトルートをIPSEC接続先に変更するくらいの事をして観察すれば、一応は、IPSec 接続先までは暗号化されており、その先へのパケットも飛んでいることがわかる。
だが、問題は接続先の接続先のLANはICMP echo response を返さない事。

何故ならば接続クライアントはPINGパケットを相変わらず自分のIPを設定して送るようだ。GatewayはちゃんとヨソのLANに投げ直してくれているのだけど、応答する側が無視している。
ubuntu 等を見ていると、インターフェイスと同じネットワーク上の端末からのICMP echo request
にはICMP echo responseを返しているようだが、得体の知れないecho request に対しては全くのだんまりであることがわかった。

そういう事であれば
ikev1 PSK IPv4
の設定というのはそのままではなかなかPINGが通らない。という事になるかもしれない。
返事をしてもらうにはNATが要るのだ。
WANからのパケットのIPをLANのIPに書き換え
WANへのパケットのIPを書き戻す設定が必要なのだ。

NATは無くてもパケットは送れる。でも誰も応答してくれない。

ふつうのブロードバンドルータのNATとは逆の考え方になる。
ふつうは中から外なのが、外から中になるわけだから。

でもやっぱりもっといい方法があるハズだ。根本的な問題は、Roadwarrior が内部LANのメンバーになりきれていないという事で、ヨソモノのIPを使っており総スカンを食らっているのが原因だ。

VirtualIPにせよxl2tpd にせよ ローカルネットワーク用のアドレスを割り当ててもらう機能があるハズだから、とりあえず strongswan の根本的な機能を学習できたし、次に進もうかと思う。