CUBE SUGAR CONTAINER

技術系のこと書きます。

Linux の Network Namespace で PPPoE を試す

今回は PPPoE (PPP over Ethernet) のサーバとクライアントを Network Namespace の環境で動かしてみる。 PPPoE は、その名のとおり PPP (Point-to-Point Protocol) を Ethernet で使えるようにしたもの。 NTT 東西が提供するブロードバンドサービスのフレッツで、ユーザの認証や設定のために使われていることで有名なプロトコル。

使った環境は次のとおり。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
$ uname -srm
Linux 5.15.0-71-generic aarch64

もくじ

下準備

まずは必要なパッケージをインストールしておく。

$ sudo apt-get update
$ sudo apt-get -y install pppoe pppoeconf

ネットワークを構築する

今回は routerprovider という 2 つの Network Namespace を作る。 router がユーザの自宅にあるブロードバンドルータを想定している。 同様に provider が ISP の AC (Access Concentrator) を想定している。 ようするに router がクライアントで provider がサーバということ。

$ sudo ip netns add router
$ sudo ip netns add provider

Network Namespace 同士を接続するのに Virtual Ethernet デバイスのインターフェイスを用意する。

$ sudo ip link add wan-veth0 type veth peer name gw-veth0
$ sudo ip link set wan-veth0 netns provider
$ sudo ip link set gw-veth0 netns router

それぞれのインターフェイスに MAC アドレスを指定した上でリンクアップさせる。

$ sudo ip netns exec provider ip link set wan-veth0 address 00:00:5E:00:53:01
$ sudo ip netns exec provider ip link set wan-veth0 up
$ sudo ip netns exec router ip link set gw-veth0 address 00:00:5E:00:53:02
$ sudo ip netns exec router ip link set gw-veth0 up

サーバ側のインターフェイスには IP アドレスを付与しておく。

$ sudo ip netns exec provider ip address add 203.0.113.254/24 dev wan-veth0

サーバをセットアップする

まずは PPPoE のサーバをセットアップする。

PPPoE サーバの設定ファイルを次のように用意する。 認証には CHAP (Challenge-Handshake Authentication Protocol) を使う。

$ cat << 'EOF' | sudo tee /etc/ppp/pppoe-server-options > /dev/null
require-chap
lcp-echo-interval 60
lcp-echo-failure 5
debug
logfile /var/log/pppd.log
EOF

続いて、ユーザのアカウントを設定ファイルに記述する。 以下では testuser というユーザ名で testpassword というパスワードのアカウントを設定している。

$ cat << 'EOF' | sudo tee /etc/ppp/chap-secrets > /dev/null
"testuser" * "testpassword" *
EOF

そして、PPPoE サーバのプロセスを起動する。 -I オプションはリクエストを待ち受けるインターフェイスを指定する。 -L はサーバ側のトンネル終端アドレスの指定になる。 -R はクライアント側のトンネル終端アドレスの開始アドレスを指定する。

$ sudo ip netns exec provider \
    pppoe-server \
      -I wan-veth0 \
      -L 192.0.2.1 \
      -R 192.0.2.10

これでサーバが起動した。

クライアントをセットアップする

続いては PPPoE のクライアントをセットアップする。

はじめに、サーバに接続するための設定ファイルを用意する。 先ほどのアカウントや、使用するインターフェイスの情報を入力する。

$ cat << 'EOF' | sudo tee /etc/ppp/peers/example-provider > /dev/null
user "testuser"
password "testpassword"
plugin rp-pppoe.so
gw-veth0
noauth
defaultroute
EOF

あとは pon(1) を使ってコネクションを開始する。 コマンドの引数は、先ほど作成した設定ファイルのファイル名になる。

$ sudo ip netns exec router \
    pon example-provider
Plugin rp-pppoe.so loaded.

コマンドを実行したら plog(1) を使って pppd(8) のログを確認しよう。 ここにはサーバとクライアントのログが一緒になって表示される

