Как сделать шлюз на linux

Обновлено: 08.07.2024

Наиболее частым применением Linux серверов является организация общего доступа в интернет. Это обусловлено низкой стоимостью такого решения и невысокими требованиями к железу. Во многих случаях это бывает первый Linux сервер в организации, что способно вызвать у администраторов определенные сложности. В данной статье мы пошагово рассмотрим настройку роутера (NAT + DHCP + Squid) на базе Ubuntu Server 9.04

Внимание! Данный материал устарел, при настройке роутера на базе Ubuntu Server 12.04 и старше рекомендуем воспользоваться обновленной статьей.

Установка и первоначальная настройка

Ubuntu Server отличается от своей настольной версии отсутствием графической оболочки и пользовательских приложений, а также возможностью предустановки заранее выбранных ролей сервера. Несмотря на это, все сказанное будет справедливо для любой версии Ubuntu и, с некоторыми поправками, для любого Linux дистрибутива. Установка Ubuntu Server происходит в текстовом режиме на русском языке и, как правило, не вызывает сложностей. Отдельно стоит только остановится на списке ролей: из предложенного нас, пожалуй, может заинтересовать только OpenSSH, для удаленного доступа, однако воспользовавшись пунктом Manual package selection опытный пользователь может сразу установить необходимые ему пакеты.

NAT-DHCP-Squid-001.jpg

Если же это ваш первый сервер, то лучше всего продолжить не выбирая никакого варианта, все необходимые пакеты мы установим позже. Это позволит иметь более четкое представлении о назначении того или иного пакета и позволит успешно справляться с возможными неполадками. По окончании установки система перезагрузится и встретит нас черным экраном командной строки. Непривычного к консоли Windows-администратора это может неприятно удивить, однако ситуация на сегодняшний день такова, что все серверные роли Linux настраиваются исключительно через консоль и файлы конфигурации.

NAT-DHCP-Squid-002.jpg

В первую очередь настроим сетевые соединения. Вводим в консоли:

Эта команда откроет в консольном редакторе nano конфигурационный файл с сетевыми интерфейсами, аналогичный рисунку ниже.

NAT-DHCP-Squid-003.jpg

Пока там прописан единственный интерфейс eth0, настроенный на работу по DHCP. К eth0 у нас подключен ADSL модем (или любая сеть провайдера), а eth1 смотрит во внутреннюю сеть. IP адрес на внешнем интерфейсе 192.168.1.2, шлюз (ADSL модем) 192.168.1.1, внутренняя сеть лежит в диапазоне 10.0.0.1 - 254. Тогда настройки будут выглядеть следующим образом:

Сохраняем изменения Ctrl+O и выходим Ctrl+X. Теперь нужно настроить DNS, для этого выполняем:

В этом файле необходимо указать адреса DNS серверов, лучше всего указать DNS провайдера или, как в нашем случае, OpenDNS.

Сохраняем. Теперь нужно перезапустить сетевые службы (либо перезагрузиться):

Собственно сеть настроена, можно переходить к следующему этапу, однако мы рекомендуем установить еще несколько пакетов для удобства администрирования. Сначала обновим список доступных пакетов:

Также рекомендуем обновить версии пакетов до актуальных:

Теперь установим Midnight Commander (mc), файловый менеджер по образу и подобию Norton Commander или Far:

Для запуска Midnight Commander достаточно набрать в консоли его краткое имя: mc. Сразу рекомендуем включить встроенный редактор, более удобный чем nano: F9 - Настройки - Конфигурация - Встроенный редактор.

NAT-DHCP-Squid-004.jpg

Для удаленного управления сервером (не бегать же к нему каждый раз) установим OpenSSH, что позволит подключаться к нему из любого места, даже из дома, по защищенному протоколу:

Для подключения с Windows станций можно использовать программу PuTTY (скачать), для корректного отображения символов перед подключением необходимо на закладке Window - Translation выбрать кодировку UTF8.

