Overview
OpenVPN の設定で、クライアントに割り当てる IP アドレスを以下のように指定しています。
[root@centos-6 ~]# vim /etc/openvpn/server.conf
server 192.168.200.0 255.255.255.0
OpenVPN を起動すると、tun0 に関するルーティングテーブルは以下のように表示されます。tun0 は OpenVPN のインターフェイスです。
[root@centos-6 ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.200.2 * 255.255.255.255 UH 0 0 0 tun0
192.168.200.0 192.168.200.2 255.255.255.0 UG 0 0 0 tun0
問題の発生
この環境では、Quagga の OSPF を使用して、このルーティングテーブルを配送していますが、1 日おきにルーティングテーブルが配送されない問題が発生しています。その際のログは以下の通りです。
[root@centos-6 ~]# cat /var/log/messages
May 12 04:05:38 xxxxxxxx zebra[1218]: netlink_interface_addr can't find interface by index 4
May 12 04:05:38 xxxxxxxx zebra[1218]: netlink-listen filter function error
May 12 04:05:40 xxxxxxxx zebra[1218]: warning: PtP interface tun0 with addr 192.168.200.1/32 needs a peer address
原因
OpenVPN のログローテーション設定が問題を引き起こしていました。以下の設定により、OpenVPN の再起動時に tun0 のインデックス番号が変わり、ルーティングテーブルが更新されなくなっていました。つまり、Quagga の OSPF は、インターフェイスのインデックス番号に基づいて動作しているものと推測されます。スタティックルートの場合はこの問題は発生しません。
[root@centos-6 ~]# cat /etc/logrotate.d/openvpn
/var/log/openvpn.log {
missingok
notifempty
sharedscripts
postrotate
/etc/rc.d/init.d/openvpn restart 2>&1 > /dev/null || true
endscript
}
missingok
: ログファイルが存在しない場合でもエラーを出力せずに処理を続行します。notifempty
: ログファイルが空の場合はローテーションをスキップします。これにより、ログファイルが何も書き込まれていない場合に不要なローテーションが行われるのを防ぐことができます。sharedscripts
: ログファイルをローテーションする際に、postrotate
スクリプトを一度だけ実行します。これにより、複数のログファイルを一括で処理する際に、一度だけ OpenVPN を再起動するようになっています。postrotate ... endscript
: ログローテーションが実行された後に実行されるスクリプトです。/etc/rc.d/init.d/openvpn restart
コマンドを実行して、OpenVPN を再起動しています。2>&1 > /dev/null || true
は、エラー出力を/dev/null
にリダイレクトし、コマンドが失敗してもエラーとして処理しないようにしています。
解決策
以下のログローテーション設定を採用することで、問題なく OSPF でのルーティング配送が行えるようになりました。この設定では、OpenVPN の再起動を削除していますが、他のアイデアとしては、OpenVPN の再起動とともに、Quagga の再起動も合わせて行う方法もあるかもしれません。
[root@centos-6 ~]# vim /etc/logrotate.d/openvpn
/var/log/openvpn/*.log {
size 1M
rotate 10
copytruncate
missingok
}
size 1M
: ログファイルのサイズが 1MB を超えた場合にローテーションを行います。これにより、ログファイルが大きくなりすぎることを防ぐことができます。rotate 10
: ログファイルを 10 世代分保持します。古いログファイルは自動的に削除され、新しいログが生成されます。copytruncate
: ログファイルをローテーションする際に、ファイルをコピーしてから切り詰める (truncate) ことで、OpenVPN の再起動なしでログの書き込みを継続することができます。この設定により、ログファイルが切り詰められた後もログの書き込みが途切れずに継続されるため、OpenVPN の再起動による問題が解消されました。missingok
: ログファイルが存在しない場合でもエラーを出力せずに処理を続行します。
CentOS 6 OpenVPN と Quagga のルーティングの問題