понедельник, 10 декабря 2012 г.

PPPoE-сервер на Ubuntu 12.04 LTS

Задача: поднять PPPoE-сервер на базе Ubuntu 12.04 LTS.

Выполнение:
1. Установим пакет pppoe:
sudo apt-get install pppoe
2. Создадим файл параметров pppoe-сервера:
sudo gedit /etc/ppp/pppoe-server-options
Пишем:

# PPP options for the PPPoE server
# LIC: GPL
auth
require-chap
lcp-echo-interval 10
lcp-echo-failure 2
#Указываем DNS-серверы, которые наш pppoe-сервер будет давать клиентам
ms-dns 8.8.8.8
ms-dns 8.8.4.4
noipdefault
noipx
nodefaultroute
noproxyarp
# Указываем маску подсети, которую получат клиенты
netmask 255.255.255.255
#Путь к логу
logfile /var/log/log.pppoe

3. Теперь отредактируем файл учетных записей pppoe-сервера:
sudo gedit /etc/ppp/chap-secrets
Пишем:

# Secrets for authentication using CHAP
# client server secret IP addresses
#Параметры в строке отделяются друг от друга пробелами или табуляцией
"testlogin" * "testpass" 192.168.5.10

4. Пропишем запуск pppoe-сервера в автозагрузку:
sudo gedit /etc/rc.local
Пишем:
#Запускаем pppoe-сервер
sudo pppoe-server -I eth1 -L 192.168.5.1 -R 192.168.5.10

, где
eth1 - сетевой интерфейс, на котором будет запускаться pppoe-сервер. У меня eth1 смотрит в локальную сеть;
192.168.5.1 - ip-адрес pppoe-сервера;
192.168.5.10 - ip-адрес, начиная с которого pppoe-сервер будет выдавать ip-адреса клиентам;

5. Готово. Теперь на каком-нибудь компьютере локальной сети можете создать pppoe-соединение (В Windows это "Высокоскоростное подключение, запрашивающее имя и пароль") и попробовать подключиться к нашему PPPoE-серверу.

6. Теперь предположим, что pppoe-сервер предназначен для предоставления доступа к сети Интернет. То есть клиенты должны получать доступ к Интернету.
sudo gedit /etc/rc.local
добавим
#Разрешаем форвардинг
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
#Выполняем скрипт настройки iptables
sudo sh /home/jc/inet

7. Создадим небольшой скрипт для настройки iptables:
sudo gedit /home/jc/inet
Пишем:

#!/bin/sh
#Переменные
iptables_dir='/sbin/iptables'
inet_iface=eth0
#Собственно настройка iptables
#В POSTROUTING таблицы NAT разрешить маскарадинг на тот сетевой интерфейс, который смотрит в сеть провайдера (Интернет) (inet_iface)
$iptables_dir -t nat -A POSTROUTING -o $inet_iface -j MASQUERADE
# Политика по умолчанию - все разрешено (ACCEPT)
$iptables_dir -P INPUT ACCEPT
$iptables_dir -P FORWARD ACCEPT
$iptables_dir -P OUTPUT ACCEPT

Главное - это разрешить маскарадинг и форвардинг. Текущие настройки iptables можно посмотреть командой
sudo iptables-save


8. Готово. Теперь у клиентов PPPoE-сервера есть доступ к Интернет. Сейчас перепишем скрипт настройки iptables для того, чтобы обеспечить безопасность соединения с Интернетом.
sudo gedit /home/jc/inet

#!/bin/sh
# Переменные:
# Сетевой интерфейс, смотрящий с сеть провайдера (Интернет)
inet_iface=eth0
# Сетевые интерфейсы, смотрящиие в локальную сеть
local_iface=ppp+
# Локальная сеть (подсеть PPPoE-сервера)
local_network=192.168.5.0/24
# Предпочитаемый DNS сервер
dns_main=8.8.8.8
# Альтернативный DNS сервер
dns_alt=8.8.4.4
# Шлюз по умолчанию
gateip=10.0.1.1
iptables_dir='/sbin/iptables'

# ----------Установка политик по умолчанию-------------
# 1. Очищаем все цепочки и устанавливаем политику по умолчанию в соответствии с принципом "Все, что не разрешено - запрещено"
$iptables_dir -F INPUT
$iptables_dir -F FORWARD
$iptables_dir -F OUTPUT
$iptables_dir -t mangle -F
$iptables_dir -t nat -F
$iptables_dir -t filter -F