NAT-DHCP-Squid-005.PNG

Для ограничения доступа к серверу можно дописать в файл /etc/ssh/sshd_config параметр AllowUsers с указанием пользователя имеющего доступ по SSH, например для пользователя admin:

Также можно разрешить доступ определенной группе пользователей используя параметр AllowGroups, либо запретить доступ определенным пользователям / группам использовав DenyUsers и DenyGroups.

Настраиваем NAT

Для организации общего доступа к интернет необходимо настроить трансляцию сетевых адресов (NAT), что позволит сетевым службам внутренней сети получать доступ к внешней сети. Для этого достаточно выполнить всего одну команду, но есть одна тонкость: все будет работать только для перезагрузки. На настоящий момент в Linux нет механизма, который бы сохранял настойки iptables при перезагрузке сервера или сети. Поэтому мы пойдем другим путем и вынесем эти настройки в отдельный скрипт, запускаемый при загрузке системы. Сначала создадим файл скрипта:

Потом откроем его в редакторе Midnight Commander (F4) и внесем следующий текст:

Сохраняем (F2), для автоматического запуска скрипта снова открываем /etc/network/interfaces и в самый конец файла дописываем:

Также не забываем дать нашему скрипту права на исполнение:

Если нигде не допущено ошибок все должно работать. Для проверки укажем на машинах внутренней сети в качестве шлюза и DNS адрес нашего роутера: 10.0.0.1 и пропингуем любой внешний адрес, например один из OpenDNS серверов: 208.67.222.222. Но интернет пока работать не будет. Почему? Да потому, что мы указали в качестве DNS сервера наш роутер, который пока таковым не является. Можно конечно явно прописать DNS на клиентской машине,однако, это не наш метод, если вдруг DNS сервера изменятся, нам что, бегать перепрописывать?

После установки открываем /etc/dnsmasq.conf, находим, раскомментируем и изменяем следующим образом строку, чтобы разрешить серверу принимать DNS запросы из внутренней сети.:

Перезапускаем DNS сервер:

После чего на клиентских машинах должен заработать интернет.

Настраиваем DHCP

Теперь, когда наш сервер работает, нужно настроить клиентские машины. Можно, конечно, прописать все параметры вручную, но как быть если клиентских машин много и расположены они по всему зданию? Здесь нам на выручку приходит протокол DHCP, который позволяет клиентским машинам получать сетевые настройки автоматически. В качестве DHCP сервера выступит уже установленный Dnsmasq. Настроить его не просто, а очень просто, для чего снова открываем /etc/dnsmasq.conf.

Все что нам надо, это задать диапазон выдаваемых адресов (в нашем случае 10.0.0.100-150), сетевую маску и время, на которое выдается IP адрес:

Адреса DNS сервера и шлюза сервер берет автоматически из системных настроек. Еще раз перезапускаем Dnsmasq:

Теперь можно выставить на клиенте автоматическое получение IP адреса и убедиться, что все работает нормально.

NAT-DHCP-Squid-007.jpg

Просмотреть выданные адреса можно командой:

В выдаче будут перечислены выданные IP адреса и MAC адреса которым они выданы.

Настраиваем кеширующий прокси-сервер Squid

В любой большой сети определенная часть трафика повторяется от пользователя к пользователю и порой его доля доходит до 50%. Логично бы было кешировать наиболее повторяющиеся запросы и тем самым снизить нагрузку на канал, сэкономить входящий трафик и ускорить выдачу страниц конечному пользователю. Для этих задач мы используем Squid - кеширующий прокси с широчайшими возможностями.

Останавливаем прокси-сервер и приступаем к настройке:

Открываем /etc/squid/squid.conf, находим и корректируем следующие строки, не забыв их раскомменитровать:

Указываем порт и адрес на котором squid будет принимать соединения:

Указываем внутренние сети, лишние комментируем:

