🐈

RaspberryPiを使ってPPPoEサーバを作る

2023/03/03に公開

背景

  • Yamaha RTXシリーズと、NEC IXシリーズでVPNを疎通したいが、ネットで公開されているナレッジではうまくいかない。実家と自宅の本番環境を使っての実験は限界がある。残念ながらテスト用のPPPoE契約を持っていないので、適当に巷にあふれている知識をつぎはぎしてPPPoEサーバを作る。

  • 今回実験したいVPN接続は、両側IP不定で、DDNSを利用したアドレス解決を行っている構成を想定している。したがって、FQDNでIPアドレスを解決したい。そこでPPPoEサーバ自体にDNSサーバを内蔵させ、疑似的にYamaha RTXのネットボランチDDNSや、NECのNetMeisterを利用している環境を再現する。

  • 試験環境とはいえインターネットに疎通しないと何かと不便であるし、楽しくない。そこで、RaspberryPiの無線LAN IF側でNAPTさせ、インターネットに疎通できるように設定する。

  • インターネットに無線LAN側から出られるようにする理由は、Raspberrypiに外付けNICを刺さなくてもお手軽に実験できるようにするため。速度や安定性は無視する。

  • PPPoEサーバは、wlan0経由で自宅のネットワークに参加するものとする。サーバを踏み台にして、下位に接続されたクライアント(ルータ)などにtelnetでアクセス可能にする。

  • 上記の条件を満たす検証環境をCiscoルータやNECルータで構築することも可能であるが、NAPT周りの設定で挫折してしまったことと、RaspberryPiで再現する記録を残しておけば再現性が高いこともあり、今回はRaspberryPiで実装する。

  • 最近ラズパイは高価なので、ヤフオクで安売りしているシンクライアントを改造するのがおすすめ。x86互換機のUTMを改造すればNICもたくさんついていてさらに良い。

要件

  • PPPoEサーバとして利用できる
  • eth0でクライアントを待ち受ける
  • ユーザ名に応じたFQDNが割り当てられ、PPPoEサーバ内部に内蔵したDNSで解決可能できる
  • wlan0(無線LAN IF)からNAPTしてインターネットへルーティングできる

OSのインストール

Raspberrypi imagerを使い、raspbian lite 32bitをインストールしておく。sshを有効にし、無線LANを用いてインターネットに疎通できるようにしておく。有線LANは、PPPoEの待ち受けIFになるので、何もしない。

PPPoEサーバの設定

https://www.ingenious.jp/articles/howto/raspberry-pi-howto/pppoe-server/ に従って設定する。
設定の差異は下記の通り。

  • test1~7までのユーザを追加する。既設のClass CプライベートIPとかぶらないようにするため、クラスBプライベートIPを採用する。
/etc/ppp/pap-secrets
test1	*	"password"	172.16.1.1
test2	*	"password"	172.16.1.2
test3	*	"password"	172.16.1.3
test4	*	"password"	172.16.1.4
test5	*	"password"	172.16.1.5
test6	*	"password"	172.16.1.6
test7	*	"password"	172.16.1.7
/etc/ppp/options
ms-dns 172.16.0.1 #DNS
asyncmap 0
auth
crtscts
lock
hide-password
modem
+pap         #コメントアウト
proxyarp     #コメントアウト
lcp-echo-interval 30
lcp-echo-failure 4
noipx
persist #コメントアウト
maxfail 0
  • サーバのIPは172.16.0.1で待ち受けることにする。起動時にサーバを起動することにする。
/etc/rc.local
sudo pppoe-server -I eth0 -L 172.16.0.1 -O /etc/ppp/options

DNSサーバの設定

test1~7までを、FQDNで名前解決できるようにDNSサーバを腹抱えする。bindは設定がめんどくさいのでdnsmasqで簡単に実装してしまう。

https://deviceplus.jp/raspberrypi/how-to-use-raspberry-pi-as-dns-server/ を参照して進め、上位DNSにGoogle Public DNSを指定しておく。アクセス先の制限はおそらく不要か、調整しておく。アクセス元IP(listen-address)を書いておかないとクライアントからのリクエストに応答してくれないので気を付ける。

ローカルで解決させるFQDNの設定は、下記のとおりとする。

/etc/dnsmasq.conf
listen-address=172.16.0.1 #アクセスを受けるIFのIPアドレス
listen-address=127.0.0.1
address=/test1.local/172.16.1.1 #クライアントFQDN
address=/test2.local/172.16.1.2
address=/test3.local/172.16.1.3
address=/test4.local/172.16.1.4
address=/test5.local/172.16.1.5
address=/test6.local/172.16.1.6
address=/test7.local/172.16.1.7

サービスを再起動する

sudo systemctl restart dnsmasq
sudo systemctl enable dnsmasq

テスト
きちんと解決できることを確認する。

sudo apt -y install dns-tools #digが使えないので
dig test1.local @localhost

;; ANSWER SECTION:
test1.local.            0       IN      A       172.16.1.1

ルーティングの設定

PPPoEクライアントからインターネットに出られるようにする。

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

debianのiptablesは再起動すると消えるので、再起動時に戻す。
iptables-paesistentとか使ったほうがいい?

/etc/rc.local
iptables-restore < /etc/iptables.ipv4.nat

telnetクライアント

PPPoEサーバを踏み台にして、下位のクライアントにtelnetできるようにするためにtelnetクライアントを導入する。

sudo apt install telnet

VPN疎通実験

気が向いたときに頑張ることにする。

Discussion