
PPPoE を使用してインターネットに接続された Ubuntu Server 14.04 をインストールしています。現時点では、ppp0
インターフェイスの MTU は 1492 で、ほぼ正常に動作しています。
MTU を ISP がサポートする 1500 に増やしたいと思います。
これまで、基盤となるイーサネットインターフェースのMTUを1508に増やし、次の行を追加してみました。/etc/ppp/peers/dsl-provider
mtu 1500
mru 1500
しかし、私のppp0
インターフェースの MTU はまだ 1492 です。1492 未満の値を使用すると期待どおりに動作するため、追加した行の構文は正しいと思います。
インターフェースを起動した後、手動で MTU をppp0
1500 に変更すると機能しますが、これは一方向のパケットにのみ影響します。これを行うと、1500 バイトのパケットをインターネット経由で送信でき、パケットは断片化されることなく宛先に到着します。しかし、私への着信トラフィックは、依然として 1492 バイトのフラグメントで送信されます。
PPPoE 接続が確立されたときにイーサネット インターフェイス上のトラフィックをキャプチャすると、Ubuntu Server 14.04 マシンがプロバイダーに送信する構成要求で、MRU が 1492 として指定されていることがわかります。したがって、問題は接続の私の側にあることがわかります。
構成ファイルでは 1500 と指定されているのに、Ubuntu Server 14.04 では構成要求で MRU として 1492 が使用されるのはなぜですか? また、これを 1500 に変更するにはどうすればいいですか?
答え1
ppp
次の 2 つのコマンドを入力してソース コードをダウンロードしました。
sudo apt-get build-dep ppp
apt-get source ppp
ヘッダー ファイルでpppd/plugins/rp-pppoe/pppoe.h
次の内容を見つけました:
/* Header size of a PPPoE packet */
#define PPPOE_OVERHEAD 6 /* type, code, session, length */
#define HDR_SIZE (sizeof(struct ethhdr) + PPPOE_OVERHEAD)
#define MAX_PPPOE_PAYLOAD (ETH_DATA_LEN - PPPOE_OVERHEAD)
#define MAX_PPPOE_MTU (MAX_PPPOE_PAYLOAD - 2)
ETH_DATA_LEN
は次のように定義されます/usr/include/linux/if_ether.h
#define ETH_DATA_LEN 1500 /* Max. octets in payload */
そしてpppd/plugins/rp-pppoe/plugin.c
私はこれを見つけました:
if (lcp_allowoptions[0].mru > MAX_PPPOE_MTU)
lcp_allowoptions[0].mru = MAX_PPPOE_MTU;
if (lcp_wantoptions[0].mru > MAX_PPPOE_MTU)
lcp_wantoptions[0].mru = MAX_PPPOE_MTU;
つまり、rp-pppoe
プラグインには 1492 バイトのハードコードされた制限があるということです。そして、これを増やす唯一の方法は、ソースを変更し、より高い制限でプラグインを再構築することです。
上記の 4 行を削除してplugin.c
モジュールを再構築することで、MTU を 1492 から 1500 に増やすことができました。これは、基礎となる行がより大きなサイズをサポートしていることがわかっている場合にのみ機能しますが、私の接続ではたまたまそのようになっています。
基礎となる回線の機能を検出するには、RFC 4638 をサポートする新しいバージョンの pppd を使用する必要があります。Ubuntu 16.04 には新しいバージョンの pppd が搭載されているため、コードを再コンパイルしなくても、PPPoE でより大きな MTU サイズを使用できるはずです。
答え2
strace とフィルターを介して pppd を実行し、「open」要求を表示して、どのファイルを開いて設定を取得しているかを確認できます。
sudo strace -f -e open pppd
私の経験(英国のブロードバンド)では、BT 経由の接続はすべて 1492 でしたが、さらに 8 オクテットが必要な特別な理由があるのでしょうか。
私の理解では、MRU を適切に一致させないと、特にカプセル化のための 8 オクテットのオーバーヘッドなどを許可しない場合は、パケットが複数のパケットになってしまう可能性があります。