Arch LinuxでPPPoEマルチセッション
Arch LinuxでPPPoEマルチセッションをしてみる。
PPPoEの接続にはpppdを、起動にはSystemdを使用します。
Arch Linuxではnetctlの使用が推奨されていますが、netctlではpppoeの複数接続ができないので直接pppdを使用します。
接続設定ファイルを作成
pppoe接続1。区別が付けばファイル名はなんでもいいです。
6行目WAN側のNICを指定し、8行目PPPoE1つ目のログイン用のIDを入力。
pppoe接続2。
6行目WAN側のNICを指定し、8行目PPPoE2つ目のログイン用のIDを入力。接続1をdefaultrouteにするのでこちらではdefaultrouteをコメントアウト。
パスワードの設定
Tab区切りでIDとパスワードが1行で対応するように最終行に追記します。
接続テスト。 ppp@/etc/ppp/peers内の接続設定ファイル というように指定してやります。
接続に成功したらppp0とppp1が作られているはずです。
起動時に有効化する
普通に利用するだけならこれでいいのですが、PPPoE1からはアクセスできるが、PPPoE2からのアクセスは遮断したい、などの設定が厄介です。
このままだとSystemdが自動で判断して起動順序を設定してしまうので、先着順にppp0,ppp1というように割り当てられてしまいます。
また、Systemdから起動順序を指定してもpppdを呼び出した時点でpppdはバックグラウンドで接続するので、pppoe1ができるまで待ってからpppoe2に移るというようなことができません。
これはpppdの仕様なのでどうすることもできません。
PPPoE1の接続を開始しppp0が作られるまで待機、ppp0ができたらPPPoE2の接続を開始するというシェルスクリプトとserviceファイルを作ります。1ファイルで完結せずシンプルではないですがこれ以外解決策が思い浮かびません。
ファイルのリロード
スタート
有効化
pppが起動する前に他のネットワークマネージャーが起動していて、defaultrouteが設定されている場合、pppはdefaultrouteの設定を更新してくれません。
その場合は他のネットワークマネージャーでのdefaultroute設定を無効にするか、 pppd - ArchWiki デフォルトルート のようにシェルスクリプトを作る必要があります。
systemdとか廃止してSysVinitに戻してほしいゾ…
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に戻してほしいゾ…
> 先着順にppp0,ppp1というように割り当てられてしまいます。
返信削除7年半前の記事にコメントするのもなんですが、unit 3 のように設定すれば常に ppp3 を優先して使用します