Разрешаем доступ из внутренних сетей (найти и раскомменитровать):

Устанавливаем лимит использования памяти:

Задаем язык вывода ошибок для пользователя

Важное замечание! В Ubuntu 9.10 эта строка может выглядеть так, рекомендуем проверить правильность пути: error_directory /usr/share/squid/errors/ru

Сохраняем файл конфигурации. Теперь строим кэш и запускаем:

Предположим у нас есть 2 компьютера/ноутбука (не важно), на одном из которых две сетевые карты. Мы хотим обеспечить интернетом 2 этих компьютера без использования коммутатора/маршрутизатора.
Пусть первый компьютер имеет две сетевые карты и на нем установлен linux. На втором компьютере установлен windows. Имеется выход в интернет.
В качестве шлюза у нас будет выступать компьютер с linux на борту, от него будет принимать интернет, компьютер с windows на борту.
Схемка примерно такая:



Пусть у нас провайдер раздает ip-шники по DHCP. Тогда нам не надо париться со статическим ip-адресом для linux'а.

Вторая сетевая карта (eth1) будет связывать linux и windows.
Так как, DHCP сервер мы не настраивали, то ip-шник сделаем статическим.
В файл /etc/network/interfaces допишем настройки для eth1:

iface eth1 inet static
address 192.168.1.2
netmask 255.255.255.0

Так, как мы отредактировали системный файл, мы должны перезагрузить демон сети:
$ sudo /etc/init.d/networking restart

Сохраняем это все дело.
Пробуем пинговать с windows наш linux, в командной строке пишем:
ping 192.168.1.2
Если пинг идет, значит коннект есть, но это не значит, что интернет уже доступен на windows, нужно еще настроить правила маршрутизации и DNS-сервер.

Маршрутизацию пакетов мы разрешили, теперь нужно настроить правила, по которым пакеты будут отправляться от linux к windows.
Откроем файл /etc/rc.local и допишем перед! exit 0 такие строки:

iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Теперь установим пакет dnsmasq, он необходим для перенаправления DNS запросов, вышестоящим серверам:

$ sudo apt-get install dnsmasq

Попробуем проверить, работает ли DNS на windows.
В windows, в консоли, пишем:

Опишу как при помощи linux сделать простой шлюз.
Суть задачи следующая: имеется компьютер с linux на борту, в компьютер установлены две сетевые карты. Одна карта подключена к интернет, а вторая к локальной сети. Надо сделать так, чтобы все компьютеры из локальной сети могли выходить в интернет.

Интерфейс eth0 подключен к интернету, интерфейс eth1 подключен к локальной сети 192.168.1.0/24.

Включаем роутинг, для этого редактируем /etc/sysctrl.conf, добавляем строку net.ipv4.ip_forward = 1 затем выполняем:

Проверяем что роутинг разрешен:

Добавляем правило для iptables:

Теперь все пакеты из сети 192.168.1.0/24 будут перенаправляться на eth0

Запись опубликована в рубрике Использование linux с метками linux, network. Добавьте в закладки постоянную ссылку.

Тема ( Как поднять шлюз для локальной сети ) данной заметки в последствии ляжет в серию заметок по практическому развертыванию PXE сервера в локальной сети, данный сервер будет служить удаленным развертыванием операционных систем на рабочих местах. В роли таких систем будут иметь место рассмотрены на моем блоге: Windows, Ubuntu. Согласитесь не хочется же каждый раз проделывать такие шаги (на месте), как:

Прогресс и облегчение действий уже работает и каждый системный администратор сможет оценить данную прелесть.

это в моем случае станция (а именно Ubuntu 12.04.4 Server amd64) выступающая в роли сопряжения двух сетей, одна сеть в которой работают локальные пользователи (малое предприятие) и сеть с выходом в интернет. Вот эта станция и ведет маршрутизацию трафика изнутри сети наружу. Также на данной станции можно разворачивать различные сервисы, такие как прокси сервер, учет за использование интернета, логирование подключений во вне, предоставление различных сервисов снаружи так и многих других.

