HOME FreeS/WAN

直前のページへ戻る

NAT環境でのFreeS/WANのコンフィグレーション

※このドキュメントは 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の設定

ルータ内側に設置する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していない環境との違いはありません。

ダイナミックDNSの更新

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アドレスが分かるかと思いましたが、工夫次第でどうにかなるものですね。


HOME FreeS/WAN

直前のページへ戻る