$iptables_dir -P INPUT DROP
$iptables_dir -P FORWARD DROP
$iptables_dir -P OUTPUT DROP

# 2. В POSTROUTING таблицы NAT разрешить маскарадинг на тот сетевой интерфейс, который смотрит в сеть провайдера (Интернет) (inet_iface)
$iptables_dir -t nat -A POSTROUTING -o $inet_iface -j MASQUERADE

# --------------Настройки безопасности-------------------------------
# 4. (проверено) Скидываем все пакеты, пришедшие с интерфейса, смотрящего в сеть провайдера (Интернет) со статусом NEW
$iptables_dir -A FORWARD -i $inet_iface -m state --state NEW -j DROP

# 4.1  Скидываем все пакеты, пришедшие с интерфейса, смотрящего в сеть провайдера (Интернет), и уходящие туда же
$iptables_dir -A FORWARD -i $inet_iface -o $inet_iface -j DROP

# 4.2 Скидываем все пакеты, пришедшие с интерфейса, смотрящего в сеть провайдера (Интернет) с адресов локальных сетей классов A,B,C,D,E и адресов, не использующихся в Интернете
$iptables_dir -A FORWARD -i $inet_iface -s 172.16.0.0/12 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 192.168.0.0/16 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 10.0.0.0/8 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 224.0.0.0/3 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 127.0.0.0/8 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 0.0.0.0/8 -j DROP

# Активация TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Отключение IP Source Routing
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

# Отключение ICMP Redirect
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# Активация IP Spoofing Protection
echo 1 >  /proc/sys/net/ipv4/conf/all/rp_filter

# Игнорирование Broadcast Request
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#  Отбрасывать все пакеты, которые не могут быть идентифицированы и поэтому не могут иметь определенного статуса.
$iptables_dir -A FORWARD -m state --state INVALID -j DROP

# ------------Безопасное взаимодействие с DNS серверами-----------------------

# Запрещаем клиентам обмен данными с основным DNS сервером не по порту 53

$iptables_dir -A FORWARD -i $local_iface -p UDP -s $local_network --dport 53 -d $dns_main -o $inet_iface -j ACCEPT
$iptables_dir -A FORWARD -i $local_iface -s $local_network -d $dns_main -o $inet_iface -j DROP

# Запрещаем клиентам обмен данными с альтернативным DNS сервером не по порту 53
$iptables_dir -A FORWARD -i $local_iface -p UDP -s $local_network --dport 53 -d $dns_alt -o $inet_iface -j ACCEPT
$iptables_dir -A FORWARD -i $local_iface -s $local_network -d $dns_alt -o $inet_iface -j DROP

# Запрещаем основному DNS серверу обмен данными с клиентами не по порту 53
$iptables_dir -A FORWARD -i $inet_iface -p UDP -s $dns_main --sport 53 -d $local_network -o $local_iface -j ACCEPT
$iptables_dir -A FORWARD -i $inet_iface -s $dns_main -d $local_network -o $local_iface -j DROP

# Запрещаем альтернативному DNS серверу обмен данными с клиентами не по порту 53
$iptables_dir -A FORWARD -i $inet_iface -p UDP -s $dns_alt --sport 53 -d $local_network -o $local_iface -j ACCEPT
$iptables_dir -A FORWARD -i $inet_iface -s $dns_alt -d $local_network -o $local_iface -j DROP

# ----------------------------------------------------------------------------

# 5. Разрешаем транзитные пакеты с адресов локальной сети, пришедшие с локального сетевого интерфейса local_iface, которые идут в сеть провайдера (Интернет) (inet_iface), со статусами NEW, ESTABLISHED и RELATED
$iptables_dir -A FORWARD -i $local_iface -s $local_network -o $inet_iface -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# 6. Разрешаем прохождение пакетов с сетевого интерфейса, смотрящего в сеть провайдера (Интернет) на сетевой(ые) интерфейс(ы) ($inet_iface) локальной сети со статусом ESTABLISHED
$iptables_dir -A FORWARD -i $inet_iface -d $local_network -o $local_iface -m state --state ESTABLISHED -j ACCEPT

