今回は 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
ネットワークを構築する
今回は router
と provider
という 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
ちゃんと疎通があることが確認できる。
また、router
の gw-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 のサーバとクライアントを動作させてやり取りされるフレームを観察した。