Наиболее частым применением Linux серверов является организация общего доступа в интернет. Это обусловлено низкой стоимостью такого решения и невысокими требованиями к железу. Во многих случаях это бывает первый Linux сервер в организации, что способно вызвать у администраторов определенные сложности.
сначала смотрим — кто мы?
|
1 2 3 4 |
# uname -a Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01-17) x86_64 GNU/Linux # cat /etc/debian_version 8.3 |
На сервере имеются 2 сетевых интерфейса:
| Интерфейс | Описание | IP |
|---|---|---|
| eth0 | внешний интерфейс, подключен к провайдеру, настройки получает по dhcp автоматически | 192.168.1.24 |
| eth1 | внутренний интерфейс, смотрит в локальную сеть, статический ip адрес | 10.0.15.1 |
Файл конфигурации сетевых интерфейсов выглядит следующим образом:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# cat /etc/network/interfaces #команда для # просмотра содержимого файла source /etc/network/interfaces.d/* auto lo iface lo inet loopback allow-hotplug eth0 iface eth0 inet dhcp allow-hotplug eth1 iface eth1 inet static address 10.0.15.1 netmask 255.255.255.0 |
Подготовка шлюза
Выше я привел ссылку на подробную статью с описанием настройки сервера общего назначения. Сейчас мы выполним некоторые подготовительные действия без подробностей и описания. Их вы можете почитать отдельно. Сейчас просто необходимые команды.
Сеть на будущем программном роутере настроили, доступ в интернет на сервере есть. Обновим его:
|
1 2 |
# apt-get update # apt-get upgrade |
Установим MC, мне в нем удобнее всего работать, в том числе в редакторе mcedit:
|
1 |
# apt-get -y install mc |
Настроим часовой пояс, если раньше не сделали это:
|
1 |
# dpkg-reconfigure tzdata |
Устанавливаем сервис ntp для автоматического обновления времени:
|
1 |
# apt-get -y install ntp |
Настройка маршрутизации, firewall и nat
Первым делом включим маршрутизацию пакетов между сетевыми интерфейсами. Для этого редактируем конфиг /etc/sysctl.conf:
|
1 2 3 |
# mcedit /etc/sysctl.conf net.ipv4.ip_forward=1 |
Либо раскомментируйте эту строку, либо добавьте, если ее нет. Но она по-умолчанию быть должна, закомментированная со значением 1. Применяем эту настройку:
|
1 |
# sysctl -p |
На выходе работы команды в консоли будет выведен измененный параметр со значением 1.
Теперь приступаем к самому главному — настройке фаервола iptables и nat в нем для обеспечения выхода в интернет из локальной сети.
Я приведу здесь сразу готовый вариант файла с правилами iptables, необходимых для работы интернет шлюза в debian. В файле даны подробные комментарии ко всем значениям, так что вы без проблем разберетесь и закомментируете или наоборот раскомментируйте необходимые вам значения.
Копируем содержимое файла и создаем скрипт с правилами на сервере:
|
1 |
# mcedit /etc/iptables.sh |
Вставляем в редактор правила. Редактируем их под свои нужды, обязательно заменяя переменные WAN и LAN на свои. Сохраняем файл.)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
#!/bin/bash export IPT="iptables" # Внешний интерфейс export WAN=eth0 export WAN_IP=192.168.1.24 # Локальная сеть export LAN1=eth1 export LAN1_IP_RANGE=10.0.15.0/24 # Очищаем правила $IPT -F $IPT -F -t nat $IPT -F -t mangle $IPT -X $IPT -t nat -X $IPT -t mangle -X # Запрещаем все, что не разрешено $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # Разрешаем localhost и локалку $IPT -A INPUT -i lo -j ACCEPT $IPT -A INPUT -i $LAN1 -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT $IPT -A OUTPUT -o $LAN1 -j ACCEPT # Рзрешаем пинги $IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT $IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT $IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT $IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # Разрешаем все исходящие подключения сервера $IPT -A OUTPUT -o $WAN -j ACCEPT # Разрешаем все входящие подключения сервера #$IPT -A INPUT -i $WAN -j ACCEPT # разрешаем установленные подключения $IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Отбрасываем неопознанные пакеты $IPT -A INPUT -m state --state INVALID -j DROP $IPT -A FORWARD -m state --state INVALID -j DROP # Отбрасываем нулевые пакеты $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # Закрываемся от syn-flood атак $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP $IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP # Блокируем доступ с указанных адресов #$IPT -A INPUT -s 84.122.21.197 -j REJECT # Пробрасываем внешний порт 23543 на локальный адрес и порт 3389 #$IPT -t nat -A PREROUTING -p tcp --dport 23543 -i ${WAN} -j DNAT --to 10.1.3.50:3389 #$IPT -A FORWARD -i $WAN -d 10.1.3.50 -p tcp --dport 3389 -j ACCEPT # Разрешаем доступ из локалки наружу $IPT -A FORWARD -i $LAN1 -o $WAN -j ACCEPT # Закрываем доступ снаружи в локалку $IPT -A FORWARD -i $WAN -o $LAN1 -j REJECT # Включаем NAT $IPT -t nat -A POSTROUTING -o $WAN -s $LAN1_IP_RANGE -j MASQUERADE # открываем доступ к SSH $IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT # Открываем доступ к почтовому серверу #$IPT -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT #$IPT -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT #$IPT -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT #$IPT -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT #$IPT -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT #$IPT -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT #Открываем доступ к web серверу #$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #$IPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT #Открываем доступ к DNS серверу #$IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT # Включаем логирование #$IPT -N block_in #$IPT -N block_out #$IPT -N block_fw #$IPT -A INPUT -j block_in #$IPT -A OUTPUT -j block_out #$IPT -A FORWARD -j block_fw #$IPT -A block_in -j LOG --log-level info --log-prefix "--IN--BLOCK" #$IPT -A block_in -j DROP #$IPT -A block_out -j LOG --log-level info --log-prefix "--OUT--BLOCK" #$IPT -A block_out -j DROP #$IPT -A block_fw -j LOG --log-level info --log-prefix "--FW--BLOCK" #$IPT -A block_fw -j DROP # Сохраняем правила /sbin/iptables-save > /etc/iptables.rules |
Прежде чем двигаться дальше предупреждаю, что все работы по настройке фаервола должны производиться только если у вас есть доступ к консоли сервера, чтобы в случае ошибки и потери удаленного доступа вы смогли откатить изменения. Даже если вы абсолютно уверены в своих знаниях, вас может подвести банальная ошибка или опечатка. Я сам, к сожалению, сталкивался с такими ситуациями, поэтому считаю необходимым предупредить об этом вас.
Делаем файл с правилами исполняемым (обязательно):
|
1 |
# chmod 0740 /etc/iptables.sh |
Теперь применим новые правила и посмотрим на результат:

