pppd

提供: ArchWiki
ナビゲーションに移動 検索に移動

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

And you have redialed the connection.

ノート: Make sure you have persist option enabled in your /etc/ppp/peers/provider tab. Additionally you might want to set holdoff 0 to reconnect without waiting.

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

ノート: If you aren't running your computer always on (running 24/7) then you can skip this step.

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 で以下の手順に従ってください:

Create a bash script similar to this and give it a name (e.g. pppd_redial.sh):

#!/bin/bash

message="Restarting the PPP connection @:" $(date)
pppd_id=$(pidof pppd)

kill -s HUP $pppd_id
echo $message

Give it execute permissions and put it on a path visible to root.

Then create a cron job using crontab -e. Check that your EDITOR env variable is set if the command fails. So add anywhere in the file,

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 with this content:
/etc/ppp/ip-pre-up/10-route-del-default.sh
#!/bin/sh
/usr/bin/route del default
  • pppd サービスを再起動してください。

マスカレードが動作しているのにサイトが動かない

The MTU under pppoe is 1492 bytes. Most sites use an MTU of 1500. So your connection sends an ICMP 3:4 (fragmentation needed) packet, asking for a smaller MTU, but some sites have their firewall blocking that.

Enabling the PMTU clamping in iptables can solve that:

iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Now, for some reason, just trying to save the resulting iptables configuration with iptables-save and restoring it later, does not work. It has to be executed after the other iptables configuration had been loaded. So, here is a systemd unit to solve it:

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

And enable it.

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がない場合は追加します。

正しいモジュールは、再起動後にロードされます。