Станция с установленной операционной системой:

Ubuntu 12.04.4 Server amd64

Станция оснащена двумя сетевыми картами:

eth0 – смотрит интернет (может получать IP адрес динамически, может иметь статический, я опишу оба варианта)

eth1 – смотрит в локальную сеть (подключение к локальной сети, будет иметь статический IP 192.168.10.1 и маску 255.255.255.0

Также, для тестирования нам понадобится клиентская машина, которая будет находиться в локальной сети (операционная система значения не имеет).

Eth0 – от интернет центра (или провайдера интернет)получил по dhcp адрес 192.168.1.51

Далее редактируем сетевые настройки сетевых интерфейсов :

ekzorchik@srv-serv:~$ sudo nano /etc/network/interfaces

настраиваем eth0 (по которому осуществляется подключение к интернет)

iface eth0 inet dhcp

если IP адрес от провайдера статический, то настройки в файл вносятся так:

iface eth0 inet static

настраиваем eth1 ( по которому идет подключение из локальной сети)

iface eth1 inet static

Сохраняем внесенные изменения и перезапускаем демон сети :

ekzorchik@srv-serv:~$ sudo /etc/init.d/networking restart

Проверим работу сетевого интерфейса (это eth1) с назначенным для него статическим адресом, для этого понадобиться машина (в моем случаем это рабочая станция с осью Windows 7) на которой произведем следующие изменения в настройках сетевой карточки (потому как, у меня пока отсутствует служба автоматического присваивания адресов в сети, т. е. DHCP) , а именно из пула маски /24 пропишем произвольный адрес, к примеру: 10.9.9.5 и маску подсети 255.255.255.0 и шлюз 10.9.9.1

Прописываем сетевой адрес на рабочей станции Windows 7

, после чего нужно попробовать вызвав окно командной строки и послать ICMP запрос ( с помощью утилиты ping) на адрес шлюза 10.9.9.1 – запросы должны проходить успешно:

C:\Users\ekzorchik>ping 10.9.9.1

ICMP ответ на нашего шлюза идет, сеть работает.

Отлично, теперь снова займемся настройкой шлюза , а именно произведем его дополнение установив пакет dnsmasq, он необходим для перенаправления DNS запросов, вышестоящим серверам:

ekzorchik@srv-serv:~$ sudo apt-get install dnsmasq -y

теперь снова переходим к нашей клиентской машине и выполняем на ней запрос вида:

так произошло, потому как на шлюзе передача пакетов с одного интерфейса на другой не настроена, разрешим перенаправление пакетов : (сняв комментарий со строки)

ekzorchik@srv-serv:~$ sudo nano /etc/sysctl.conf

Сохраненяем внесенные изменения и перечитываем настройки :

ekzorchik@srv-serv:~$ sudo sysctl -p

, по поводу что обозначает параметр советую обратиться к справочной системе ( man sysctl), там довольно таки понятно изъяснено.

Также необходимы правила для маршрутизации пакетов :

ekzorchik@srv-serv:~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

ekzorchik@srv-serv:~$ sudo iptables -A FORWARD -i eth1 -o eth0 -j REJECT

ekzorchik@srv-serv:~$ sudo iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS —clamp-mss-to-pmtu

Сохраняем правила в файл, чтобы потом при перезагрузке сети их подгружать:

ekzorchik@srv-serv:~$ sudo bash -c "iptables-save > /etc/ip"

ekzorchik@srv-serv:~$ sudo chmod +x /etc/ip

Вносим изменения в настройки сетевого интерфейса :

ekzorchik@srv-serv:~$ sudo nano /etc/network/interfaces

iface eth0 inet dhcp

pre-up iptables-restore /etc/ip

Сохраняем внесенные изменения в настройки сетевого интерфейса и перезапускаем службу сети :

ekzorchik@srv-serv:~$ sudo /etc/init.d/networking restart

ekzorchik@srv-serv:~$ sudo reboot

Перейдя к клиентской системе и в настройках сетевого интерфейса прописав адрес DNS сервера

Прописываем DNS сервер

Не заслуживающий доверия ответ:

При открытии сайта в браузере он открывается

Работает, на основе этой заметки можно поднять и куда более сложные и интересные в реализации вещи, где в качестве шлюза будет использоваться система Ubuntu 12.04.4 Server amd64.

Но заметка еще не завершена, далее я покажу, как сделать, чтобы адреса в локальной сети назначались не вручную, а автоматически (т. е. Поднимем службу DHCP, некоторые нюансы взяты из моей заметки ориентированной на Ubuntu 10.10) : — для этого также потребуется пакет dnsmasq:

Перед редактированием dnsmasq.conf советую сделать его резервную копию:

ekzorchik@srv-serv:~$ sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.original

Переходим к редактированию: (очищаем сперва его содержимое)

ekzorchik@srv-serv:~$ sudo bash -c "cat > /etc/dnsmasq.conf"

по сочетание клавиш Ctrl + C прерываем действие команды

Приводим конфигурационный файл к виду:

ekzorchik@srv-serv:~$ sudo nano /etc/dnsmasq.conf

Сохраняем внесенные изменения и проверяем, что конфигурационный файл по синтаксису корректен :

ekzorchik@srv-serv:~$ /usr/sbin/dnsmasq --test

dnsmasq: syntax check OK.

Перезагружаем службу dnsmasq:

ekzorchik@srv-serv:~$ sudo /etc/init.d/dnsmasq restart

* Restarting DNS forwarder and DHCP server dnsmasq

На клиентской системе изменяем настройки сетевого адаптера выставив со статического значения на динамическое:

Переводим получение сетевых настроек на рабочей станции в автоматический режим

Открываем командную строку и смотрим, какой IP адрес присвоился системе от DHCP сервера:

C:\Users\ekzorchik>ipconfig

, как видно из скриншота ниже адрес имеет значение: 10.9.9.8

Сетевые настройки от шлюза автоматически выдаются

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

Если нужно для определенной машины использовать только статический IP адрес, то не нужно указывать в ручную его, достаточно воспользоваться таким параметром, как резервирование нужного IP адреса и MAC— адреса сетевой карточки: (пример)

узнаем со шлюза mac адрес у ip адреса станции:

ekzorchik@srv-serv:~$ ping 10.9.9.8 -c 1 && arp -a | grep 10.9.9.8

PING 10.9.9.8 (10.9.9.8) 56(84) bytes of data.

64 bytes from 10.9.9.8: icmp_req=1 ttl=128 time=0.493 ms

— 10.9.9.8 ping statistics —

1 packets transmitted, 1 received, 0% packet loss, time 0ms

rtt min/avg/max/mdev = 0.493/0.493/0.493/0.000 ms

pc.polygon.local (10.9.9.8) at 08:00:27:a4:94:1d [ether] on eth1

и в файл dnsmasq.conf вносим параметр – dhcp-host :

ekzorchik@srv-serv:~$ sudo nano /etc/dnsmasq.conf

dhcp-host= 08:00:27:a4:94:1d , 10.9.9.9

Проверяем конфиг на ошибки:

ekzorchik@srv-serv:~$ /usr/sbin/dnsmasq --test

dnsmasq: syntax check OK.

Перезапускаем службу для принятия настроек:

ekzorchik@srv-serv:~$ sudo service dnsmasq restart

смотрим на клиенткой системе ip адрес — он должен быть 10.9.9.9 – все так и есть.

Обновляем настройки сетевой карточки:

C:\Users\ekzorchik>ipconfig /renew

См. какой сетевой адрес присвоился:

C:\Users\ekzorchik>ipconfig | findstr /i "IPv4-*"

Работает. Вот собственно и все минимальные действия чтобы поднять шлюз для малого предприятия на системе Ubuntu 12.04.4, ну а дальше советую смотреть мои заметки на моем блоге если нужны дополнительные усовершенствования или адаптация под конкретную задачу. С уважением автор блога – ekzorchik.

One comment

Здравствуйте, очень полезна ваша статья….проделал как по инструкции на виртуальной машине, все работает.
Вот только есть одна проблема sams не считает трафик и вообще такое ощущение что его нет в на сервере, так как он не блокирует и воооще ничего не делает.
Подскажите как с помощью вашего руководства поднятия шлюза можно еще и заставить работать sams!?

Comments are closed.

Используйте прокси ((заблокировано роскомнадзором, используйте vpn или proxy)) при использовании Telegram клиента:

Поблагодари автора и новые статьи

будут появляться чаще :)

