pppd

提供: ArchWiki
2016年4月30日 (土) 13:52時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

ppp (Paul's PPP Package) は Point-to-Point Protocol (PPP) を実装する Linux と Solaris システム用のオープンソースパッケージです。pppd デーモンとして実装されており xl2tpd, pptpd, netctl のバックエンドとして動作します。 3G, L2TP, PPPoE 接続は内部的に PPP プロトコルに基づいているため 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

ブート時に pppd を起動

  • ppp_generic モジュールをブート時にロードするように設定してください。詳しくはカーネルモジュールを参照。
  • systemd のサービスを有効化してください:
# systemctl enable ppp@your_provider.service

Tips and tricks

自動リダイヤル

pppd が実行中の場合、SIGHUP シグナルをプロセスに送ることで強制的に接続をリセットできます:

# export PPPD_PID=$(pidof pppd)
# kill -s HUP $PPPD_PID

これで接続がリダイアルされます。

ノート: /etc/ppp/peers/provider タブで persist オプションが有効になっていることを確認してください。また、holdoff 0 を設定することで待機しないで再接続するようになります。

24時間後に ISP と自動で切断

ノート: コンピュータを常時 (24時間365日) 動作させるのではない場合、このセクションはスキップしてかまいません。

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 to compensate for the rotating IP address. But to avoid disconnects when you don't 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 が特定時刻に再起動するようになります。

トラブルシューティング

デフォルトルート

If you have a preconfigured default route before the pppd is started, the default route is kept, so take a look in /var/log/errors.log and if you have something like:

pppd[nnnn]: not replacing existing default route via xxx.xxx.xxx.xxx

and xxx.xxx.xxx.xxx is not the correct route for you

  • Create a new script in /etc/ppp/ip-pre-up.d with this content:
/etc/ppp/ip-pre-up.d/10-route-del-default.sh
#!/bin/sh
/usr/bin/route del default
ノート: Make sure you have a script named 'ip-pre-up' which launches *.sh in 'ip-pre-up.d' like other launch scripts do.
  • 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 が存在しない場合は追加してください。

再起動することで正しいモジュールがロードされるようになります。