Linux VPN Server-データ暗号化をサポートしないMPPEおよびクライアントの解決

歴史的に、pptpd + pppdバンドルは、ローカルネットワークでインターネットを配布するためのかなり人気のあるソリューションであり、主に98から開始するウィンドウにpptpクライアントが存在するためです。 さらに、このクライアントは、Windows 2000以降のMPPE暗号化プロトコルをサポートしており、デフォルトで新しい接続が有効になっています。

pppdは喜んで私たちに会い、このプロトコルもサポートしていますが、非常に奇妙なことをしています:





README.MPPEからの引用:



オンにすると、他のすべての圧縮オプションが無効になり、MPPEは双方向で正常にネゴシエートする必要があります(CCPは単方向です)。そうしないと、リンクが切断されます。 暗号化が必要な場合は暗号化が必要なので、これは合理的だと思います。 つまり、オプションの暗号化が有用であると確信していません



実際には、これは、(+ mppeまたはrequire-mppeオプションを使用して)mppeサポートを有効にすると、このプロトコルをサポートしないクライアント接続を提供できないことを意味します。 Pppd開発者は、これは自分にとって正しい動作であると考えており、「ユーザーはオプションの暗号化を必要としない」と述べています



しかし、Windowsクライアントに加えて、単にMPPEをサポートしていない安価なハードウェアルーターの接続が多数あるものをどうすればよいでしょうか。 全員の暗号化を無効にしますか? または、5倍高いルーターが必要であることを顧客に納得させるには?



そのような極端にぶつかる前に、この「機能」を修正することが決定され、pppdソースの数時間の思慮深い研究で、そのようなパッチが生まれました:

(debian lennyのppp-2.4.4rel-10.1でテスト済み)



diff -ruNp ppp-2.4.4.orig/pppd/auth.c ppp-2.4.4/pppd/auth.c

--- ppp-2.4.4.orig/pppd/auth.c 2006-06-18 14:26:00.000000000 +0300

+++ ppp-2.4.4/pppd/auth.c 2008-02-13 18:24:08.000000000 +0200

@@ -875,7 +875,7 @@ start_networks(unit)

*/

ecp_required = ecp_gotoptions[unit].required;

mppe_required = ccp_gotoptions[unit].mppe;

- if (!ecp_required && !mppe_required)

+ if (!ecp_required && (!mppe_required || allow_mppe_fallback))

continue_networks(unit);

}

diff -ruNp ppp-2.4.4.orig/pppd/ccp.c ppp-2.4.4/pppd/ccp.c

--- ppp-2.4.4.orig/pppd/ccp.c 2005-07-09 03:23:05.000000000 +0300

+++ ppp-2.4.4/pppd/ccp.c 2008-02-13 18:31:16.000000000 +0200

@@ -156,6 +156,11 @@ static option_t ccp_option_list[] = {

"allow MPPE stateful mode", OPT_PRIO },

{ "nomppe-stateful", o_bool, &refuse_mppe_stateful,

"disallow MPPE stateful mode", OPT_PRIO | 1 },

+

+ /* allow falling back to unencrypted connection mode */

+ { "mppe-optional", o_bool, &allow_mppe_fallback,

+ "allow falling back to unencryped connection mode", OPT_PRIO | 1 },

+

#endif /* MPPE */

{ NULL }

@@ -516,9 +521,14 @@ ccp_protrej(unit)

#ifdef MPPE

if (ccp_gotoptions[unit].mppe) {

- error("MPPE required but peer negotiation failed");

- lcp_close(unit, "MPPE required but peer negotiation failed");

- }

+ if(!allow_mppe_fallback) {

+ error("MPPE required but peer negotiation failed");

+ lcp_close(unit, "MPPE required but peer negotiation failed");

+ } else {

+ error("MPPE required but peer negotiation failed.");

+ error("Falling back and disabling MPPE");

+ }

+ }

#endif

}

@@ -1004,11 +1014,17 @@ ccp_rejci(f, p, len)

#ifdef MPPE

if (go->mppe && len >= CILEN_MPPE

&& p[0] == CI_MPPE && p[1] == CILEN_MPPE) {

- error("MPPE required but peer refused");

- lcp_close(f->unit, "MPPE required but peer refused");

- p += CILEN_MPPE;

- len -= CILEN_MPPE;

+ if(!allow_mppe_fallback) {

+ error("MPPE required but peer refused. Closing LCP");

+ lcp_close(f->unit, "MPPE required but peer refused");

+ } else {

+ try.mppe = 0;

+ error("MPPE required but peer refused.");

+ error("Falling back and disabling MPPE");

+ }

}

+ p += CILEN_MPPE;

+ len -= CILEN_MPPE;

#endif

if (go->deflate_correct && len >= CILEN_DEFLATE

&& p[0] == CI_DEFLATE && p[1] == CILEN_DEFLATE) {

diff -ruNp ppp-2.4.4.orig/pppd/ccp.h ppp-2.4.4/pppd/ccp.h

--- ppp-2.4.4.orig/pppd/ccp.h 2004-11-04 12:02:26.000000000 +0200

+++ ppp-2.4.4/pppd/ccp.h 2008-02-13 19:03:43.000000000 +0200

@@ -43,6 +43,8 @@ typedef struct ccp_options {

short method; /* code for chosen compression method */

} ccp_options;

+bool allow_mppe_fallback;

+

extern fsm ccp_fsm[];

extern ccp_options ccp_wantoptions[];

extern ccp_options ccp_gotoptions[];

@@ -50,3 +52,5 @@ extern ccp_options ccp_allowoptions[];

extern ccp_options ccp_hisoptions[];

extern struct protent ccp_protent;

+

+

diff -ruNp ppp-2.4.4.orig/pppd/pppd.8 ppp-2.4.4/pppd/pppd.8

--- ppp-2.4.4.orig/pppd/pppd.8 2006-06-16 03:01:23.000000000 +0300

+++ ppp-2.4.4/pppd/pppd.8 2008-02-13 18:41:31.000000000 +0200

@@ -770,6 +770,9 @@ available under Linux.

.B nomppe

Disables MPPE (Microsoft Point to Point Encryption). This is the default.

.TP

+.B mppe-optional

+Makes MPPE optional, allowing both MPPE and non-MPPE clients

+.TP

.B nomppe\-40

Disable 40-bit encryption with MPPE.

.TP









オーバーレイと再アセンブリの後-pppd configに書き込みます



require-mppe

mppe-optional



クライアント側で暗号化を有効または無効にしたvpnの通常の動作を確認します。



debian lenny(ubuntuに適しているかもしれません)のパッケージを既にアセンブルしています



All Articles