Карта МКБ: 4432-7300-2472-8059

Большое спасибо тем кто благодарит автора за практические заметки небольшими пожертвованиями. С уважением, Олло Александр aka ekzorchik.

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

Для работы нам понадобится
1) Система с двумя сетевыми картами-которая будет выполнять функцию шлюза.
2) Клиентский ПК, с которого мы будем тестировать работу шлюза.


Схема работы:

Предполагается, что операционная система у вас установлена, на сервере который имеет 2 сетевых интерфейса.
eth0 — подключение к интернет. (может получать IP адрес динамически, может иметь статический, я опишу оба варианта)
eth1 — подключение к локальной сети, будет иметь статический IP 192.168.10.1 и маску 255.255.255.0
Также, для тестирования нам понадобится клиентская машина, которая будет находиться в локальной сети (операционная система значения не имеет).

Первым делом, настраиваем сетевые интерфейсы сервера:
Поднимаем права до root

Вводим пароль.
Редактируем настройки сетевых интерфейсов:


Навастриваем eth0 (по которому осуществляется подключение к интернет)
Вариант №1- Получение IP по DHCP от провайдера:


Вариант №2-Статический IP


Где:
Вместо XXX.XXX.XXX.XXX вписываем IP адрес, который мы получили от провайдера
Вместо 255.YYY.YYY.YYY -выписываем маску подсети.
Ну и вместо ZZZ.ZZZ.ZZZ.ZZZ вписываем IP адрес DNS сервера.
Настраиваем eth1 (по которому подключается локальная сеть)


