freeDiameterdのインストール記録 第3回
freeDiameterdのインストール記録 第2回の続きです。第2回では単体の設定まで行いましたが、今回はクライアント・サーバーのセットアップと、トラブルシューティングの方法です。
■クライアント・サーバーモデル■
Diameterプロトコルではクライアントとサーバーの役割がそれぞれ分かれています。しかしfreeDiameterdにそのような設定項目はありません。そのまま起動するとサーバーとして動作して3868ポートで待ち受けますが、freeDiameter.confファイルのConnectPeer項目で対抗機を設定すると、クライアントとしても動作し自ら接続に行きます。
それでは2台のホストを使ってクライアント・サーバーの通信を見てみましょう。
■まずはもう1台セットアップ■
ハイパーバイザー上で動くバーチャルマシンであればそのままクローンします。物理ホストをもう1台用意するなら、「freeDiameterインストール」後の「SSL証明書・秘密鍵作成」前まで行っておきます。
2台目のホスト名はcentos65ip126.hiro.localとしておきます。両ホストでhostsファイルに登録しておきます。
[root@centos65ip126 ~]# echo 192.168.10.126 centos65ip126.hiro.local >> /etc/hosts
[root@centos65ip124 ~]# echo 192.168.10.126 centos65ip126.hiro.local >> /etc/hosts
■もう1台のSSL証明書・秘密鍵作成■
サーバー証明書・秘密鍵のペアをもう1つ作ります。ホスト名であるCommon Nameを「centos65ip126.hiro.local」とし、前回とは別である事に注意です。
[root@centos65ip124 ~]# cd /home/hiro/test/ssl/20140304/
[root@centos65ip124 20140304]# openssl req -new -newkey rsa:512 -keyout csr_key/serv02-pass.key -out csr_key/serv02.csr
Generating a 512 bit RSA private key
..++++++++++++
.............++++++++++++
writing new private key to 'csr_key/serv02-pass.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:a
Locality Name (eg, city) [Default City]:a
Organization Name (eg, company) [Default Company Ltd]:a
Organizational Unit Name (eg, section) []:a
Common Name (eg, your name or your server's hostname) []:centos65ip126.hiro.local
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@centos65ip124 20140304]# openssl rsa < csr_key/serv02-pass.key > csr_key/serv02.key
Enter pass phrase:
writing RSA key
[root@centos65ip124 20140304]# openssl ca -in csr_key/serv02.csr -out newcerts/serv02.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 3 (0x3)
Validity
Not Before: Mar 4 19:36:33 2014 GMT
Not After : Mar 4 19:36:33 2015 GMT
Subject:
countryName = JP
stateOrProvinceName = a
organizationName = a
organizationalUnitName = a
commonName = centos128.hiro.local
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
E6:30:D2:0E:6B:A2:D9:04:63:D5:2D:42:36:17:2D:70:75:60:3F:C4
X509v3 Authority Key Identifier:
keyid:4A:44:DE:99:B9:7D:14:36:90:D6:09:0F:74:1A:A9:AD:FC:85:EB:13
Certificate is to be certified until Mar 4 19:36:33 2015 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
■もう1台のfreeDiameterd設定■
/usr/local/etc/freeDiameter/freeDiameter.conf ファイルで、前項目で作ったSSL証明書と秘密鍵に書き換えておきます。
Identity = "centos65ip126.hiro.local";
TLS_Cred = "/home/hiro/test/ssl/20140304/newcerts/serv02.crt", "/home/hiro/test/ssl/20140304/csr_key/serv02.key";
書き換えたらプロセス再起動です。
[root@centos65ip126 ~]# service freeDiameterd stop; service freeDiameterd start
■ConnectPeer設定■
両ホストでお互いをクライアント・サーバーとして認識させる必要があります。/usr/local/etc/freeDiameter/freeDiameter.conf ファイルの最後の行にConnectPeer設定を追加します。
[root@centos65ip124 ~]# vi /usr/local/etc/freeDiameter/freeDiameter.conf
ConnectPeer = "centos65ip126.hiro.local" { TcTimer = 60; TLS_old_method; No_SCTP; Port=3868; } ;
[root@centos65ip126 ~]# vi /usr/local/etc/freeDiameter/freeDiameter.conf
ConnectPeer = "centos65ip124.hiro.local" { TcTimer = 60; TLS_old_method; No_SCTP; Port=3868; } ;
設定変更後は両ホストでfreeDiameterdプロセスを再起動します。
[root@centos65ip124 ~]# service freeDiameterd stop; service freeDiameterd start
[root@centos65ip126 ~]# service freeDiameterd stop; service freeDiameterd start
注:「Diameterプロトコルはクライアント・サーバーモデルだから、片方にだけConnectPeer設定をしておけば十分だろう」と考えるとハマります。ConnectPeer設定によりクライアントの動きを開始しますが、サーバー側にもクライアントの情報をConnectPeer設定に入れておかないと拒否されてしまいます。
■トラブルシューティングの方法1:ログ■
前述したserviceスクリプトでfreeDiameterdのログを/var/log/freeDiameterd に出力するように設定しておきました。起動しない、接続できないといった問題が起こった場合にはこのログを参考にします。例えば接続に成功した場合、ホストcentos65ip124でのログは以下のようになります。
03/07/14,04:19:18.770723 NOTI Connected to 'centos65ip126.hiro.local' (TCP,soc#16), remote capabilities:
03/07/14,04:19:18.770756 NOTI 'Capabilities-Exchange-Answer'
03/07/14,04:19:18.770776 NOTI Version: 0x01
03/07/14,04:19:18.770786 NOTI Length: 196
03/07/14,04:19:18.770793 NOTI Flags: 0x00 (----)
03/07/14,04:19:18.770801 NOTI Command Code: 257
03/07/14,04:19:18.770808 NOTI ApplicationId: 0
03/07/14,04:19:18.770815 NOTI Hop-by-Hop Identifier: 0x72754A9F
03/07/14,04:19:18.770822 NOTI End-to-End Identifier: 0xA3588CB6
03/07/14,04:19:18.770829 NOTI {internal data}: src:centos65ip126.hiro.local(24) rwb:(nil) rt:2 cb:(nil),(nil)((nil)) qry:0xb5601348 asso:0 sess:(nil)
03/07/14,04:19:18.770837 NOTI AVP: 'Result-Code'(268) l=12 f=-M val='DIAMETER_SUCCESS' (2001 (0x7d1))
03/07/14,04:19:18.770844 NOTI AVP: 'Origin-Host'(264) l=32 f=-M val="centos65ip126.hiro.local"
03/07/14,04:19:18.770851 NOTI AVP: 'Origin-Realm'(296) l=18 f=-M val="hiro.local"
03/07/14,04:19:18.770858 NOTI AVP: 'Origin-State-Id'(278) l=12 f=-M val=1394133354 (0x5318c96a)
03/07/14,04:19:18.770872 NOTI AVP: 'Host-IP-Address'(257) l=14 f=-M val=192.168.10.126
03/07/14,04:19:18.770879 NOTI AVP: 'Vendor-Id'(266) l=12 f=-M val=0 (0x0)
03/07/14,04:19:18.770886 NOTI AVP: 'Product-Name'(269) l=20 f=-- val="freeDiameter"
03/07/14,04:19:18.770894 NOTI AVP: 'Firmware-Revision'(267) l=12 f=-- val=10200 (0x27d8)
03/07/14,04:19:18.770901 NOTI AVP: 'Inband-Security-Id'(299) l=12 f=-M val='TLS' (1 (0x1))
03/07/14,04:19:18.770908 NOTI AVP: 'Auth-Application-Id'(258) l=12 f=-M val=4294967295 (0xffffffff)
03/07/14,04:19:18.900267 NOTI 'STATE_OPEN_HANDSHAKE' -> 'STATE_OPEN' 'centos65ip126.hiro.local'
■トラブルシューティングの方法2:再起動■
何事もまずはプロセスを再起動したら奇跡が起こるかもしれません。そして起動時のログも確認できます。
# service freeDiameterd stop; service freeDiameterd start
■トラブルシューティングの方法3:パケットキャプチャ■
接続できないといった事象の場合には、TCPの3ウェイハンドシェイクができているか、それに続くCER(Capabilities-Exchange Request)が出ているかといった確認をパケットキャプチャにより行えます。
[root@centos65ip126 freeDiameterd]# tcpdump -nni eth1 -s 0 port 3868 -w 20140307freeDiameterd01.cap
...
12 2014-03-07 04:25:56.032477 192.168.10.124 47513 192.168.10.126 3868 TCP 74 47513 > diameter [SYN] Seq=0 Win=14600 Len=0 MSS=1460 SACK_PERM=1 TSval=174169397 TSecr=0 WS=32
13 2014-03-07 04:25:56.032511 192.168.10.126 3868 192.168.10.124 47513 TCP 74 diameter > 47513 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=173344381 TSecr=174169397 WS=32
14 2014-03-07 04:25:56.032913 192.168.10.124 47513 192.168.10.126 3868 TCP 66 47513 > diameter [ACK] Seq=1 Ack=1 Win=14624 Len=0 TSval=174169398 TSecr=173344381
...
15 2014-03-07 04:25:56.033265 192.168.10.124 47513 192.168.10.126 3868 DIAMETER 250 cmd=Capabilities-ExchangeRequest(257) flags=R--- appl=Diameter Common Messages(0) h2h=74bd57d5 e2e=bc12c504
17 2014-03-07 04:25:56.033777 192.168.10.126 3868 192.168.10.124 47513 DIAMETER 262 cmd=Capabilities-ExchangeAnswer(257) flags=---- appl=Diameter Common Messages(0) h2h=74bd57d5 e2e=bc12c504
■トラブルシューティングの方法4:netstat■
netstatコマンドにより、どちらのホストがクライアントになって接続できているのか、ESTABLISHED状態で安定しているかといった確認ができます。
[root@centos65ip126 freeDiameterd]# netstat -ant | grep 3868
tcp 0 0 0.0.0.0:3868 0.0.0.0:* LISTEN
tcp 0 0 192.168.10.126:3868 192.168.10.124:47513 ESTABLISHED
tcp 0 0 :::3868 :::* LISTEN