- blogs:
- cles::blog

OpenVPN の内蔵パケットフィルタを有効にする

OpenVPN で接続先を限定したかったので、パケットフィルタの設定方法を調べていたら内蔵のパケットフィルタ機能(pf.c)があることに気づいたので設定してみました。
Linux であればもちろん iptables を利用することも出来ますが、今回は OpenVPN に閉じた形にしたかったのでこちらの方法を選択しています。
参考にさせていただいたのは「OpenVPN’s built-in packet filter « \1」。
以下、劣化和訳手順です。
† 設定の手順
まず、パケットフィルタを有効にするためのプラグインをビルドして、所定の場所に配置します。
/path/to/openvpn_src の部分は openvpn-plugin.h が置いてあるディレクトリ ( openvpn のソースを展開したディレクトリ)に読み替えてください。
次に、クライアントが接続してきたときにパケットフィルタの定義ファイルが読み込まれるように client-connect スクリプトを追加します。
もし既に client-connect スクリプトを使っている場合には、そのスクリプト内から下記のスクリプトが読み込まれるようにしてください。
/etc/openvpn/client-connect.sh
今回は上記のようなスクリプトを用いました。ちょっと変なスクリプトになっていますが、OpenVPN の内蔵パケットフィルタは環境変数として $pf_file で渡されてくるファイルを読み込んでフィルタのルールを作成するので、$pf_fileに適用したいパケットフィルタ定義をコピーするようになっています。ちなみに、このスクリプトの終了ステータスが 0 以外の場合にクライアントは接続が拒否されます。これを利用して、本来はフィルタの定義が見つからない場合はクライアントを拒否するのがセキュアですが、今回はファイルが見つからない場合にはデフォルトのルールを適用するようにしてあります。
最後に openvpn の設定ファイルにプラグインの読み込みと、接続時の client-connect の呼出を追加します。
具体的には設定ファイルに下記の内容を追加します。
† パケットフィルタの定義ファイル
最後にパケットフィルタの定義ファイルを作成します。今回は /etc/openvpn/pf 以下に定義ファイルを置くことにしました。
ファイルの命名規則はdefault.pf 以外は (common_name).pf としています。
今回は下記のような2種類の定義を用意しました。
・デフォルトでは 192.168.1.*のネットワーク内の 192.168.1.8 にのみアクセスを許す。
・但し、someuser.example.com の場合は 192.168.1.* の全てのホストにアクセスを許す。
default.pf
someuser.example.com.pf
少なくとも default.pf は作成する必要があるので、こちらを最低限作成して OpenVPN のデーモンをリスタートすればパケットフィルタが有効になります。
† minimal_pf.c
パケットフィルタを有効にするためのプラグインについては「OpenVPN’s built-in packet filter « \1」で紹介されているものをそのまま流用させていただいています。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4941
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110714)
3 . 年次の人間ドックへ(110327)
4 . 2023 年分の確定申告完了!(1つめ)(109875)
5 . 三菱鉛筆がラミーを買収(109783)