OpenVPNのブリッジモード(まとめ)
概要
OpenVPNのブリッジモード構築手段についてまとめておく。
事前準備
以下の条件を満たしていること。
- サーバはFreeBSD
- クライアントはFedora Core6
- OSは双方共インストール済み
- クライアントは自分で頑張ってやってちょ(参考文献で十分だと思う)
- サーバはブリッジが有効になってる
テスト環境
D-LINK社のDI-624を2台、適当なスイッチを1台。
スイッチをインターネット環境に見立てて、双方のルータをスイッチに接続。
それぞれのルータにVPN Client、VPN Serverを接続という流れとした。
VPN Server側ルータにはUDP 1194をVPN Server側に転送する設定とし、後は適当に設定。
OpenVPNのインストール
バージョンは2.0.9。この辺から適当にソースコードをダウンロードしてくる。2.0.x系と2.1.x系は若干違うようなので注意。
http://openvpn.net/
また、依存ライブラリであるLZOも準備しておく。LZOは2.02.2だが、下位互換性をちゃんと意識しているので多分適当なものでいい。
lzoはtarを展開してから、例によってこの三つでインストール。
./configure make make install
OpenVPNだが、lzoのパスを指定やる以外はほとんど同じ。
./configure --with-lzo-headers=/usr/local/include/lzo/ --with-lzo-lib=/usr/local/lib/ make make install
適当に変更してもらえればOK。
ネットワーク設定
続いてサーバのネットワーク設定。今回はNICのデバイス名がsk0だったのでその前提で。デバイス名が自環境でどうなっているかは、ifconfigで確認すればいい。
/etc/rc.confを開いて以下行を追加して再起動すればDHCP。
ifconfig_sk0="dhcp"
固定なら同ファイルを開いてこんな感じ。要再起動。
ifconfig_sk0="inet 192.168.40.2 netmask 255.255.255.0 broadcast 192.168.40.255" defaultrouter="192.168.40.1"
再起動を忘れずに。結果はifconfigで確認すればいい。
ブリッジの有効化
ブリッジを使わないと今回の構成では話にならないので、これが上手くいくかを確認する。
kldload bridge
問題なさそうな雰囲気なら、/boot/loader.confに以下を加えれば自動的にBridgeが有効にされるようになるが、これは好みで。
bridge_load="YES"
どの道ブリッジの起動Shellは後で作るので、そこでkldloadをやってもいい。
TAPデバイスの有効化
OpenVPNをブリッジモードで動作させるためにTAPデバイスを使うので、TAPデバイスを有効化してあげる必要がある。大体Bridgeの時と同じような手順。
kldload if_tap
これがOKなら問題なし。OKじゃない場合は調べてないから書けない。
/boot/loader.confはこんなの。って、もうわかるか。例によって記述は好みで。
if_tap_load="YES"
ipfwの有効化
ついでにFirewallも動かしておく。今回私は大して使ってないのだが、将来使う事になりそうなので有効化だけやっておいた。
/etc/rc.confを開いて下記行を追加。
firewall_enable="YES" firewall_type="OPEN" firewall_script="/etc/ipfw.rule" firewall_logging="YES" firewall_quiet="YES"
ついでに/etc/ipfw.ruleも作成する。
後でやるという人はこれだけ書いておけばいい。
ipfw add allow all from any to any
書いておかないと全てのパケットをブロックする凶悪なファイアウォールが稼動してしまうので、上記を書くか、ipfwを使わないか、ちゃんと設定するかのどれかにしよう。
SSHの設定
なんか私の環境では、デフォルトではチャレンジレスポンスモードで動いていたので、非対称鍵でやる事にした。
でもこの設定はOpenVPNとあまり関係ないので省略。適当にどうぞ・・。
TeraTermとかなら、認証方式をチャレンジレスポンスにする点だけ注意すること。
証明書の作成
How to通りでいい。
OpenVPNのソースを解凍した場所に、easy-rsaというディレクトリがあるのでそこにcdしておく。
次にシェルを/bin/shに切り替えておく。
で、要するに以下時系列に打てばいい。vars先頭の「.」に注意。
/bin/sh . ./vars ./clean-all ./build-ca ./build-key-server server ./build-key vpnclient ./build-dh exit
varsを編集しておくとデフォルト値を変更できるので後が楽。
build-keyやらbuild-caやらでは色々と質問を受けるのだが、注意するのはCommonNameという項目。ここは必ず一意にしなければならないので、クライアントとサーバで同じ値にしないように注意すること。
鍵は色々出来るが、以下のファイル以外は不要。
ファイル名 | サーバ | クライアント |
---|---|---|
ca.crt | ○ | ○ |
ca.key | ○ | |
ch[n].pem | ○ | |
Server.crt | ○ | |
Server.csr | ○ | |
Server.key | ○ | |
vpnclient.crt | ○ | |
vpnclient.csr | ○ | |
vpnclient.key | ○ |
ほんとは*.csrもいらないが、将来設定を変更した時のために一応残しておく。この辺はお好みで。
.keyファイルを大切に保管しておく事を忘れずに。パーミッションを600か400辺りにしておけばいいだろう。
で、これを適当な場所に設置。
私は/etc/openvpn/keys/に置いた。クライアントは社員に任せていたら、なんか/usr/share/doc/openvpn-2.0.9/に入ってた。
サーバの設定
説明は省略する。とりあえず/etc/openvpn/server.confを作って、以下のファイルを貼り付け。
port 1194 proto udp dev tap # keys ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/server.crt key /etc/openvpn/keys/server.key dh /etc/openvpn/keys/dh1024.pem # server address server-bridge 192.168.40.200 255.255.255.0 192.168.40.201 192.168.40.220 # client-to-client!! client-to-client # !test only! duplicate-cn # exec user and group user nobody group nobody # keep alive (value is default) keepalive 10 120 # restart setting persist-key persist-tun # control script's up /etc/openvpn/start-bridge.sh down /etc/openvpn/stop-bridge.sh # compress setting comp-lzo # message level verb 3
server-bridgeは左からサーバのブリッジIP、サブネットマスク、VPNクライアントのIPアドレス範囲の開始IP、VPNクライアントのIPアドレス範囲の終了IP。後ろ二つは、要するにDHCPスコープの設定。
んで、/etc/openvpn/start-bridge.shを作成して以下を貼り付け。
#!/bin/sh ifconfig tap0 inet 192.168.40.200 sysctl -w net.link.ether.bridge.enable=1 sysctl -w net.link.ether.bridge.ipfw=1 sysctl -w net.link.ether.bridge_cfg="sk0 tap0"
IPアドレスとデバイス名に気をつけて。
/etc/openvpn/stop-bridge.shを作成して、以下を貼り付け。
#!/bin/sh sysctl -w net.link.ether.bridge.enable=0 sysctl -w net.link.ether.bridge.ipfw=0 sysctl -w net.link.ether.bridge_cfg=
テスト
これでとりあえず完了。以下で起動させよう。
cd /etc/openvpn/ /usr/loca/sbin/openvpn --config ./server.conf
「Initialization Sequence Completed」と最後に出れば成功。
駄目なら一度再起動して、もう一度。
それでも駄目なら頑張って調べよう。
OKならクライアントと接続して色々テストしてみればいい。
仕上げ
設定ファイルの修正
/etc/openvpn/server.confに以下を追加。
status /var/log/openvpn-status.log log-append /var/log/openvpn.log verb 3
verbは書き換え。
duplicate-onも消しておこう。
デーモン化
デーモンとして動かすので/etc/rc.d/openvpnを作成して、以下を貼り付け。
※本項はあまりテストしてない。
#!/bin/sh . /etc/rc.subr : ${openvpn_dir="/etc/openvpn"} : ${openvpn_configfile="/etc/openvpn/server.conf"} : ${openvpn_enable="YES"} name="openvpn" rcvar=`set_rcvar` pidfile="/var/run/${name}.pid" load_rc_config ${name} # rc_debug="YES" required_files="${openvpn_configfile}" command="/usr/local/sbin/${name}" command_args="--cd ${openvpn_dir} --daemon --config ${openvpn_configfile} --writepid ${pid file}" run_rc_command "$1"
logrotate
FreeBSDはlogrotateがデフォルトで入ってないので、ローテーションにはnewsyslogを使う。
/etc/newsyslog.confを開いて以下を追記。
※本項はあまりテストてしてない
/var/log/openvpn.log 600 5 100 * JC /var/log/openvpn-status.log 600 5 100 * JC