SoftEtherで自宅と外出先を繋ぐようになってそろそろ半年になります。
そんな時期に、何故かつながりが悪くなり、何をどうやっても繋がらなくなり、色々な所で調べた結果に合わせて色々と弄ってみたけどだめで?
結果的に半月以上繋がらなくなりました。
一度、完全に削除して(フォルダも消しました)色々とやった結果、繋がることもあるけど、直ぐ切れる状態になりました。
たしかに初めて繋いだ日もなかなかまともに通信出来ないことが多かったのですが?
あれこれやっている内に普通に通信が出来るようになったんですよね?
さて、もったいぶらずに答えを言いましょう。
UDPのパケットロスが原因でした。
Windows Networkに限らず、色々な通信は、お互いを認識するために、ブロードキャストを行います。
ブロードキャストは居るかも判らない誰かと通信するために、ネットワーク全体に送信を行うので、コネクションレスのUDPを用いて行います。
このUDPがロストしたので通信が行えなくなりました。
一般的なLAN(Ethernet)であれば、通信データはMACアドレスに対して送信されます。
TCP/IP何て言うのが、一般的になりすぎているため、
通信をするときは、IPアドレスに対して通信をしていると思っている人が多いですが?
IPアドレスは、送信元と、送信先を示すだけの只の記号で、
Ethernetと呼ばれるいわゆる最小構成であるネットワークとしてはMACアドレスに対して通信をします。
ルーター、ゲートウェイ(以降ルーター)などと呼ばれる物にデータが到達すると、それが、どのプロトコルであるか調べます。
最近としてはTCP/IPが多いですので、届くのはIPv4パケットかIPv6パケットと言うことになります。
ルーターは、IPパケットにある送信先のIPアドレスが、何処のネットワーク宛かを調べて、
ルーティングテーブルを参照して、パケットを中継するわけです。
送信先が、自分のネットワークである場合、ルーターは、
「こののIPアドレスの人は誰ですか?」とブロードキャストパケットを送信します。
該当のIPアドレスが割り当てられている機器は、「それは私です!」って返信をします。
すると、ルーターは、該当の機器に対してデータを送るわけです。
(ただし、最近のネットワーク機器は、定期的にブロードキャストを行い
ネットワークの何処にどんな機器があるのかを定期的に調べているので、
データが来てから行うことはありません。)
とくにSwitchingHubと呼ばれる物は、MACアドレスの情報を蓄積しておいて、
どのMACアドレスを持つ機器がどのポートに繋がっているのかを全て収集してあります。
実際のデータは、そこのポート(ケーブル)にしか流さないことで、ネットワーク全体に流れる
パケットの量を減らす効果があります。
注:昔のHubは今ではBusHubと呼ばれており、届いたデータを、それ以外の全てのポートに送信していたため
ネットワーク内にパケットがあふれかえっていました。
うんちく:
表示する 消す
BusHubはレイヤー1でデータを中継する装置
SwitchingHubはレイヤー2でデータを中継する装置
Routerはレイヤー3でデータを中継する装置
です。
レイヤー1は物理層と呼ばれ、電気的性質その物を定義してあります。
レイヤー2はデータリンク層と呼ばれ、データパケットが流れるようになっています。
レイヤー3はネットワーク層と呼ばれ、ネットワーク間のデータの遣り取りが定義されています。
これが実際のTCP/IPとなると、TCP/IPを同じように分けると
4層構造になっていて
ネットワークインターフェイス層と呼ばれる所が、物理層とデータリンク層に相当すると言われています。
ただ、実際のネットワーク設備は、LANケーブルを用いたEthernetが一般的であり、
物理層は、Ethernetで有ることが殆どです。
インターネット層と呼ばれる物が、ネットワーク層にあたります。
インターネットはもともと、複数のネットワークを繋いで、冗長性をもたらすために作成されたので、
この層がインターネットのほぼ全てと言って過言ではありません。
OSIの7層も、TCP/IPの4層も、トランスポート層から上については、
実際にデータを扱うアプリケーション次第と言うことになっています。
因みに、トランスポート層については
届いたデータをアプリケーションに引き渡すための通信の管理層になっています。
言わば、OSその物と言って良いでしょう。
セッション層について、TCP/IPではセッション管理は自分で行う必要があります。
PHPなどでセッションの管理機能が有るかと思います。
そういうのも含めて、様々な遣り取りの取り決めです。
プレゼンテーション層
表現の変換を行うそうです。
SSLなどの暗号化、ShiftJISやら、unicodeあたりの変換も含まれる場合があります。
アプリケーション層
遣り取りしたデータを使用者に見える(使える)様にします
と言うわけで、TCP/IPではセッション層より上が全く存在しないので、
PHPのセッション管理機能を使ったりしなければ、自分で、頑張ってサーバー側と、クライアント側での
接続の特定が出来る様な機能を用意しなければなりません。
さて、そんな事は置いといて、
そういう訳でUDPはネットワークを維持するために非常に有用であると同時に
大量にマルチキャストが送られることに対する弊害(SwitchingHubの無意味化)等も有り
とても難しい問題になっています。
SoftEtherにはそれを制限するためにUDPが多すぎたら、パケットを破棄する機能とかもあるのですが?
当然ながら、必要なデータ収集のためにUDPパケットを生成しているのに、これが破棄されたら
通信相手が何処に居るかが判らなかったり、IPアドレスの取得が出来なくなったり(DHCPのこと)
色々な弊害が出てくるわけですね。
結局どちらが良いのかと言われたら・・・
それは、SoftEtherの方へ行くパケットを制限出来れば良いのです。
どうやって制限をするのか???
まず、基本的に、真っ先にやらなければならないことは、
VirtualNICのメトリックを下げることです。
SoftEtherはデフォルトで1にします。
メトリックはネットワークの優先度です。
SoftEtherのメトリックが1の場合、全ての通信を一度SoftEther側に流してから、
実際にデータを流したいネットワークへ中継することになります。
Windowsがもうちょっと賢くルーティング出来れば良いのですが?
ルーティングの決定よりも、メトリックの方が優先なので、
送信先が無いネットワークに対して、送信先を探しに行った後に、別のネットワークへ送信先を探しに行きます。
Windowsは内部に送信先の情報を言って危機感キャッシュする機能がありますが、
それらは完全に無視です。
特にDNSのアクセスが遅くなります。
もちろん、メトリックを1にするメリットもあります。
しかし、殆どの個人使用の人は、自宅と、外出先しか繋がないので、
恩恵は全くありません。
まず、この1になっているメトリックを自動に戻します。
SoftEtherはデフォルトで100MHzの通信速度になりますので、大概は30辺りになります。
1GのLANを引いていれば、LANの方は10辺りになりますので、
インターネットと、VPNの両方を問題なくそれぞれ通信出来るようになります。
(注意:自宅内部をDNSで管理している場合は、この設定では通信出来なくなる場合があります。
その時はNetBIOSかWSDを有効にしましょう。)
これで、DNSの度にVPN側への問い合わせが無くなります。
その2
それでもUDPのパケットは大量に出ています。
これらを一部でもカットしてしまえばまともに通信は出来ません。
なので、この先は、VPNで接続する際に必要ではないものを外していきます。
その筆頭になるのがUPnPです。
しかし、VPN側だけUPnPを外す方法が未だ分かっていません。
なので、
「ブロードキャスト数を制限しない」設定を有効にすることが一番の近道です。
尚これは、セキュリティポリシーにて設定することが出来ます。
当初もこれを設定したのでしょうか?
覚えていません。
他にも、設定は有るかもしれません。
とりあえず、現状は、これでOKって事にしています。
所で、
上記事とは全く関係なく通信が出来なくなることがあります。
それがNortnの更新です。
nortonが更新されると、再起動するまで最低限の通信を除き殆ど外部とアクセスが出来なくなります。