Iptables - pppd
ppp' (Paul's PPP Package) — пакет с открытым исходным кодом, который реализует протокол соединения точка-точка (PPP) для систем Linux и Solaris. Пакет предоставляет демон pppd, который может быть использован вместе с Шаблон:Pkg, Шаблон:Pkg и netctl.
Протоколы 3G, L2TP и PPPoE работают на основе PPP, поэтому они также могут контролироваться ppp.
Установка
Установите пакет Шаблон:Pkg, доступный в официальных репозиториях.
Убедитесь, что ядро вашей системы скомпилировано с поддержкой PPPoE (верно для стандартной сборки):
Настройка
PPPoE
Создайте файл настроек соединения:
Если задана опция Шаблон:Ic, при соединении pppd создаст файл Шаблон:Ic с полученными адресами DNS-серверов. По умолчанию скрипт Шаблон:Ic перемещает этот файл в Шаблон:Ic, чтобы система могла использовать эти DNS-серверы. Если это поведение является нежелательным (например, установлен локальный кэширующий DNS), отредактируйте Шаблон:Ic под ваши нужды.
Добавьте запись с паролем соединения в Шаблон:Ic или Шаблон:Ic, в зависимости от типа аутентификации, используемого вашим провайдером. Если вы не уверены, можно добавить запись в оба файла, pppd выберет нужный самостоятельно. Запись выглядит следующим образом:
имя_пользователя * пароль
Имя пользователя должно совпадать с именем, указанным в опции Шаблон:Ic. Оно также используется для аутентификации, если не переопределено другим значением с помощью опции Шаблон:Ic.
Теперь вы можете попробовать установить соединение командой:
# pppd call имя_соединения
или
# pon имя_соединения
где имя_соединения — имя файла настроек, созданного в Шаблон:Ic.
Чтобы убедиться, что соединение 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
Файл настроек Шаблон:Ic используется по умолчанию, если при вызове pppd не было указано имя файла. Вместо явного указания имени файла настроек программе pppd вы также можете просто добавить символическую ссылку на свой файл:
# ln -s /etc/ppp/peers/имя_соединения /etc/ppp/peers/provider
Теперь можно устанавливать соединение одной командой
# pon
Чтобы разорвать соединение, выполните
# poff имя_соединения
Запуск pppd при старте системы
Выполните следующие шаги:
- Настройте модуль Шаблон:Ic для загрузки во время запуска. Инструкции можно найти на странице Модули ядра#Автоматическое управление модулями.
- Включите службу systemd:
# systemctl enable ppp@имя_соединения.service
Дополнительно
Автодозвон
Если pppd запущен, вы можете выполнить сброс соединения, отправив процессу сигнал Шаблон:Ic:
# export PPPD_PID=$(pidof pppd) # kill -s HUP $PPPD_PID
После разрыва соединение будет вновь установлено.
Автоматический разрыв соединения
Если у вас безлимитное соединение и вы поддерживаете его непрерывно, некоторые провайдеры могут сбрасывать его каждые 24 часа. Это гарантирует, что ваш динамический IP-адрес будет меняться каждые сутки. Чтобы иметь возможность подключиться извне, вы можете использовать какой-нибудь динамический DNS-сервис вместе с Шаблон:AURШаблон:Broken package link (Русский), тогда по доменному имени всегда можно будет вычислить текущий IP. Но чтобы избежать нежелательных разрывов, вы можете сами (настроив задачу для cron либо создав таймер systemd) выполнять сброс каждые сутки в такое время, когда никто не пользуется соединением — например, в 4 утра.
Используя cron
Выполните следующие шаги от имени суперпользователя.
Создайте файл скрипта (например, Шаблон:Ic) со следующим содержимым:
#!/bin/bash message="Restarting the PPP connection @:" $(date) pppd_id=$(pidof pppd) kill -s HUP $pppd_id echo $message
Сохраните файл и дайте ему права на выполнение.
Теперь создайте задачу для cron, используя команду Шаблон:Ic. Если появляется ошибка, убедитесь, что установлена переменная окружения Шаблон:Ic. По команде откроется редактор — добавьте в него строку, указав правильный путь до вашего скрипта перезапуска соединения:
0 4 * * * /bin/bash /root/pppd_redial.sh
Сохраните файл и убедитесь, что служба Шаблон:Ic работает. Если это не так, включите и запустите службу Шаблон:Ic.
Теперь ваше соединение будет перезапускаться каждый день в 4 утра.
Используя таймер systemd
Также вы можете настроить таймер systemd для выполнения ежедневного перезапуска соединения. Просто создайте файлы .service и .timer с одинаковыми именами:
Теперь просто включите и запустите таймер, и systemd будет выполнять сброс соединения каждый день в указанное время.
Решение проблем
Маршрут по умолчанию
При запуске pppd пытается добавить свой системный маршрут по умолчанию (default route). Если перед запуском уже был установлен такой маршрут, pppd не станет его обновлять, и новые соединения во внешнюю сеть направляться не будут. При этом в Шаблон:Ic вы увидите что-то наподобие:
pppd[nnnn]: not replacing existing default route via xxx.xxx.xxx.xxx
Если это поведение нежелательно, и Шаблон:Ic — совсем не то, что вам нужно, вы можете создать простой скрипт в Шаблон:Ic с таким содержимым:
Не забудьте дать скрипту права на запуск.
Перезапустите службу Шаблон:Ic.
Маскарадинг работает, но некоторые сайты не открываются
Проблема выражается в том, что соединение есть, но часть сайтов и сервисов не работают, если вы используете ваш компьютер в роли маршрутизатора для других компьютеров. Дело в том, что размер MTU (Maximum Transmission Unit — максимальное количество байт данных в одном пакете) в PPPoE равен 1492 байтам, что меньше, чем используют большинство сайтов (1500). Ваш маршрутизатор отправляет серверу специальный пакет ICMP 3:4 (сообщение о том, что нужно переразбиение данных), запрашивая меньший MTU, но сетевые экраны многих сайтов блокируют это сообщение.
Проблема решается добавлением правила с PMTU clamping в iptables:
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Однако, по некоторой причине, это правило может не попадать в вывод iptables-save. Если у вас тот случай, когда iptables-restore не восстанавливает правило после перезапуска, попробуйте следующее решение.
Создайте файл службы systemd:
И включите эту службу.
Не удается загрузить модуль ядра ppp_generic
Проблема выражается в том, что при запуске процесс pppd не может найти соответствующий модуль:
Couldn't open the /dev/ppp device: No such device or address Please load the ppp_generic kernel module.
Решается исправлением Шаблон:Ic: замените в файле строку
alias char-major-108 ppp
на
alias char-major-108 ppp_generic
или добавьте ее, если первой строки в файле не было.
После перезагрузки проблема должна решиться.