iptables и PPPoE с динамическим IP

В предыдущей статье рассматривался вариант с подключением по статике. Там всё просто и красиво, но что делать если есть динамический IP да ещё и с туннелем PPPoE?

На самом деле я недавно находился именно в таких условиях.

Чтобы избавиться от жёсткой привязки к IP-адресу внешнего интерфейса, самым простым вариантом будет использование MASQUERADE вместо SNAT:

iptables -t nat -D POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to-source 212.122.1.1
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Данный вариант работает чуточку медленнее, но скорее всего вы не заметите разницу. Тут остаётся только привязка к внешнему интерфейсу, не более.

А вот проблему PPPoE я решал наверняка в два этапа. Для начала настроим связку демона ppp и iptables.

# vi /etc/ppp/pppoe.conf
CLAMPMSS=1452
# iptables -t mangle -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

После этого переподключить соединение PPPoE. Все пакеты c данными свыше 1452 (40 на служебные данные TCP, 8 съедает PPPoE) будут разбиваться силами маршрутизатора. Не очень эффективное решение, но проблему решает.

Вторым этапом было по DHCP раздавать в локальной сети размер пакета. В качестве DHCP-сервера у меня dnsmasq:

# vi /etc/dnsmasq.d/main.conf
dhcp-option=enp2s0,26,1492

В итоге получаем, что для тех кто понимает DHCP нормально, всё будет прекрасно работать сразу с маленьким размером пакета. Для тех, у кого с настройками по DHCP плохо, шлюз будет сам нарезать пакеты ломтиками нужного размера.