
PPPoE를 사용하여 인터넷에 연결된 Ubuntu Server 14.04가 설치되어 있습니다. 현재 내 ppp0
인터페이스의 MTU는 1492이며 대부분 작동합니다.
내 ISP에서 지원하는 MTU를 1500으로 늘리고 싶습니다.
지금까지 기본 이더넷 인터페이스의 MTU를 1508로 늘렸고 다음 줄을 추가해 보았습니다./etc/ppp/peers/dsl-provider
mtu 1500
mru 1500
하지만 내 ppp0
인터페이스의 MTU는 여전히 1492입니다. 1492보다 낮은 값을 사용하면 예상대로 작동하므로 추가한 줄의 구문이 정확하다고 생각합니다.
ppp0
인터페이스가 활성화된 후 인터페이스 의 MTU를 1500으로 수동으로 변경하면 작동하지만 한 방향의 패킷에만 영향을 미칩니다. 그렇게 하면 인터넷을 통해 1500바이트 패킷을 보낼 수 있고 조각화 없이 목적지에 도착할 수 있습니다. 하지만 나에게 들어오는 트래픽은 여전히 1492바이트 조각으로 전송됩니다.
PPPoE 연결이 시작될 때 이더넷 인터페이스에서 트래픽을 캡처하면 내 Ubuntu Server 14.04 시스템이 공급자에게 보내는 구성 요청에서 MRU가 1492로 지정되어 있음을 알 수 있습니다. 따라서 문제가 나에게 있다는 것을 알고 있습니다. 연결의.
구성 파일에 1500이 표시되어 있는데 Ubuntu Server 14.04가 구성 요청에서 MRU로 1492를 사용하는 이유는 무엇입니까? 그리고 어떻게 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 및 filter를 통해 pppd를 실행하면 '열기' 요청을 표시하여 해당 구성을 가져올 파일을 열 수 있는지 확인할 수 있습니다.
sudo strace -f -e open pppd
영국 광대역의 내 경험에 따르면 BT를 통해 연결되는 경우 모든 연결은 1492였습니다. 추가로 8옥텟이 필요한 특별한 이유가 있습니까?
내가 이해하는 바는 MRU를 제대로 일치시키지 않으면 패킷이 여러 패킷이 될 수 있다는 것입니다. 특히 캡슐화를 위해 8옥텟 오버헤드와 같은 것을 허용하지 않는 경우 더욱 그렇습니다.