手当たり次第に書くんだ

飽きっぽいのは本能

CentOS 6 OpenVPN と Quagga のルーティングの問題

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 のルーティングの問題

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る