Все в порядке, правила применились, доступ к серверу я не потерял. Теперь сделаем так, чтобы новые правила применялись после перезагрузки. В последней строчке скрипта есть команда:
|
1 |
/sbin/iptables-save > /etc/iptables.rules |
С ее помощью готовый набор правил iptables выгружаются в файл. Нам нужно сделать так, чтобы эти правила применялись при включении сетевого интерфейса во время загрузки сервера. Для этого открываем файл interfaces на редактирование и добавляем в самый конец строчку:
|
1 2 3 |
# mcedit /etc/network/interfaces post-up iptables-restore < /etc/iptables.rules |
Для проверки перезагружаем шлюз и проверяем, все ли в порядке. По сути основная настройка программного роутера на debian завершена. Осталось сделать небольшое дополнение и настроить dhcp и dns сервер в локальной сети. Я для этих целей использую простой и легкий в настройке dnsmasq.
Установка и настройка dnsmasq в Debian
Dnsmasq — легковесный и быстроконфигурируемый DNS-, DHCP- и TFTP-сервер, предназначенный для обеспечения доменными именами и связанными с ними сервисами небольших сетей. Может обеспечивать именами локальные машины, которые не имеют глобальных DNS-записей. DHCP-сервер интегрирован с DNS-сервером и даёт машинам с IP-адресом доменное имя, сконфигурированное ранее в конфигурационном файле.
Выполним установку dnsmasq на дебиан:
|
1 |
# apt-get install -y dnsmasq |
Сделаем минимальную настройку программы. Нам нужно просто выдавать сетевые настройки пользователям. Для этого приводим конфигурационный файл dnsmasq к следующему виду:
|
1 2 3 4 5 6 |
# mcedit /etc/dnsmasq.conf domain-needed bogus-priv interface=eth1 dhcp-range=eth1,10.0.15.50,10.0.15.150,24h |
В данном случае мы будем выдавать пользователям ip адреса в диапазоне от 10.0.15.50 до 150. Сохраняем конфиг, добавляем программу в автозагрузку и запускаем.
|
1 2 |
# insserv dnsmasq # /etc/init.d/dnsmasq start |
Теперь можно запускать компьютер пользователя локальной сети, получать сетевые настройки по dhcp и проверять работу интернет шлюза.
Посмотреть выданные leases можно в файле /var/lib/misc/dnsmasq.leases. На этом настройка интернет шлюза на debian 8 закончена. Все что нужно для обеспечения доступа в интернет из локальной сети сделано. Получился программный роутер с широкими возможностями по наращиванию функционала