Google Code Prettify

2007年3月7日

Linux クライアントからIPSec Tunnel接続をする

昨日からの続きで、IPSec-VPNにLinuxクライアントで繋いでみる。

まぁ、Linuxでもやりたいことは、

Develop Domain:192.168.1.0/24
<---->
192.168.1.1:ルータ:XX.XX.XX.XX
<==[IPSec Tunnel]==>
YY.YY.YY.YY:クライアントPC:192.168.150.201/32

な感じだけども、、、 参考なるそうなページを検索すれど、IPSec トランスポートモードだったり、ルータ間のIPSecトンネルだったり、PPTP使っていたりと、イマイチよさげな情報は無し。

基本から組み立てて行かねばなんないのかぁ。

IPSecとは AH + ESP + IPcomp + IKE だそうだが、使う側が理解すべきなのはもっとある。難解なのはウサギとカメの陰謀だと思う。

  • IPSec を利用する通信はどれかを Security Policy Database (SPD)で指定する。このとき transport/tunnel モード等も指定する。
  • IPsec を利用する通信のセキュリティパラメータをSecurity Association Database(SAD)で指定する。暗号化方法や鍵等が含まれる。
  • SPD は setkey ツールで指定する。
  • SAD は setkey ツールを使って手動で指定していできるが、大抵はIKEを利用する。racoonやisakmpd とかのIKEデーモンを使って自動的に指定する。
  • IKEを利用する場合は、事前共有鍵、PKI、Kerberosとかの認証とSAの種別を指定する。

順番に設定すれば良いのだが一番悩むのはIPSecを利用する通信をどう作るのか?

何?禅問答みたいなこと言っているのだろう?

俺もそう思う。

ルータ間の接続では、

Develop Domain:192.168.1.0/24
<---->
192.168.1.1:ルータA:XX.XX.XX.XX
<==[IPSec Tunnel]==>
YY.YY.YY.YY:ルータB:192.168.2.1
<---->
Outer Domain:192.168.2.0/24

になっているので、ルータB 上を通過する通信 192.168.1.0/24 <=> 192.168.2.0/24 が発生させることはそんなに難しいことではない。ルータBがOuter Domainのデフォルトゲートウェイであれば良く、大抵そんなもんだ。

もう一つ心に留める必要があるIPSec Tunnelの挙動として、SPD にマッチした通信は勝手に横取りされて、トンネルで指定された端点間のIPSecのパケットとして流されてしまいます。そう!何処を流れるハズだったには関係なく!!

クライアントPCの場合を同様に考えると、通信を192.168.1.0/24 <=> 192.168.150.201/32 をいかに発生させるかが鍵だと思う(だれもそんなこと言っていないので間違ってるかも)。

ルータAにはRTX1100を使っているので、tunnel デバイスへのルーティングとかは設定してある。

ip route 192.168.150.201 gateway tunnel 1

クライアントPCで、考えられる設定は3種類です(もっとあるかも)。

  • iptunnel を使う方法
  • 疑似デバイス dummy を使う方法
  • ip alias を使う方法

iptunnel を使う方法

iptunnel add ipsec0 mode ipip remote 1.1.1.1
ifconfig ipsec0 192.168.150.201 netmask 255.255.255.255
route add -net 192.168.1.0/24 dev ipsec0

実際にはIPSecに横取りされるので、特に ipip 以外でも良く、対向の端点アドレスもなんでも良い。

こいつは良く例に上げられている。FreeBSD/NetBSDの場合 gif0 とか使っている。

疑似デバイス dummy を使う方法

modrpobe dummy
ip link set dummy0 name ipsec0
ifconfig ipsec0 192.168.150.201 netmask 255.255.255.255
route add -net 192.168.1.0/24 dev ipsec0

dummyは来るパケットを全部破棄する疑似デバイスで、昔SLIPとかで使っていたみたい。好き者が、ネットワーク検証とかで使っているのしか見たこと無いなぁ。

こいつを使っている例は見たことが無い。偶然出来ただけなのかも。

ip alias を使う方法

ifconfig eth0:1 192.168.150.201 netmask 255.255.255.255
route add -net 192.168.1.0/24 gw 192.168.150.201

こいつを使っている例は見たことが無い。どこかに落とし穴があるかも。

上のどれでも良いと思う。というか推奨とか何処にも書いていない、、、、多分陰謀だ。

本当は、iptunnel の mode にipsec-tunnel とかがあって、SPDにtunnelモードの設定が追加された時点で自動的に追加されるのが親切な気がする。。。