$ plog
May  6 18:14:33 jammy pppd[1726]: rcvd [IPCP ConfAck id=0x2 <addr 192.0.2.1>]
May  6 18:14:33 jammy pppd[1726]: Script /etc/ppp/ip-pre-up started (pid 1734)
May  6 18:14:33 jammy pppd[1722]: local  IP address 192.0.2.10
May  6 18:14:33 jammy pppd[1722]: remote IP address 192.0.2.1
May  6 18:14:33 jammy pppd[1726]: Script /etc/ppp/ip-pre-up finished (pid 1734), status = 0x0
May  6 18:14:33 jammy pppd[1726]: local  IP address 192.0.2.1
May  6 18:14:33 jammy pppd[1726]: remote IP address 192.0.2.10
May  6 18:14:33 jammy pppd[1726]: Script /etc/ppp/ip-up started (pid 1743)
May  6 18:14:33 jammy pppd[1726]: Script /etc/ppp/ipv6-up finished (pid 1733), status = 0x0
May  6 18:14:33 jammy pppd[1726]: Script /etc/ppp/ip-up finished (pid 1743), status = 0x0

上手くいけば IPCP (Internet Protocol Control Protocol) で設定されたトンネルの終端アドレスがログに表示されるはず。

router の方で ip address show サブコマンドを実行すると ppp0 インターフェイスが作成されている。 これが PPP のトンネルを表した仮想インターフェイスになる。 また、トンネル終端アドレスとしては 192.0.2.10 が付与されていることが分かる。

$ sudo ip netns exec router ip address show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp 
    inet 192.0.2.10 peer 192.0.2.1/32 scope global ppp0
       valid_lft forever preferred_lft forever
    inet6 fe80::218b:d4d:3f74:4dd4 peer fe80::b176:a450:3399:a86f/128 scope link 
       valid_lft forever preferred_lft forever
3: gw-veth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:00:5e:00:53:02 brd ff:ff:ff:ff:ff:ff link-netns provider
    inet6 fe80::200:5eff:fe00:5302/64 scope link 
       valid_lft forever preferred_lft forever

同様に provider 側も確認すると、こちらも ppp0 インターフェイスが作成されて 192.0.2.1 が付与されている。

$ sudo ip netns exec provider ip address show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp 
    inet 192.0.2.1 peer 192.0.2.10/32 scope global ppp0
       valid_lft forever preferred_lft forever
    inet6 fe80::b176:a450:3399:a86f peer fe80::218b:d4d:3f74:4dd4/128 scope link 
       valid_lft forever preferred_lft forever
4: wan-veth0@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:00:5e:00:53:01 brd ff:ff:ff:ff:ff:ff link-netns router
    inet 203.0.113.254/24 scope global wan-veth0
       valid_lft forever preferred_lft forever
    inet6 fe80::200:5eff:fe00:5301/64 scope link 
       valid_lft forever preferred_lft forever

router の方でルーティングテーブルを確認すると、トンネルインターフェイスにデフォルトルートが向いていることが確認できる。

$ sudo ip netns exec router ip route show
default dev ppp0 scope link 
192.0.2.1 dev ppp0 proto kernel scope link src 192.0.2.10

試しに router から provider の IP アドレスに ping(1) を打ってみよう。

$ sudo ip netns exec router ping -c 3 203.0.113.254
PING 203.0.113.254 (203.0.113.254) 56(84) bytes of data.
64 bytes from 203.0.113.254: icmp_seq=1 ttl=64 time=0.215 ms
64 bytes from 203.0.113.254: icmp_seq=2 ttl=64 time=0.362 ms
64 bytes from 203.0.113.254: icmp_seq=3 ttl=64 time=0.326 ms

--- 203.0.113.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2155ms
rtt min/avg/max/mdev = 0.215/0.301/0.362/0.062 ms

ちゃんと疎通があることが確認できる。

また、routergw-veth0 インターフェイスのパケットをキャプチャしてみると、次のように PPPoE ヘッダが確認できる。

