Arch LinuxでPPPoEマルチセッション

Arch LinuxでPPPoEマルチセッションをしてみる。

PPPoEの接続にはpppdを、起動にはSystemdを使用します。

Arch Linuxではnetctlの使用が推奨されていますが、netctlではpppoeの複数接続ができないので直接pppdを使用します。






接続設定ファイルを作成

pppoe接続1。区別が付けばファイル名はなんでもいいです。
$ sudo vim /etc/ppp/peers/pppoe1

6行目WAN側のNICを指定し、8行目PPPoE1つ目のログイン用のIDを入力。
plugin rp-pppoe.so
# rp_pppoe_ac 'your ac name'
# rp_pppoe_service 'your service name'

# network interface
eth0
# login name
name "PPPoE1認証ID"
usepeerdns
persist
# Uncomment this if you want to enable dial on demand
#demand
#idle 180
defaultroute
hide-password
noauth



pppoe接続2。
$ sudo vim /etc/ppp/peers/pppoe2

6行目WAN側のNICを指定し、8行目PPPoE2つ目のログイン用のIDを入力。接続1をdefaultrouteにするのでこちらではdefaultrouteをコメントアウト。
plugin rp-pppoe.so
# rp_pppoe_ac 'your ac name'
# rp_pppoe_service 'your service name'

# network interface
eth0
# login name
name "PPPoE2認証ID"
usepeerdns
persist
# Uncomment this if you want to enable dial on demand
#demand
#idle 180
#defaultroute
hide-password
noauth



パスワードの設定
$ vim /etc/ppp/chap-secrets

Tab区切りでIDとパスワードが1行で対応するように最終行に追記します。
PPPoE1認証ID    *    PPPoE1認証パスワード
PPPoE2認証ID    *    PPPoE2認証パスワード






接続テスト。 ppp@/etc/ppp/peers内の接続設定ファイル というように指定してやります。
$ systemctl start ppp@pppoe1
$ systemctl start ppp@pppoe2



接続に成功したらppp0とppp1が作られているはずです。
$ ip a
24: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1454 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp
    inet 203.141.157.136 peer 111.89.255.139/32 scope global ppp0
       valid_lft forever preferred_lft forever
25: ppp1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1454 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp
    inet 123.225.172.13 peer 122.1.248.73/32 scope global ppp1
       valid_lft forever preferred_lft forever








起動時に有効化する
$ sudo systemctl enable ppp@pppoe1
$ sudo systemctl enable ppp@pppoe2



普通に利用するだけならこれでいいのですが、PPPoE1からはアクセスできるが、PPPoE2からのアクセスは遮断したい、などの設定が厄介です。

このままだとSystemdが自動で判断して起動順序を設定してしまうので、先着順にppp0,ppp1というように割り当てられてしまいます。

また、Systemdから起動順序を指定してもpppdを呼び出した時点でpppdはバックグラウンドで接続するので、pppoe1ができるまで待ってからpppoe2に移るというようなことができません。

これはpppdの仕様なのでどうすることもできません。



PPPoE1の接続を開始しppp0が作られるまで待機、ppp0ができたらPPPoE2の接続を開始するというシェルスクリプトとserviceファイルを作ります。1ファイルで完結せずシンプルではないですがこれ以外解決策が思い浮かびません。
$ vim /usr/bin/pppoestart.sh

#!/bin/bash
if [ $1 == 1 ]; then
    /usr/bin/pppd call pppoe1
    while ip a | grep ppp0 > /dev/null; do
        sleep 1s
    done
    /usr/bin/pppd call pppoe2
fi

if [ $1 == 0 ]; then
    /usr/bin/poff pppoe2
    /usr/bin/poff pppoe1
fi

if [ $1 == 2 ]; then
    /usr/bin/poff pppoe2
    /usr/bin/poff pppoe1
    /usr/bin/pppd call pppoe1
    while ip a | grep ppp0 > /dev/null; do
        sleep 1s
    done
    /usr/bin/pppd call pppoe2
fi


$ vim /etc/systemd/system/pppoestart.service

[Unit]
Description=PPPoE Start
Before=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/pppoestart.sh 1
ExecStop=/usr/bin/pppoestart.sh 0
ExecReload=/usr/bin/pppoestart.sh 2

[Install]
WantedBy=multi-user.target



ファイルのリロード
$ sudo systemctl daemon-reload



スタート
$ sudo systemctl start pppoestart



有効化
$ sudo systemctl enable pppoestart






pppが起動する前に他のネットワークマネージャーが起動していて、defaultrouteが設定されている場合、pppはdefaultrouteの設定を更新してくれません。

その場合は他のネットワークマネージャーでのdefaultroute設定を無効にするか、 pppd - ArchWiki デフォルトルート のようにシェルスクリプトを作る必要があります。



systemdとか廃止してSysVinitに戻してほしいゾ…

コメント

  1. > 先着順にppp0,ppp1というように割り当てられてしまいます。

    7年半前の記事にコメントするのもなんですが、unit 3 のように設定すれば常に ppp3 を優先して使用します

    返信削除

コメントを投稿

このブログの人気の投稿

fontconfigの設定

UEFIのブートオーダーを一時的に変更する

VLCでBlu-rayを再生