そう言えば RTX1100から、VPN通信用のIPアドレスを動的に割り振れないので、固定して考えていたので3つ上げたが、正当な方法が別にありそうである。。。絶対陰謀だ。

取り敢えず、どれかの方法を決めたあとは簡単

/etc/ipsec-tools.conf で、SPDを作成

#!/usr/sbin/setkey -f
flush;
spdflush;

spdadd 192.168.150.201 192.168.1.0/24 any -P out ipsec
            esp/tunnel/YY.YY.YY.YY-XX.XX.XX.XX/require;

spdadd 192.168.1.0/24 192.168.150.201 any -P in ipsec
            esp/tunnel/XX.XX.XX.XX-YY.YY.YY.YY/require;

/etc/racoon/psk.txt に事前共有鍵を

XX.XX.XX.XX * (RTX1100と同じ文字列)

/etc/racoon/racoon.conf に、IKEデーモンの設定

path pre_shared_key "/etc/racoon/psk.txt"

remote XX.XX.XX.XX {
   exchange_mode aggressive;
   my_identifier fqdn "PCNAME"
   proposal {
       encryption_algorithm aes;
       hash_algorithm md5;
       authentication_method pre_shared_key;
      dh_group modp1024;
   }
}

sainfo anonymous {
    pfs_group modp1024;
    encryption_algorithm aes;
    authentication_algorithm hmac_md5;
}

てな具合で、クライアントPC から Develop Domain に ping を打つと、クライアントPCのログに、

racoon: INFO: initiate new phase 1 negotiation: YY.YY.YY.YY[500]<=>XX.XX.XX.XX[500]
racoon: INFO: begin Aggressive mode.
racoon: NOTIFY: couldn't find the proper pskey, try to get one by the peer's address.
racoon: INFO: ISAKMP-SA established YY.YY.YY.YY[500]-XX.XX.XX.XX[500] spi:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
racoon: INFO: initiate new phase 2 negotiation: YY.YY.YY.YY[500]<=>XX.XX.XX.XX[500]
racoon: INFO: IPsec-SA established: ESP/Tunnel XX.XX.XX.XX[0]->YY.YY.YY.YY[0] spi=xxxxxxxx(0xXXXXXXX)
racoon: INFO: IPsec-SA established: ESP/Tunnel YY.YY.YY.YY[0]->XX.XX.XX.XX[0] spi=xxxxxxxx(0xXXXXXXX)

が出れば、IPSec Tunnel のできあがり。

2007年3月5日

RTX1100 でIPSec-VPNを構築する

IPSecを使ってVPNを構築をしようとRTX1100を購入したのだが、買った満足感でそんな事をすっかり忘れて放置していた。だが、勿体ないお化けが出てきたので、RTシリーズの設定事例集を参考にIPSec-VPNを設定してみた。

VPNを構築する方法が多々あるようだが、

  • IPSec トランスポートモード
  • IPSec トンネルモード
  • L2TP over IPSec
  • PPTP
  • IP-IP
  • GRE
  • etc

で、今回構築してたのは IPSec トンネルモードっす。

現在のネットワーク構成は、次の通り。

  • ルータはPPPoEによりInternet に接続されている。
  • ルータの配下にはHome/Developのドメインがある。
  • ルータのWAN側には固定のIPアドレスが割り振られている。
  • Home ドメインには192.168.0.0/24 が、Develop ドメインには192.168.1.0/24 が割り振られている。
  • Home, Develop => Internet はルータ上のNAT変換により通信できる。
  • Home, Develop はルータ上で適当なフィルターを切ってある。

blog20070305-network-diagram

で、お外のPCからIPSecでDevelopドメインと疎通できれば良いのだが、 Home ドメインからからIPSec接続でDevelopドメインと疎通しても、 一応目的を達成できる。

クライアントに関しては、Windows とLinuxを考えている。 ついでに言うならば、Windows 用のものはNET-G Secure VPN Clientを既に購入している。ヤマハのVPNクライアントソフトは、こいつのOEM版らしいので、今ならばこいつを使うのも可だと思う。Windows 標準のIPSec では、IKE の mainモードしか対応してないっぽいので、動的IPを持つ場合はうまくいかないそうな。

やりたいことは、端点のクライアントPCに仮想IPアドレスとして192.168.150.201 を付与して、

Develop Domain:192.168.1.0/24
<---->
192.168.1.1:ルータ:XX.XX.XX.XX
<==[IPSec Tunnel]==>
YY.YY.YY.YY:クライアントPC:192.168.150.201/32