9. Теперь предположим, что на одном из клиентов PPPoE-сервера работает Web-сервер и, соответственно, он должен быть доступен из Интернета. Внесем в скрипт соответствующие изменения:
sudo gedit /home/jc/inet
В начале, где объявляются переменные, добавим:
# Адрес Web-сервера в локальной сети
web_ip=192.168.5.10
# Порт Web-сервера  в локальной сети
web_port=80

Далее после установки политик по умолчанию
# ----------Настройки для работоспособности Web-сервера-------------

# 1.1 Разрешаем проходящие входящие пакеты на адрес Web-cервера и его порт
$iptables_dir -I FORWARD -i $inet_iface -d $web_ip -p tcp --dport $web_port -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# 1.2. Перед началом маршрутизации пакетов, идущих к нам на порт Web-сервера меняем адрес получателя на адрес Web-сервера в локальной сети
$iptables_dir -t nat -I PREROUTING -d $inet_ip -p tcp --dport $inet_port -j DNAT --to-destination $web_ip:$web_port

# 1.3. Делаем маскарадинг для пакетов, уходящих на Web-сервер в локальную сеть
$iptables_dir -t nat -I POSTROUTING -d $web_ip -p tcp --dport $web_port -j  MASQUERADE

10. Итак, Web-сервер доступен из Интернет. Допустим, встала следующая задача: ограничить скорость для некоторых (или каждого) клиентов. Приведенное ниже решение может быть корявым, но оно работает и вполне применимо в том случае, если клиентов не очень много. Ограничение скорости будем делать с помощью tc.
sudo gedit /etc/ppp/ip-up
В конец добавим:

# Указываем, где находится tc
traf_control=/sbin/tc
# Поднимаемый сетевой интерфейс
INET_DEV=$1

# Ограничение скорости для Web-сервера. К примеру, имеем канал подключения к Интернету со скоростью 1Мбит/с. Ограничим скорость для Web-сервера до 80Кбайт/c. $5 - ip-адрес поднимаемого сетевого интерфейса.
if [ "$5" = "192.168.5.10" ]; then
# 1. Очищаем все правила tc
$traf_control qdisc del dev $INET_DEV root
# 2. Объявляем главную дисциплину обработки исходяшей очереди для устройства $INET_DEV
$traf_control qdisc add dev $INET_DEV root handle 1: htb default 12
# 3. Объявляем корневой класс главной дисциплины обработки исходящей очереди $INET_DEV
$traf_control class add dev $INET_DEV parent 1: classid 1:1 htb rate 1024kbit ceil 1024kbit
# 4. Объявляем подкласс корневого класса для ограничения скорости
$traf_control class add dev $INET_DEV parent 1:1 classid 1:10 htb rate 80kBps ceil 80kBps
# 5. Объявляем подкласс корневого класса для ограничения скорости пакетов,не попавших под правила
#$traf_control class add dev $INET_DEV parent 1:1 classid 1:12 htb rate 60kBps ceil 60kBps
# Объявляем фильтр для созданного подкласса 1:10
$traf_control filter add dev $INET_DEV protocol ip parent 1: prio 1 u32 match ip dst 192.168.5.10 flowid 1:10
fi

Для того, чтобы ограничить скорость для другого клиента, необходимо добавить приведенный выше блок if ...fi , изменив ip-адрес и, если нужно, скорость. Клиенты, для которых не введены ограничения, могут занимать Интернет-канал полностью.

Если данная инструкция оказалась полезной для вас, напишите, пожалуйста, об этом в комментарии.

8 комментариев:

  1. Спасибо огромное за труд! Четко, лаконично, информативно!

    ОтветитьУдалить
  2. Спасибо! Очень помогло! Сразу видно знающий и умеющий человек !!!

    ОтветитьУдалить
  3. А как сам сервер получает интернет через pppoe?

    ОтветитьУдалить
    Ответы
    1. В настоящей инструкции предполагается,что сам он через pppoe интернет не получает. Он имеет соединение с Интернетом через сетевой интерфейс eth0.

      Удалить
  4. Большое спасибо, очень пригодилось, внедрю в подотчетном мне небольшом деловом центре.

    ОтветитьУдалить
  5. спасибо отличная статья

    ОтветитьУдалить
  6. А если использовать удалённый RADIUS-сервер?

    ОтветитьУдалить