CentOS 5.5 で Openswan を利用できない
SERVER
CentOS 5.5 で L2TP サーバーを構築したいとおもったのですけど、なにやら IPSec が正しく動作してくれていないような感じで断念でした。
CentOS 5.5 と Openswan
CentOS 5.5 で L2TP サーバーを構築しようと思い、セットアップを進めていたところ、IPSec を実現するための Openswan の稼働が上手くできない状況に見舞われました。
原因はなんとなく、CentOS 5.5 で FIPS モードが有効になっていないことにあるような感じがしますけど、その有効化などの対応方法が分らなかったので途中断念という形になりました。
なお、CentOS 6.0 では Openswan のセットアップに成功したので、これから新規に構築するのであれば、CentOS 6.0 を利用するのが良いかもしれません。それについては CentOS 6.0 で CentOS 6.0 で L2TP-VPN サーバを構築する に記します。
ここでは、CentOS 5.5 での Openswan のインストールからその失敗に突き当たるまでの経過について、メモも兼ねて記してみたいと思います。
Openswan のインストール
まず、CentOS 5.5 で IPSec を実現するには、次のようにしてパッケージ "Openswan" をインストールする必要があるようでした。
yum install openswan
Openswan がインストールされたら、まずは "/etc/ipsec.conf" の内容を確認します。
初期設定では "include /etc/ipsec.d/*.conf" という記載が "#" がついてコメントアウトされているようなので、その行を有効化して、次のような内容の設定ファイルに調整しました。
version 2.0
config setup
protostack=netkey
nat_traversal=yes
virtual_private=
oe=off
nhelpers=0
include /etc/ipsec.d/*.conf
ここで、今回は L2TP サーバー "xl2tpd" の設定ファイル "/etc/ipsec.d/l2tp-psk.conf" で、次のような設定がされているとします。
conn L2TP-PSK
type=transport
ike=3des-md5
esp=3des-md5
authby=secret
pfs=no
rekey=no
keyingtries=3
left=%defaultroute
leftnexthop=%defaultroute
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
auto=add
ここでは "authby" として "secret" を指定しているので、どうやら共有暗号鍵の設定を行う必要があるようです。ここを を "rsasig" とすることで、電子証明書による暗号方式を採用することもできるらしいですが、とりあえず今回は、共有暗号鍵を使う方向で設定して行きたいと思います。
共有暗号鍵の設定は "/etc/ipsec.d/default.secrets" というファイルを作成して、そこで行います。
: PSK "password"
これで IPSec で使用する秘密鍵のパスワードが設定できたことになると思います。
Openswan の起動
Openswan の設定が出来たら、次のようにして IPSec サービスを稼働させます。
service ipsec start
また、IPSec を Linux 起動時に自動起動されるようにするには、次のようにしておきます。
chkconfig ipsec on
Openswan の動作確認
Openswan のセットアップと起動が完了したら、次のコマンドを実行して、動作状況を確認します。
ipsec verify
すると、次のような感じで Openswan の動作状況が画面にレポートされました。
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path [OK]
Linux Openswan U2.6.21/K2.6.18-194.26.1.el5 (netkey)
Checking for IPsec support in kernel [OK]
NETKEY detected, testing for disabled ICMP send_redirects [FAILED]
Please disable /proc/sys/net/ipv4/conf/*/accept_redirects
or NETKEY will accept bogus ICMP redirects!
Checking for RSA private key (/etc/ipsec.secrets) [OK]
Checking that pluto is running [OK]
Two or more interfaces found, checking IP forwarding [OK]
Checking NAT and MASQUERADEing
Checking for 'ip' command [OK]
Checking for 'iptables' command [OK]
Opportunistic Encryption DNS checks:
Looking for TXT in forward dns zone: ipsec.xxx.xx.jp [MISSING]
Does the machine have at least one non-private address? [OK]
Looking for TXT in reverse dns zone: xxx.xxx.xxx.xxx.in-addr.arpa. [MISSING]
この中から [FAILED] とレポートされたものに焦点を当てて、そのエラーを解消させて行きます。
NETKEY detected, testing for disabled ICMP send_redirects [FAILED]
今回の環境では、上記の行が [FAILED] として通知された内容ですが、これについては "/etc/sysctl.conf" で、次のような設定を行うことで回避できるようでした。
設定としては、各インターフェイスについて "send_redirects" および "accept_redirects" を 0 にします。存在するすべてのインターフェイスについて行っておくのが良いようです。
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0
これらの設定を行ったら、次のようにして設定内容を有効化します。
sysctl -p
これで ICMP まわりの FAILED が通知されなくなるようでした。
他、[FAILED] ではないですけど [MISSING] と通知されている部分については、少し調べてみたのですけど、今回の段階では解決策が見られませんでした。
この "Opportunistic Encryption" の用途が理解できてなく、また OE=no の設定で無効化できそうな感じまではしたものの、実際に "OE=no" にしても特に何もチェック内容が変わる感じはありませんでした。とりあえず、この "Opportunistic Encryption DNS checks" は [MISSING] ということなので、ひとまず放って置いてみることにします。
Openswan で使用するポート
Openswan が提供する IPSec では、通信に ESP プロトコルおよび 500/UDP, 4500/UDP を使用するようなので、これらがファイアーウォールで遮断されないように設定すれば良いようです。
L2TP 自体は 1701/UDP を使用して通信するらしいのですけど、IPSec が有効であれば 1701/UDP は IPSec でトンネルされて届くため、外部へ向けてポートを開く必要はないとのことでした。
これらについては、今回は実際の動作確認ができなかったため理屈だけでの記載となりますが、この辺りを踏まえながらファイアーウォールを設定すれば良いのではないかと思います。
Openswan が正しく動作しない様子
このような感じで設定をして、xl2tpd で L2TP を稼働させてみたのですけど、正常に動作してくれませんでした。
"netstat -anp" で確認すると "pluto" というプログラムが 500/UDP で待ち受けている様子は確認できるのですけど、パケットをキャプチャーしてみても、応答を返している様子がありませんでした。ちなみに Pluto というのは、IPSec の鍵交換を行う IKE デーモンプログラムだそうです。
11:14:03.273264 IP 192.168.1.1.isakmp > 192.168.1.1.isakmp: isakmp: phase 1 I ident
11:14:06.277044 IP 192.168.1.101.isakmp > 192.168.1.1.isakmp: isakmp: phase 1 I ident
11:14:10.282854 IP 192.168.1.101.isakmp > 192.168.1.1.isakmp: isakmp: phase 1 I ident
クライアント側でもサーバー側でもパケットキャプチャーを行ってみたのですけど、どちらとも、クライアント側からの要求パケットは確認できるものの、サーバー側からの応答パケットを確認できませんでした。
送信先の IP アドレスで LISTENING されているかも確認してみましたが、問題なく確認できている様子です。
そこで、ログファイル "/var/log/messages" を確認してみると、"service ipsec start" を行った時点で、エラーを示すかもしれないメッセージが記録されていました。
Dec 31 11:27:54 localhost ipsec_setup: ...Openswan IPsec started
Dec 31 11:27:54 localhost ipsec__plutorun: /usr/libexec/ipsec/addconn Non-fips mode set in /proc/sys/crypto/fips_enabled
Pluto 自体は動作している様子なので、これだけでは直接的な動作不良の原因となっているかはわからないですけど、ともあれどうやら FIPS モードというものが、ひとつの考慮事項にはなっている可能性がありそうです。
ここに記されていた "/proc/sys/crypto/fips_enabled" の内容を確認してみると、値は "0" (無効) を示していました。
FIPS モードがどんなものかはよくわからないのですけど、暗号モジュールに関するセキュリティ要件の仕様である連邦情報処理標準規格 (Federal Information Processing Standardization) のことでしょうか。
とにかくこの FIPS モードを有効化すれば何か違ってくるかとも思って試してみたのですけど、ここに "1" を書き込もうとしても、書き込み禁止のために書き込めませんでした。SELinux を Permissive モードに変更してみても、書き込むことはできません。
パーミッションが root 読み取り専用になっていたので、書き込み可能に変更したりもしたのですけど、それでも書き込み禁止としてエラーとなってしまう様子でした。"/etc/sysctrl.conf" に "crypto.fips_enabled = 1" としても結果は同じです。
FIPS モードを有効化できたとして、それで Openswan が正しく動作するようになるかはわからないですけど、今はひとまずこの段階で Openswan のセットアップは断念とすることにしました。
Linux での FIPS の利用は、カーネルモードでこれを有効化できるような感じの情報もあったので、もしかすると CentOS 5.5 でもカーネルの再コンパイルなどから、使えるような状態を作ることもできるかもしれないですけど、そこまでは深追いせずに様子をみたいと思います。
とりあえず、CentOS 6.0 で CentOS 6.0 で L2TP-VPN サーバを構築する で記したように、CentOS 6.0 であれば問題なく Openswan をインストールすることができましたので、可能であれば CentOS 6.0 を利用するのも手かもしれません。