В результате действий у на должен получиться файл interfaces, примерно, следующего содержания:


Сохраняем изменения, выходим.
Перезапустим сеть:


Из написанного, думаю понятно, что в локальной сети адрес шлюза и dns сервера, будет 192.168.10.1.

Переходим на к нашему тестовому клиенту, т.к. у нас в сети нет DHCP сервера, то IP адрес мы будем назначать в ручную.
Присваиваем клиенту:
IP 192.168.10.2
маску подсети 255.255.255.0
шлюз 192.168.10.1
DNS 192.168.10.1

пробуем с клиента принговать 192.168.10.1 — запросы должны бегать нормально.

Переходим на наш шлюз.
Установим пакет dnsmasq, он необходим для перенаправления DNS запросов, вышестоящим серверам.


Возвращаемся к клиенту, выполняем на нем

В ответ подучаем:

необходимо найти строку и снять с нее комментарий:

Сохраняем изменения и выходим

Теперь, нам необходимо добавить правила для маршрутизации пакетов:

Добавим перед строкой exit 0


Значение можно разобрать самостоятельно (будет в качестве домашнего задания), на форуме ubuntu был отличный FAQ по настройке iptables.
Сохраняем изменения, и перезагружаем сервер

Вот так, настраивается шлюз для локальной сети. Это, одно из самых простых решений.

Читайте также: