arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
308 lines (198 loc) • 18.5 kB
Markdown
**ppp** (*Paul's PPP Package*) — пакет с открытым исходным кодом, который реализует [протокол соединения точка-точка](https://en.wikipedia.org/wiki/ru:PPP_(%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB) (PPP) для систем Linux и Solaris. Пакет предоставляет демон *pppd*, который может быть использован вместе с [xl2tpd](https://www.archlinux.org/packages/?name=xl2tpd), [pptpd](https://www.archlinux.org/packages/?name=pptpd) и [netctl](/index.php/Netctl_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Netctl (Русский)").
Протоколы [3G](https://en.wikipedia.org/wiki/ru:3G "wikipedia:ru:3G"), [L2TP](https://en.wikipedia.org/wiki/ru:L2TP "wikipedia:ru:L2TP") и [PPPoE](https://en.wikipedia.org/wiki/ru:PPPoE "wikipedia:ru:PPPoE") работают на основе PPP, поэтому они также могут контролироваться ppp.
## Contents
* [1 Установка](#.D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0)
* [2 Настройка](#.D0.9D.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9.D0.BA.D0.B0)
* [2.1 PPPoE](#PPPoE)
* [2.2 Запуск pppd при старте системы](#.D0.97.D0.B0.D0.BF.D1.83.D1.81.D0.BA_pppd_.D0.BF.D1.80.D0.B8_.D1.81.D1.82.D0.B0.D1.80.D1.82.D0.B5_.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D1.8B)
* [3 Дополнительно](#.D0.94.D0.BE.D0.BF.D0.BE.D0.BB.D0.BD.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE)
* [3.1 Автодозвон](#.D0.90.D0.B2.D1.82.D0.BE.D0.B4.D0.BE.D0.B7.D0.B2.D0.BE.D0.BD)
* [3.2 Автоматический разрыв соединения](#.D0.90.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D0.B9_.D1.80.D0.B0.D0.B7.D1.80.D1.8B.D0.B2_.D1.81.D0.BE.D0.B5.D0.B4.D0.B8.D0.BD.D0.B5.D0.BD.D0.B8.D1.8F)
* [3.2.1 Используя cron](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_cron)
* [3.2.2 Используя таймер systemd](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_.D1.82.D0.B0.D0.B9.D0.BC.D0.B5.D1.80_systemd)
* [4 Решение проблем](#.D0.A0.D0.B5.D1.88.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D0.B1.D0.BB.D0.B5.D0.BC)
* [4.1 Маршрут по умолчанию](#.D0.9C.D0.B0.D1.80.D1.88.D1.80.D1.83.D1.82_.D0.BF.D0.BE_.D1.83.D0.BC.D0.BE.D0.BB.D1.87.D0.B0.D0.BD.D0.B8.D1.8E)
* [4.2 Маскарадинг работает, но некоторые сайты не открываются](#.D0.9C.D0.B0.D1.81.D0.BA.D0.B0.D1.80.D0.B0.D0.B4.D0.B8.D0.BD.D0.B3_.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D0.B0.D0.B5.D1.82.2C_.D0.BD.D0.BE_.D0.BD.D0.B5.D0.BA.D0.BE.D1.82.D0.BE.D1.80.D1.8B.D0.B5_.D1.81.D0.B0.D0.B9.D1.82.D1.8B_.D0.BD.D0.B5_.D0.BE.D1.82.D0.BA.D1.80.D1.8B.D0.B2.D0.B0.D1.8E.D1.82.D1.81.D1.8F)
* [4.3 Не удается загрузить модуль ядра ppp_generic](#.D0.9D.D0.B5_.D1.83.D0.B4.D0.B0.D0.B5.D1.82.D1.81.D1.8F_.D0.B7.D0.B0.D0.B3.D1.80.D1.83.D0.B7.D0.B8.D1.82.D1.8C_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D1.8F.D0.B4.D1.80.D0.B0_ppp_generic)
## Установка
[Установите](/index.php/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D0%B5 "Установите") пакет [ppp](https://www.archlinux.org/packages/?name=ppp), доступный в [официальных репозиториях](/index.php/Official_repositories_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Official repositories (Русский)").
Убедитесь, что ядро вашей системы скомпилировано с поддержкой PPPoE (верно для стандартной сборки):
`$ zgrep CONFIG_PPPOE /proc/config.gz` `CONFIG_PPPOE=m`
## Настройка
### PPPoE
Создайте файл настроек соединения:
`/etc/ppp/peers/*имя_соединения*`
```
plugin rp-pppoe.so
# rp_pppoe_ac 'имя концентратора доступа'
# rp_pppoe_service 'имя службы PPPoE'
# сетевой интерфейс
eth0
# ваш логин
name "*имя_пользователя*"
usepeerdns
persist
# раскомментируйте, если вам нужен автодозвон "по требованию"
#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-серверы. Если это поведение является нежелательным (например, установлен локальный кэширующий DNS), отредактируйте `/etc/ppp/ip-up.d/00_dns.sh` под ваши нужды.
Добавьте запись с паролем соединения в `/etc/ppp/pap-secrets` или `/etc/ppp/chap-secrets`, в зависимости от типа аутентификации, используемого вашим провайдером. Если вы не уверены, можно добавить запись в оба файла, *pppd* выберет нужный самостоятельно. Запись выглядит следующим образом:
```
*имя_пользователя* * *пароль*
```
Имя пользователя должно совпадать с именем, указанным в опции `name`. Оно также используется для аутентификации, если не переопределено другим значением с помощью опции `user`.
Теперь вы можете попробовать установить соединение командой:
```
# pppd call *имя_соединения*
```
или
```
# pon *имя_соединения*
```
где *имя_соединения* — имя файла настроек, созданного в `/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` используется по умолчанию, если при вызове *pppd* не было указано имя файла. Вместо явного указания имени файла настроек программе *pppd* вы также можете просто добавить символическую ссылку на свой файл:
```
# ln -s /etc/ppp/peers/*имя_соединения* /etc/ppp/peers/provider
```
Теперь можно устанавливать соединение одной командой
```
# pon
```
Чтобы разорвать соединение, выполните
```
# poff *имя_соединения*
```
### Запуск pppd при старте системы
Выполните следующие шаги:
* Настройте модуль `ppp_generic` для загрузки во время запуска. Инструкции можно найти на странице [Модули ядра#Автоматическое управление модулями](/index.php/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D0%B8_%D1%8F%D0%B4%D1%80%D0%B0#.D0.90.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.BE.D0.B5_.D1.83.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F.D0.BC.D0.B8 "Модули ядра").
* [Включите](/index.php/%D0%92%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D0%B5 "Включите") службу systemd:
```
# systemctl enable ppp@*имя_соединения*.service
```
## Дополнительно
### Автодозвон
Если *pppd* запущен, вы можете выполнить сброс соединения, отправив процессу сигнал `SIGHUP`:
```
# export PPPD_PID=$(pidof pppd)
# kill -s HUP $PPPD_PID
```
После разрыва соединение будет вновь установлено.
**Примечание:** Убедитесь, что опция `persist` включена в ваш файл конфигурации `/etc/ppp/peers/provider`. Также вы можете добавить параметр `holdoff 0` для переподключения без тайм-аута.
### Автоматический разрыв соединения
**Примечание:** Если вы не оставляете ваш компьютер работать круглосуточно, то можете смело пропустить этот шаг
Если у вас безлимитное соединение и вы поддерживаете его непрерывно, некоторые провайдеры могут сбрасывать его каждые 24 часа. Это гарантирует, что ваш динамический IP-адрес будет меняться каждые сутки. Чтобы иметь возможность подключиться извне, вы можете использовать какой-нибудь динамический DNS-сервис вместе с [inadyn](https://aur.archlinux.org/packages/inadyn/), тогда по доменному имени всегда можно будет вычислить текущий IP. Но чтобы избежать нежелательных разрывов, вы можете сами (настроив задачу для [cron](/index.php/Cron "Cron") либо создав таймер [systemd](/index.php/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#.D0.A2.D0.B0.D0.B9.D0.BC.D0.B5.D1.80.D1.8B "Systemd (Русский)")) выполнять сброс каждые сутки в такое время, когда никто не пользуется соединением — например, в 4 утра.
#### Используя cron
Выполните следующие шаги от имени суперпользователя.
Создайте файл скрипта (например, `pppd_redial.sh`) со следующим содержимым:
```
#!/bin/bash
message="Restarting the PPP connection @:" $(date)
pppd_id=$(pidof pppd)
kill -s HUP $pppd_id
echo $message
```
Сохраните файл и дайте ему права на выполнение.
Теперь создайте задачу для [cron](/index.php/Cron "Cron"), используя команду `crontab -e`. Если появляется ошибка, убедитесь, что установлена [переменная окружения](/index.php/Environment_variables_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Environment variables (Русский)") `EDITOR`. По команде откроется редактор — добавьте в него строку, указав правильный путь до вашего скрипта перезапуска соединения:
```
0 4 * * * /bin/bash /root/pppd_redial.sh
```
Сохраните файл и убедитесь, что служба `cronie` работает. Если это не так, [включите](/index.php/%D0%92%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D0%B5 "Включите") и [запустите](/index.php/%D0%97%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5 "Запустите") службу `cronie`.
Теперь ваше соединение будет перезапускаться каждый день в 4 утра.
#### Используя таймер systemd
Также вы можете настроить таймер [systemd](/index.php/Systemd_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Systemd (Русский)") для выполнения ежедневного перезапуска соединения. Просто создайте файлы *.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
```
Теперь просто [включите](/index.php/%D0%92%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D0%B5 "Включите") и [запустите](/index.php/%D0%97%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5 "Запустите") таймер, и systemd будет выполнять сброс соединения каждый день в указанное время.
## Решение проблем
### Маршрут по умолчанию
При запуске *pppd* пытается добавить свой системный маршрут по умолчанию (*default route*). Если перед запуском уже был установлен такой маршрут, *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` с таким содержимым:
`/etc/ppp/ip-pre-up/10-route-del-default.sh`
```
#!/bin/sh
/usr/bin/route del default
```
Не забудьте дать скрипту права на запуск.
[Перезапустите](/index.php/%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D1%82%D0%B8%D1%82%D0%B5 "Перезапустите") службу `pppd`.
### Маскарадинг работает, но некоторые сайты не открываются
Проблема выражается в том, что соединение есть, но часть сайтов и сервисов не работают, если вы используете ваш компьютер в роли маршрутизатора для других компьютеров. Дело в том, что размер MTU (*Maximum Transmission Unit* — максимальное количество байт данных в одном пакете) в PPPoE равен 1492 байтам, что меньше, чем используют большинство сайтов (1500). Ваш маршрутизатор отправляет серверу специальный пакет ICMP 3:4 (сообщение о том, что нужно переразбиение данных), запрашивая меньший MTU, но сетевые экраны многих сайтов блокируют это сообщение.
Проблема решается добавлением правила с PMTU clamping в [iptables](/index.php/Iptables "Iptables"):
```
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
```
Однако, по некоторой причине, это правило может не попадать в вывод *iptables-save*. Если у вас тот случай, когда *iptables-restore* не восстанавливает правило после перезапуска, попробуйте следующее решение.
Создайте файл службы [systemd](/index.php/Systemd "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
```
И включите эту службу.
### Не удается загрузить модуль ядра ppp_generic
Проблема выражается в том, что при запуске процесс *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
```
или добавьте ее, если первой строки в файле не было.
После перезагрузки проблема должна решиться.