2006年10月31日アーカイブ

サーバからクライアントにpingを打つとサーバとクライアントの間でだけ通信ができるようになりました。
その後いろいろ試した結果、一度切断して接続しなおすと、また通信できなくなったりしました。
で、最終的にこの手順を踏めば通信できると言う手順がわかったので、試したことと結果を書いておきます。

まず、いつものようにgoogleで参考ページを探します。Setting up bridging for OpenVPN on FreeBSDと言うページを発見。
ここを見ながら、最初からbridge0をtap0とrl0で作る代わりに、接続時に bridge0に tap0 を追加するようにしてみました。
しかし、openvpnサーバをnobodyで実行していると、bridge0にtap0を追加する権限がないといわれます。
とりあえず、openvpn.confの中でnobody指定しているところをコメントアウトしたら、接続時にスクリプトが実行できるようにはなりましたが、状況は変わらず。

続いて、if_bridgeのマニュアルをつらつらと見ていたら、bridgeにfilterを掛けるかどうかみたいなオプションがあることがわかりました。
そこで、以下のように無効にしてみます。
# sysctl -w net.link.bridge.pfil_member=0
# sysctl -w net.link.bridge.pfil_bridge=0
これで、うまく通信ができているときにはサーバ以外の家庭内の別のマシンとの間でも通信ができるようになりました。
セキュリティ的に良いのかどうかわかりませんが、/etc/sysctl.confに書いておきます。

さて、後の問題はなんでうまく通信ができたりできなかったりするかです。
いろいろ試行錯誤した結果、たどり着いたのは以下の結論です。
arp -a を実行したときに、前回繋いだときのクライアントのエントリがあると通信できない
で、以下の手順を踏むと通信ができることがわかりました。
  1. クライアントからopenvpnで接続する
  2. サーバ側で、arp テーブルにクライアントがある場合はarp -dで削除する。
  3. サーバからクライアントにpingする。
この手順を踏むと、arpテーブルに新しいエントリが追加され、無事に双方向通信ができるようになります。
前回、サーバからpingを打たないと通信できないように見えたのは、初期状態でarpテーブルにエントリがないときに、pingを打つことでarpテーブルにエントリが追加されるからでした。
そして、一度切断して接続しなおすと、前のエントリが残っているので通信できない状態になるのでした。
わからないのは、クライアントのtapインターフェイスのMACアドレスは変わらないので、arpテーブルに登録される情報は変わらないはずなのに、なんで一度削除する必要があるかと言うことです。

上記手順を踏んでも、一定時間たつと通信ができなくなり、arp -dとpingをやり直すとまた通信できるようになります。
なんか根本的なところを間違ってるのかなあ・・・。
2006年10月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

このアーカイブについて

このページには、2006年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2006年10月26日です。

次のアーカイブは2006年11月10日です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1