pppd
ppp (Paul's PPP Package) は Point-to-Point Protocol (PPP) を実装する Linux と Solaris システム用のオープンソースパッケージです。pppd デーモンとして実装されており xl2tpd, pptpd, netctl のバックエンドとして動作します。 3G, L2TP, PPPoE 接続は内部的に PPP プロトコルに基づいているため ppp で処理することができます。
目次
インストール
カーネルに PPPoE サポートが組み込まれていることを確認してください (デフォルトのカーネルには存在します):
$ zgrep CONFIG_PPPOE /proc/config.gz
CONFIG_PPPOE=m
設定
PPPoE
接続設定ファイルの作成:
/etc/ppp/peers/your_provider
plugin rp-pppoe.so # rp_pppoe_ac 'your ac name' # rp_pppoe_service 'your service name' # network interface eth0 # login name name "someloginname" usepeerdns persist # Uncomment this if you want to enable dial on demand #demand #idle 180 defaultroute hide-password noauth
usepeerdns
オプションを使用すると、pppd は /etc/ppp/resolv.conf
ファイルを作成して接続の確立時に DNS アドレスを取得します。デフォルトでは、/etc/ppp/ip-up.d/00_dns
フックスクリプトがこのファイルを /etc/resolv.conf
に移動して、システムがネームサーバーを使えるようにします。この挙動が望ましくない場合 (例: ローカルのキャッシュ DNS を使う場合)、必要に応じて /etc/ppp/ip-up.d/00_dns.sh
を編集してください。
ISP が使用している認証方法に合わせて以下のような行を /etc/ppp/pap-secrets
か /etc/ppp/chap-secrets
に記述してください。両方のファイルに記述しても問題ありません、pppd は自動的に適切な方を使います:
someloginname * yourpassword
次のコマンドを使えば接続を開始できます:
# pppd call your_provider
もしくは、次のコマンドを使ってください:
# pon your_provider
your_provider は /etc/ppp/peers
のオプションファイルの名前に置き換えてください。
PPPoE 接続が正しく開始されたかどうか確認するには、システムログの pppd の出力を見て下さい:
# journalctl -b --no-pager | grep pppd
接続が成功していれば、以下のようなメッセージが表示されます:
Jul 09 22:42:33 localhost pppd[239]: Plugin rp-pppoe.so loaded. Jul 09 22:42:33 localhost pppd[239]: RP-PPPoE plugin version 3.8p compiled against pppd 2.4.6 Jul 09 22:42:33 localhost network[184]: RP-PPPoE plugin version 3.8p compiled against pppd 2.4.6 Jul 09 22:42:33 localhost pppd[239]: pppd 2.4.6 started by root, uid 0 Jul 09 22:42:39 localhost pppd[239]: PPP session is 292 Jul 09 22:42:39 localhost pppd[239]: Connected to a0:f3:e4:4f:e3:b0 via interface enp4s0 Jul 09 22:42:39 localhost pppd[239]: Using interface ppp0 Jul 09 22:42:39 localhost pppd[239]: Connect: ppp0 <--> enp4s0 Jul 09 22:42:39 localhost pppd[239]: CHAP authentication succeeded: CHAP authentication success Jul 09 22:42:39 localhost pppd[239]: CHAP authentication succeeded Jul 09 22:42:39 localhost pppd[239]: peer from calling number A0:F3:E4:4F:E3:B0 authorized Jul 09 22:42:39 localhost pppd[239]: Cannot determine ethernet address for proxy ARP Jul 09 22:42:39 localhost pppd[239]: local IP address 10.6.2.137 Jul 09 22:42:39 localhost pppd[239]: remote IP address 10.6.1.1 Jul 09 22:42:39 localhost pppd[239]: primary DNS address 10.6.1.1 Jul 09 22:42:39 localhost pppd[239]: secondary DNS address 210.21.196.6
デフォルトでは /etc/ppp/peers/provider
の設定がデフォルトとして扱われます。"your_provider" をデフォルトにしたい場合は、以下のようなリンクを作成することができます:
# ln -s /etc/ppp/peers/your_provider /etc/ppp/peers/provider
これで次を実行するだけで接続を開始できます:
# pon
接続を終了するには、次のコマンドを使用:
# poff your_provider
簡単なウィザード設定
pppconfigAUR には pppd を簡単に設定できるダイアログインターフェイスが入っています。root で pppconfig
を実行して指示に従うだけで設定が作成されます:
# pppconfig --dialog
作成された設定は上のように pon
で呼び出すことができ、poff
で終了できます。
ブート時に pppd を起動
# systemctl enable ppp@your_provider.service
ヒントとテクニック
自動リダイヤル
pppd が実行中の場合、SIGHUP
シグナルをプロセスに送ることで強制的に接続をリセットできます:
# export PPPD_PID=$(pidof pppd) # kill -s HUP $PPPD_PID
これで接続がリダイアルされます。
24時間後に ISP と自動で切断
If you use a flat-rate always-on connection on a computer, some providers restart your connection after 24h. That makes sure that the IP is rotated every 24h. To compensate, you can use an dynamic DNS service in combination with inadynAUR[リンク切れ: アーカイブ: aur-mirror] to compensate for the rotating IP address. But to avoid disconnects when you do not need it, you might try to restart the connection using a cron job or systemd timer at a time of day you know no one will be using the connection (e.g. at 4 AM).
cron を使う
root で以下の手順に従ってください:
以下のような bash スクリプトを作成して名前を付けて下さい (例: pppd_redial.sh
):
#!/bin/bash message="Restarting the PPP connection @:" $(date) pppd_id=$(pidof pppd) kill -s HUP $pppd_id echo $message
実行権限を与えて root から実行できるパスに配置します。
次に crontab -e
を使って cron ジョブを作成して下さい。コマンドが失敗する場合は EDITOR
環境変数が設定されているか確認してください。crontab に以下を記述します:
0 4 * * * /bin/bash /root/pppd_redial.sh
cronie
サービスが動くことを確認してください。動かない場合は、サービスを有効化して起動してください。
保存して終了です。これで PPPoE 接続は毎日朝4時に再起動します。
systemd タイマーを使う
systemd タイマーと poff スクリプト (特に -r
オプション) を使って強制的に再接続する方法もあります。同じ名前の .service と .timer ファイルを作成してください:
ppp-redial.timer
[Unit] Description=Reconnect PPP connections daily [Timer] OnCalendar=*-*-* 05:00:00 [Install] WantedBy=multi-user.target
ppp-redial.service
[Unit] Description=Reconnect PPP connections [Service] Type=simple ExecStart=/usr/bin/poff -r
タイマーを有効化して起動すれば systemd が特定時刻に再起動するようになります。
トラブルシューティング
デフォルトルート
pppd が起動する以前から設定済みのデフォルトルートがある場合、デフォルトルートは維持されるため /var/log/errors.log
を見て以下のような出力がないか確認してください:
pppd[nnnn]: not replacing existing default route via xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx
は正しいルートではない可能性があります。
/etc/ppp/ip-pre-up.d
に以下の内容で新しいスクリプトを作成してください:
/etc/ppp/ip-pre-up.d/10-route-del-default.sh
#!/bin/sh /usr/bin/route del default
pppd
サービスを再起動してください。
マスカレードが動作しているのにサイトが動かない
pppoe における MTU は1492バイトです。ほとんどのサイトで使われている MTU は1500です。そのため、小さい MTU を要求するために ICMP 3:4 (fragmentation needed) パケットが送信されますが、サイトによってはファイアウォールでブロックされてしまうことがあります。
iptables で PMTU クランプを有効にすることで問題は解決します:
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
しかしながら、作成された iptables の設定を iptables-save で保存して、後から読み込んでも、何らかの理由で上手く行きません。他の iptables 設定がロードされた後に実行する必要があります。以下の systemd ユニットを使うことで解決できます:
pmtu-clamping.service
[Unit] Description=PMTU clamping for pppoe Requires=iptables.service After=iptables.service [Service] Type=oneshot ExecStart=/usr/bin/iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu [Install] WantedBy=multi-user.target
そして有効化してください。
pppd が ppp_generic カーネルモジュールをロードできない
PPTP クライアント起動時に、"pppd" プロセスが適切なモジュールを見つけることができない場合:
Couldn't open the /dev/ppp device: No such device or address Please load the ppp_generic kernel module.
解決方法は、/etc/modprobe.d/modules.conf
ファイルを変更します:
alias char-major-108 ppp
を以下のように変更します:
alias char-major-108 ppp_generic
そのような alias が存在しない場合は追加してください。
再起動することで正しいモジュールがロードされるようになります。