
※このドキュメントは FreeS/WANのコンフィグレーション を読んでいることを前提としています。
NATされた内側ではFreeS/WAN は利用できないと思っていましたが、コンフィグレーション次第で可能なことがわかりました。以下にその設定と注意点を示します。
※NATされた環境ではパケットのヘッダを書き換えるため、AH(Authentication Header)プロトコルが使えないだけで、FreeS/WANのデフォルト動作であるESP (Encapsulating Security Payload)プロトコルは正常に使えます。
So-net ADSL 8Mコースを使用しました。使用したルータは NEC ATUR110RC です。下記でルータの設定変更について触れていますが、これは提供されるルータによって異なるため、適宜読み替えて下さい。まあ静的NAT機能があれば大丈夫だと思います。また、現在使用しているグローバルIPアドレスを何らかの形で知る手段が必要になります。これはダイナミックDNSの更新のためです(後述)。具体的なネットワーク構成は下記の通りです。
*********************************************************************************************
left subnet ============ NAT box ---------- SG1 ------- router --<Internet>...
172.16.0.0/16 172.16.0.3 | 4.3.2.2 4.3.2.1 4.3.2.8
...<Internet>----- So-net ADSLルータ(NAT) ------- SG2/NAT box ============= right subnet
アドレス不定 | 10.0.0.1 10.0.0.2 | 192.168.1.1 192.168.1.0/24
(mydomain.dyndns.org)
*********************************************************************************************
フレッツの場合はPPPoEなので、ADSLモデムに接続されたPCが直接グローバルIPアドレスを取得しますが、So-net
ADSL 8Mの場合はルータタイプとなるため、クライアントが取得するIPアドレスはルータからDHCPでローカルなIPアドレス(デフォルトは192.168.1.0〜)が割り当てられます。クライアントからのパケットはルータの内部でNATされて外に出ていくわけですが、このままでは外からアクセスすることができません。そこで、ルータの設定で静的NAT(static
NAT)を利用することにしました。
はじめに静的NATで使用するIPアドレスを決定します。これはローカルアドレスでかまいませんが、目的のVPNのサブネットとは違うものにします。上記例ではクラスAを使用し、ルータに
10.0.0.1、静的NAT用に 10.0.0.2 を割り当てています。NECのルータにはDMZ機能というのがあり、とにかく全部のパケットを静的NATされたマシンに送る、という設定があったのでこれを使いました。他のルータの場合も同様の設定でいいと思います(もちろん後で個別にフィルタリングしてもかまいません)。
ルータ内側に設置するSGのルータ側のネットワークインターフェイスに静的NATで転送されるアドレスを設定します。この時点でVPN側(192.168.1.0)に接続したクライアントからWebブラウズなどが可能なことを確認しておいた方が良いでしょう。静的NATがうまくいったなら、ipsec.conf を定義します。
| SG1側(left) ipsec.conf | SG2側(right) ipsec.conf |
|---|---|
# basic configuration
config setup
interfaces=%defaultroute
klipsdebug=none
plutodebug=none
plutoload=%search
plutostart=%search
uniqueids=yes
# defaults for subsequent connection descriptions
conn %default
keyingtries=5
authby=rsasig
# sample VPN connection
conn sample
left=4.3.2.1
leftnexthop=%defaultroute
leftsubnet=172.16.0.0/16
leftrsasigkey=abcdef...省略
right=mydomain.dydns.org
rightsubnet=192.168.1.0/24
rightrsasigkey=ghijkl...省略
leftid=@sg1.sample.com
rightid=@sg2.sample.com
auto=add
|
# basic configuration
config setup
interfaces=%defaultroute
klipsdebug=none
plutodebug=none
plutoload=%search
plutostart=%search
uniqueids=yes
# defaults for subsequent connection descriptions
conn %default
keyingtries=5
authby=rsasig
# sample VPN connection
conn sample
left=4.3.2.1
leftsubnet=172.16.0.0/16
leftrsasigkey=abcdef...省略
right=%defaultroute
rightsubnet=192.168.1.0/24
rightrsasigkey=ghijkl...省略
leftid=@sg1.sample.com
rightid=@sg2.sample.com
auto=start
|
この中のleftid, rightid は、相手SGを特定するためのIDで、@から始まったドメインとして記述します。これはあくまでIDであり、実際にDNSとして解決できるドメインにする必要はありません。
NATしていない環境との違いはありません。
NATの内側のSGだけでは、実際に自分がどんなグローバルIPアドレスを使用しているかを知る手段は(おそらく)無いか、あっても難しいと思います。このままでは、いつの間にかADSLルータ側のグローバルIPアドレスが変わった場合、ドメインが利用できなくなり通信が中断してしまいます。NEC ATUR110RC ルータでは現在のグローバルIPアドレスがWebブラウザで確認できるようになっているので、HTTPでファイルを取得できる wget コマンド(RedHat Linuxに標準で入っています)を使い、直接そのhtml 内からIPアドレスを抜き出すことにしました。以下はそのperl スクリプトです。
#!/usr/bin/perl
$fname='devicePanel.html';
system("wget 10.0.0.1/html/$fname -q");
open(DAT, $fname) || die;
while(<DAT>) {
if(/var sIpAddress=/) {
s/var sIpAddress=\"(.*)\";/$1/;
print;
last;
}
}
unlink $fname;
当然、この devicePanel.html というファイル名や var sIpAddress= などの出力はルータの種類によって内容が異なるので適宜合わせます。後はこのスクリプトを ダイナミックDNSの更新スクリプトの newip=`......` の内部で実行するようにしてやれば、同様に更新が可能です。
はじめはどうやってグローバルIPアドレスが分かるかと思いましたが、工夫次第でどうにかなるものですね。