OpenVPN ブリッジ
このページでは Arch Linux でネットワークブリッジを作成し、IP layer-3 ベースの IP トンネル (TUN) ではなく、IP layer-2 ベースの Ethernet ブリッジ (TAP) を使って OpenVPN サーバをホストする方法を説明します。一般的な OpenVPN ページでは、PAM 認証や OpenSSL セキュリティ証明書の設定についてより詳しく説明しています。
目次
イントロダクション
OpenVPN のドキュメントページでは、OpenVPN がサポートするサーバーサイドとクライアントサイドのオプションの完全な概要が提供されています。トンネリングモードで OpenVPN を設定し、トラフィックのルーティングを制御する方が簡単であり、目的に合っている場合は一般的にそのようにすることが推奨されます。ただし、Windows のファイル共有などのネットワークアプリケーションは、イーサネットレベルでのネットワークブロードキャストに依存し、同じサブネット上に物理的に配置されていると考えることで利益を得るため、ソフトウェアブリッジングがこの目的に役立ちます。
ブリッジングを設定する方法は複数あります。動的な方法では、OpenVPN がシステム上で独自のブリッジを管理し、それを開始、停止、および設定します。これはブリッジングを設定する最も迅速な方法ですが、OpenVPN の起動および停止時に他のネットワークサービスが中断されます。システムが独自のブリッジを管理する場合、OpenVPN の他にも他の仮想ネットワークアダプタがブリッジに接続するため、静的な方法を使用する方が好ましいです。
動的ブリッジのインストール
OpenVPN と Linux ブリッジングユーティリティをインストールする必要があります。これらは openvpn および bridge-utils パッケージで利用できます。
動的ブリッジ設定
OpenVPN は、設定ファイルで指定された名前の TAP デバイスを自動的に作成/削除します。以下の例の設定ファイルには、TUN または TAP に共通する OpenVPN の設定は示されておらず、TAP モードに影響する設定のみが示されています。スクリプトを作成した後、up
および down
スクリプトが実行可能であることを chmod +x
で確認してください。
(TUN と TAP に共通するセクションは省略)
/etc/openvpn/server.conf
# this uses a dhcp server, server-side # clients must support binding their dhcp client to their tap adapter # do not append 'nogw' if using dhcp server-bridge # can specify interface, like tap0 or tap1 # or use up/down routing scripts to handle # more than one, if needed dev tap0 # needed to call scripts like up/down # which call external programs within the scripts script-security 2 # user defined scripts for adding/removing tap to bridge # 'dev mtu link_mtu ifconfig_local_ip ifconfig_remote_ip' are appended if set # make sure 'user' has permission to run 'down' ('up' will be root) up "up br0 eth0" down "down br0 eth0" # call 'down' before TUN/TAP close down-pre # drop root priveledges once connected # good idea, for servers running on linux # 'up' script not affected, 'down' script is ;user nobody ;group nobody
/etc/openvpn/up
#!/bin/bash br=$1 eth=$2 dev=$3 mtu=$4 cd /usr/bin/ # only if you start dhcpcd and leave it # running for eth #dhcpcd -k $eth # needed if script is run independently # but when run through openvpn # openvpn will do this automatically # could also use 'ip tuntap ..' #openvpn --mktun --dev $dev brctl addbr $br # set forwarding delay to 0 # otherwise dhcp called below would timeout brctl setfd $br 0 brctl addif $br $eth # order matters here.. right now there is only # one mac in the bridge's table # if there were two.. there is no guarantee # which would be passed to the dhcp server dhcpcd $br brctl addif $br $dev ip link set $eth up promisc on mtu $mtu ip link set $dev up promisc on mtu $mtu
/etc/openvpn/down
#!/bin/bash br=$1 eth=$2 cd /usr/bin/ dhcpcd -k $br ip link set $br down brctl delbr $br # needed if script is run independently # but when run through openvpn # openvpn will do this automatically # could also use 'ip tuntap ..' #openvpn --rmtun --dev $dev # only if you start dhcpcd and leave it # running for eth #dhcpcd $eth
These examples are for using dhcp. If you are going to use static IP addresses, you will need to adjust accordingly.
Systemd の使用
OpenVPN の systemd スクリプトは、デフォルトで /etc/openvpn フォルダ内の <name>.conf ファイルを探します。したがって、server.conf という名前のファイルがあると仮定すると、openvpn@server
を有効化して起動することができます。
同時に dhcpcd が別々に有効化されていることに注意してください(つまり、dhcpcd@eth0.service)。OpenVPN の後に完了して OpenVPN 用の DHCP 設定を台無しにする可能性がありますが、それはあまりありそうもありません。どのみち openvpn@server.service が DHCP をリセットすることがわかっているので、dhcpcd@eth0.service を無効にすることができるでしょう。
静的ブリッジのインストール
まず最初に、openvpn、bridge-utils、netctl のパッケージをインストールしてください。
静的ブリッジの設定
OpenVPN チームやさまざまな Linux パッケージャが提供する OpenVPN の早期バージョンのガイドでは、OpenVPN を起動する際にブリッジを構築し、OpenVPN をシャットダウンする際にブリッジを破壊するためのスクリプトの例が示されていました。
ただし、これはやや時代遅れのアプローチであり、OpenVPN 2.1.1 以降では、セキュリティ上の理由から明示的に有効化されない限り、外部スクリプトやプログラムを呼び出すことができません。
また、ブリッジの構築は、ネットワークの初期化プロセスの他のすべての部分に比べて比較的遅いです(実際、ブリッジが準備できる前に dhcpcd がタイムアウトするほど遅いです。#Static Bridge Troubleshooting を参照してください)。さらに、設定変更後に OpenVPN を再起動する際に、動作しているブリッジを再構築する理由はありませんし、他のすべてのネットワークアプリケーションを中断します。したがって、以下のように静的ブリッジ設定を行うことが推奨されています。
サーバー用の OpenVPN ブリッジを作成するには、netctl を使用して 2 つのネットワークプロファイル(tap インターフェース用とブリッジ用)を作成する必要があります。
/etc/netctl
に移動し、tuntap のサンプルファイルをディレクトリにコピーします:
# cd /etc/netctl/ # cp examples/tuntap openvpn_tap
次に、openvpn_tap
を編集して tap インターフェイスを作成します。以下のようになるかもしれません:
/etc/netctl/openvpn_tap
Description='tuntap connection' Interface=tap0 Connection=tuntap Mode='tap' User='nobody' Group='nobody'
ここでは IP アドレスを設定しないでください。これはブリッジインターフェイスで行われる予定です!
bridge
プロファイルを作成するには、サンプルファイルをコピーします:
# cp examples/bridge openvpn_bridge
次に、openvpn_bridge
を編集します。以下のようになるかもしれません:
/etc/netctl/openvpn_bridge
Description="Bridge connection" Interface=br0 Connection=bridge BindsToInterfaces=(eth0 tap0) IP=static Address=('192.168.11.1/24') Gateway='192.168.11.254' DNS=('192.168.11.254')
詳細情報や、例えば DHCP の使用方法については、netctl の記事を参照してください。
次に、両方のプロファイルを有効化して開始します:
# netctl enable openvpn_tap # netctl enable openvpn_bridge # netctl start openvpn_tap # netctl start openvpn_bridge
スタティックブリッジのトラブルシューティング
ネットワークの開始に失敗しました
これは、ブリッジで DHCP を使用しており、ブリッジの設定に dhcpcd が待機するよりも時間がかかるためです。ブリッジネットワークプロファイル(openvpn_bridge)で FWD_DELAY パラメータを設定することで、これを修正できます。まず 5 の値から始めて、動作するまで減らしていきます。
DHCP を使用している場合にブリッジに IP アドレスがない
イーサネットインターフェースに割り当てられている IP アドレスを解放してから、DHCP 経由で IP をリクエストする必要があるかもしれません。これを行うには:
dhcpcd -k
次に、dhcpcd の設定ファイルを変更して、イーサネットインターフェースに IP アドレスが割り当てられないようにします(この場合、enp3s0
):
/etc/dhcpcd.conf
denyinterfaces enp3s0
ファイルの最後の方で(ブリッジの名前が br0
であることを前提に):
/etc/dhcpcd.conf
interface br0
上記で説明したように、ネットワークブリッジを作成し、dhcpcd
を実行してインターフェースに IP アドレスを割り当てます。ip addr
がブリッジ(つまり br0
)に有効な IP アドレスを割り当てていることを確認します。
その他のリソース
- OpenVPN - OpenVPN の設定に関する一般的なページで、認証方法の設定を含みます。