$ sudo ip netns exec router tcpdump -tnel -i gw-veth0
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on gw-veth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 106: PPPoE  [ses 0x1] IP (0x0021), length 86: 192.0.2.10 > 203.0.113.254: ICMP echo request, id 63894, seq 1, length 64
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 106: PPPoE  [ses 0x1] IP (0x0021), length 86: 203.0.113.254 > 192.0.2.10: ICMP echo reply, id 63894, seq 1, length 64
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 106: PPPoE  [ses 0x1] IP (0x0021), length 86: 192.0.2.10 > 203.0.113.254: ICMP echo request, id 63894, seq 2, length 64
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 106: PPPoE  [ses 0x1] IP (0x0021), length 86: 203.0.113.254 > 192.0.2.10: ICMP echo reply, id 63894, seq 2, length 64
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 106: PPPoE  [ses 0x1] IP (0x0021), length 86: 192.0.2.10 > 203.0.113.254: ICMP echo request, id 63894, seq 3, length 64
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 106: PPPoE  [ses 0x1] IP (0x0021), length 86: 203.0.113.254 > 192.0.2.10: ICMP echo reply, id 63894, seq 3, length 64

PPPoE のやり取りをパケットキャプチャしてみる

次は PPPoE のユーザ認証や設定をしている部分もパケットキャプチャしてみよう。

一旦 poff(1) で PPPoE のコネクションを切断する。

$ sudo ip netns exec router poff example-provider

コネクションを切断すると、次のように ppp0 インターフェイスが見えなくなる。

$ sudo ip netns exec router ip address show
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: gw-veth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:00:5e:00:53:02 brd ff:ff:ff:ff:ff:ff link-netns provider
    inet6 fe80::200:5eff:fe00:5302/64 scope link 
       valid_lft forever preferred_lft forever

別のターミナルを開いて tcpdump(1) を起動する。 このとき PPPoE のフレームだけキャプチャできるようにフィルタを設定する。

$ sudo ip netns exec router tcpdump -tnel -i gw-veth0 -v "pppoed or pppoes"

パケットキャプチャの準備ができたら pon(1) でコネクションを再接続する。

$ sudo ip netns exec router pon example-provider

すると、次のようなやり取りが確認できる。 最初に PADI / PADO/ PADR/ PADS がやり取りされている。 そして、その次に LCP / CHAP でユーザ認証に関する情報がやり取りされる。 最後に IPCP でトンネル終端の IP アドレスに関する情報がやり取りされる。