な感じかなぁ。

ヤマハの設定例を参考にしてRTX側での設定は、

# インタフェースの設定
ip lan1 address 192.168.0.1/24
ip lan2 address 192.168.1.1/24

# PPPoEの設定
pp select 1
pppoe use lan3
... (ISPに応じた設定、固定IP XX.XX.XX.XX をもらう)
ip pp nat descriptor 1
pp enable 1

# NAT設定
nat descriptor type 1 masquerade
nat descriptor address inner 1 192.168.0.1-192.168.0.254 192.168.1.1-192.168.1.254 192.168.150.201
nat descriptor masquerade static 1 1 192.168.1.1 udp 500
nat descriptor masquerade static 1 2 192.168.1.1 esp

# IKE
ipsec auto refresh on
ipsec ike encryption 1 aes-cbc
ipsec ike group 1 modp1024
ipsec ike pre-shared-key 1 text *    (事前共有鍵)
ipsec ike remote address 1 any
ipsec ike remote name 1 PCNAME      (クライアントの名前)
ipsec sa policy 101 1 esp aes-cbc md5-hmac

# Tunnel 設定
tunnel select 1
ipsec tunnel 101
ip route 192.168.150.201 gateway tunnel 1
tunnel enable 1

ここでは、クライアントの名前を PCNAME で、仮想IPは 192.168.150.201 と考えている。 複数クライアントの同時接続を考えているならば、tunnel 設定を増やしていけば良い。

設定例を参考にパラメータを合わせれば、問題なくVPN接続は疎通する。 はまりポイントとしては、ルータ側のNAT処理の内側アドレスに対向アドレスを追加していないと、インターネットとの疎通が取れなくなる。これは、FAQにもなっており、クライアントソフトの設定でも回避できるそうなぁ。

2007年3月4日

知らぬ間に Raid が再構築!!

Linux のソフトウェアRAIDを使っているファイルサーバが、何故か負荷が高い気がしてたので、ログを見てみると

Mar  4 01:06:02 aquarius kernel: md: syncing RAID array md0
Mar  4 01:06:02 aquarius kernel: md: minimum _guaranteed_ reconstruction speed: 1000 KB/sec/disc.
Mar  4 01:06:02 aquarius kernel: md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for reconstruction.
Mar  4 01:06:02 aquarius kernel: md: using 128k window, over a total of 32009408 blocks.
Mar  4 01:06:02 aquarius kernel: md: delaying resync of md1 until md0 has finished resync (they share one or more physical units)
Mar  4 01:06:02 aquarius kernel: md: delaying resync of md3 until md0 has finished resync (they share one or more physical units)
Mar  4 01:06:02 aquarius kernel: md: delaying resync of md1 until md3 has finished resync (they share one or more physical units)
Mar  4 01:14:28 aquarius kernel: md: md0: sync done.
Mar  4 01:14:28 aquarius kernel: md: syncing RAID array md3

って、何か知らんけど、RAID の再構築をなさっておられます!!

可なり焦ったけれども、良くログを見直すとその直前に cron スクリプトが動いてることを発見。

Mar  4 01:06:02 aquarius /USR/SBIN/CRON[27227]: (root) CMD ([ -x /usr/share/mdadm/checkarray ] && [ $(date +%d) -le 7 ] && /usr/share/mdadm/checkarray --cron --all --quiet)
Mar  4 01:06:02 aquarius kernel: md: syncing RAID array md0
Mar  4 01:06:02 aquarius kernel: md: minimum _guaranteed_ reconstruction speed: 1000 KB/sec/disc.

checkarray とは何ぞや、、、。

なんと、第一日曜日の1:06 に実行される checkarray が冗長性のあるRAIDをエラーチェックするそうな。 Linux君は大雑把なメッセージを吐くので、直ぐには再構築とチェックを区別できないそうな。

詳しく区別したい場合は、

# echo /sys/block/md3/md/sync_action
check

で確認でき、チェックを行っていますねぇ。 HDDが逝ってしまった訳では無いようです。

いつからそんな風になったんだぁ、、、。

久しぶりの投稿

かなり期間が空いてしまったが、ブログを再開してみようと思う。 2013年3月が直前の投稿だったが、頻繁に更新していた時期が 2011年11月までなので、8年間ぶりとなる。 8年間なにをしていたのかと言えば、2回転職して未だにIT技術者の職を得ている。 その...