
我安裝了 Ubuntu Server 14.04,它使用 PPPoE 連接到互聯網。目前我的ppp0
介面 MTU 為 1492,大部分情況下都可以運作。
我想將 MTU 增加到 1500,這是我的 ISP 支援的。
到目前為止,我已將底層乙太網路介面的 MTU 增加到 1508,並且我嘗試在/etc/ppp/peers/dsl-provider
mtu 1500
mru 1500
但我的ppp0
介面的 MTU 仍然為 1492。
ppp0
在介面啟動後手動將其 MTU 變更為 1500 是可行的,但它只會影響一個方向的封包。這樣我就能夠透過網路發送 1500 位元組的資料包,並且它們將到達目的地而不會出現碎片。但傳入的流量仍然以 1492 位元組片段的形式發送。
透過擷取 PPPoE 連線建立時乙太網路介面上的流量,我可以看到在我的 Ubuntu Server 14.04 電腦傳送給提供者的設定請求中,MRU 被指定為 1492 所以我知道問題出在我這邊連線的。
當設定檔顯示 1500 時,為什麼 Ubuntu Server 14.04 在設定檔請求中使用 1492 作為 MRU?我怎麼才能把它改成1500呢?
答案1
我ppp
透過輸入以下兩個命令下載了原始碼:
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 位元組。增加它的唯一方法是修改原始程式碼並重建具有更高限制的插件。
透過刪除上述四行plugin.c
並重建模組,我能夠將 MTU 從 1492 增加到 1500。只有當已知底層行支援更大的大小時,這才有效,這恰好是我的連接的情況。
為了偵測底層線路的功能,有必要使用支援 RFC 4638 的較新的 pppd 版本。 Ubuntu 16.04 有一個較新的 pppd 版本,因此應該能夠為 PPPoE 使用更大的 MTU 大小,而無需重新編譯任何程式碼。
答案2
您可以透過 strace 和過濾器執行 pppd 以顯示「開啟」請求,以查看開啟哪些檔案以取得其配置。
sudo strace -f -e open pppd
根據我(英國寬頻)的經驗,如果透過 BT,所有連線都是 1492,是否有特定原因需要另外 8 個八位元組?
我的理解是,如果您沒有正確匹配 MRU,您最終可能會導致資料包變成多個資料包,特別是如果您不允許諸如 8 個八位元組開銷之類的封裝。