$ sudo ip netns exec router tcpdump -tnel -i gw-veth0 -v "pppoed or pppoes"
tcpdump: listening on gw-veth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
00:00:5e:00:53:02 > ff:ff:ff:ff:ff:ff, ethertype PPPoE D (0x8863), length 32: PPPoE PADI [Service-Name] [Host-Uniq 0xA6070000]
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE D (0x8863), length 65: PPPoE PADO [AC-Name "jammy"] [Service-Name] [AC-Cookie 0xC761CFF6554C622D68F8CB294C902485B2060000] [Host-Uniq 0xA6070000]
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE D (0x8863), length 56: PPPoE PADR [Service-Name] [Host-Uniq 0xA6070000] [AC-Cookie 0xC761CFF6554C622D68F8CB294C902485B2060000]
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE D (0x8863), length 32: PPPoE PADS [ses 0x2] [Service-Name] [Host-Uniq 0xA6070000]
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 36: PPPoE  [ses 0x2] LCP (0xc021), length 16: LCP, Conf-Request (0x01), id 1, length 16
    encoded length 14 (=Option(s) length 10)
      MRU Option (0x01), length 4: 1492
      Magic-Num Option (0x05), length 6: 0x9ef0d929
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 41: PPPoE  [ses 0x2] LCP (0xc021), length 21: LCP, Conf-Request (0x01), id 1, length 21
    encoded length 19 (=Option(s) length 15)
      MRU Option (0x01), length 4: 1492
      Auth-Prot Option (0x03), length 5: CHAP, MD5
      Magic-Num Option (0x05), length 6: 0xe77abbef
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 41: PPPoE  [ses 0x2] LCP (0xc021), length 21: LCP, Conf-Ack (0x02), id 1, length 21
    encoded length 19 (=Option(s) length 15)
      MRU Option (0x01), length 4: 1492
      Auth-Prot Option (0x03), length 5: CHAP, MD5
      Magic-Num Option (0x05), length 6: 0xe77abbef
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 36: PPPoE  [ses 0x2] LCP (0xc021), length 16: LCP, Conf-Request (0x01), id 1, length 16
    encoded length 14 (=Option(s) length 10)
      MRU Option (0x01), length 4: 1492
      Magic-Num Option (0x05), length 6: 0x9ef0d929
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 36: PPPoE  [ses 0x2] LCP (0xc021), length 16: LCP, Conf-Ack (0x02), id 1, length 16
    encoded length 14 (=Option(s) length 10)
      MRU Option (0x01), length 4: 1492
      Magic-Num Option (0x05), length 6: 0x9ef0d929
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 30: PPPoE  [ses 0x2] LCP (0xc021), length 10: LCP, Echo-Request (0x09), id 0, length 10
    encoded length 8 (=Option(s) length 4)
      Magic-Num 0x9ef0d929
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 30: PPPoE  [ses 0x2] LCP (0xc021), length 10: LCP, Echo-Request (0x09), id 0, length 10
    encoded length 8 (=Option(s) length 4)
      Magic-Num 0xe77abbef
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 30: PPPoE  [ses 0x2] LCP (0xc021), length 10: LCP, Echo-Reply (0x0a), id 0, length 10
    encoded length 8 (=Option(s) length 4)
      Magic-Num 0x9ef0d929
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 53: PPPoE  [ses 0x2] CHAP (0xc223), length 33: CHAP, Challenge (0x01), id 156, Value e7c4ffa78bd4b3c23a430a0062bb63e007de831b81, Name jammy
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 51: PPPoE  [ses 0x2] CHAP (0xc223), length 31: CHAP, Response (0x02), id 156, Value 7fb0ad18e44ec011ffa05894274c33b6, Name testuser
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 30: PPPoE  [ses 0x2] LCP (0xc021), length 10: LCP, Echo-Reply (0x0a), id 0, length 10
    encoded length 8 (=Option(s) length 4)
      Magic-Num 0xe77abbef
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 40: PPPoE  [ses 0x2] CHAP (0xc223), length 20: CHAP, Success (0x03), id 156, Msg Access granted
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 32: PPPoE  [ses 0x2] IPCP (0x8021), length 12: IPCP, Conf-Request (0x01), id 1, length 12
    encoded length 10 (=Option(s) length 6)
      IP-Addr Option (0x03), length 6: 0.0.0.0
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 36: PPPoE  [ses 0x2] IP6CP (0x8057), length 16: IP6CP, Conf-Request (0x01), id 1, length 16
    encoded length 14 (=Option(s) length 10)
      Interface-ID Option (0x01), length 10: 9cb8:5614:c486:dc46
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 37: PPPoE  [ses 0x2] CCP (0x80fd), length 17: CCP, Conf-Request (0x01), id 1, length 17
    encoded length 15 (=Option(s) length 11)
      Deflate Option (0x1a), length 4: Window: 7K, Method: zlib (0x8), MBZ: 0, CHK: 0
      MVRCA Option (0x18), length 4: Features: 1, PxP: Enabled, History: 24, #CTX-ID: 0
      BSD-Comp Option (0x15), length 3: Version: 1, Dictionary Bits: 15
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 26: PPPoE  [ses 0x2] CCP (0x80fd), length 6: CCP, Conf-Request (0x01), id 1, length 6
    encoded length 4 (=Option(s) length 0)
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 37: PPPoE  [ses 0x2] CCP (0x80fd), length 17: CCP, Conf-Reject (0x04), id 1, length 17
    encoded length 15 (=Option(s) length 11)
      Deflate Option (0x1a), length 4: Window: 7K, Method: zlib (0x8), MBZ: 0, CHK: 0
      MVRCA Option (0x18), length 4: Features: 1, PxP: Enabled, History: 24, #CTX-ID: 0
      BSD-Comp Option (0x15), length 3: Version: 1, Dictionary Bits: 15
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 38: PPPoE  [ses 0x2] IPCP (0x8021), length 18: IPCP, Conf-Request (0x01), id 1, length 18
    encoded length 16 (=Option(s) length 12)
      IP-Comp Option (0x02), length 6: VJ-Comp (0x2d):
      IP-Addr Option (0x03), length 6: 192.0.2.1
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 32: PPPoE  [ses 0x2] IPCP (0x8021), length 12: IPCP, Conf-Reject (0x04), id 1, length 12
    encoded length 10 (=Option(s) length 6)
      IP-Comp Option (0x02), length 6: VJ-Comp (0x2d):
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 36: PPPoE  [ses 0x2] IP6CP (0x8057), length 16: IP6CP, Conf-Request (0x01), id 1, length 16
    encoded length 14 (=Option(s) length 10)
      Interface-ID Option (0x01), length 10: 54d8:292a:6f6e:60fd
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 36: PPPoE  [ses 0x2] IP6CP (0x8057), length 16: IP6CP, Conf-Ack (0x02), id 1, length 16
    encoded length 14 (=Option(s) length 10)
      Interface-ID Option (0x01), length 10: 54d8:292a:6f6e:60fd
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 32: PPPoE  [ses 0x2] IPCP (0x8021), length 12: IPCP, Conf-Nack (0x03), id 1, length 12
    encoded length 10 (=Option(s) length 6)
      IP-Addr Option (0x03), length 6: 192.0.2.11
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 32: PPPoE  [ses 0x2] IPCP (0x8021), length 12: IPCP, Conf-Request (0x01), id 2, length 12
    encoded length 10 (=Option(s) length 6)
      IP-Addr Option (0x03), length 6: 192.0.2.11
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 36: PPPoE  [ses 0x2] IP6CP (0x8057), length 16: IP6CP, Conf-Ack (0x02), id 1, length 16
    encoded length 14 (=Option(s) length 10)
      Interface-ID Option (0x01), length 10: 9cb8:5614:c486:dc46
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 70: PPPoE  [ses 0x2] IP6 (0x0057), length 50: (hlim 255, next-header ICMPv6 (58) payload length: 8) fe80::9cb8:5614:c486:dc46 > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 8
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 26: PPPoE  [ses 0x2] CCP (0x80fd), length 6: CCP, Conf-Ack (0x02), id 1, length 6
    encoded length 4 (=Option(s) length 0)
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 26: PPPoE  [ses 0x2] CCP (0x80fd), length 6: CCP, Conf-Request (0x01), id 2, length 6
    encoded length 4 (=Option(s) length 0)
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 32: PPPoE  [ses 0x2] IPCP (0x8021), length 12: IPCP, Conf-Request (0x01), id 2, length 12
    encoded length 10 (=Option(s) length 6)
      IP-Addr Option (0x03), length 6: 192.0.2.1
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 70: PPPoE  [ses 0x2] IP6 (0x0057), length 50: (hlim 255, next-header ICMPv6 (58) payload length: 8) fe80::54d8:292a:6f6e:60fd > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 8
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype PPPoE S (0x8864), length 32: PPPoE  [ses 0x2] IPCP (0x8021), length 12: IPCP, Conf-Ack (0x02), id 2, length 12
    encoded length 10 (=Option(s) length 6)
      IP-Addr Option (0x03), length 6: 192.0.2.11
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 26: PPPoE  [ses 0x2] CCP (0x80fd), length 6: CCP, Conf-Ack (0x02), id 2, length 6
    encoded length 4 (=Option(s) length 0)
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype PPPoE S (0x8864), length 32: PPPoE  [ses 0x2] IPCP (0x8021), length 12: IPCP, Conf-Ack (0x02), id 2, length 12
    encoded length 10 (=Option(s) length 6)
      IP-Addr Option (0x03), length 6: 192.0.2.1

なお、今回はトンネル終端アドレスしか配布していないが DNS サーバなどの情報も配布できる。

まとめ

今回は Linux の Network Namespace の環境で PPPoE のサーバとクライアントを動作させてやり取りされるフレームを観察した。