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

В интернете куча статей, которые рассказывают как же настроить страшные iptables, что бы раздать интернет по средствам NAT с одного компьютера на другой. У меня появилась такая потребность, в тот момент, когда на основном ПК стояла kubuntu 10.10, на втором WinXP. А по большому счету, все равно какая вторая ОС. Первый раз написав эту стать, меня посетило чувство неудовлетворенности. Настроил NAT, но DNS и IP на машинах клиентах пришлось писать вручную. А это не по «одмински»! И вот я переписал статью.
И так! Нам понадобятся небольшие знания работы с консолью, базовые понятия, что такое iptables.
Все еще интересно? Прошу под спойлер…


1. Для начала, необходимо определить, какой интерфейс у нас смотрит в интернет, а какой в локальную сеть.
У меня следующий конфиг:
eth0 смотрит в локальную сеть;
eth1 смотрит в интернет, получает IP автоматически, а протокол pppoe;

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


sudo nano /etc/network/interfaces

Находим там интерфейс смотрящий в локальную сеть(eth1), и настраиваем его на необходимый IP. Я взял 11.1.1.1,получилось вот так:

auto eth1
iface eth1 inet static
address 11.1.1.1
netmask 255.0.0.0

Я подразумеваю, что интернет у вас уже работает, а значит eth0 уже настроен. Можем теперь поставить на машине-клиента IP 11.1.1.2, маску 255.0.0.0 и перезапустить сетевые интерфейсы на сервере командой:


sudo /etc/init.d/networking restart

После этого пропингуйте клиента. Если пинг идет – локалка работает – идем дальше. Если нет – решайте проблему, к этой статье технические неполадки локальной сети не имеют никакого отношения.3. Теперь следующий этап. Необходимо настроить NAT. Если вы уже настраивали iptables и все это закончилось неудачно – желательно удалить все правила из таблиц с помощью команд:

iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain

Теперь непосредственно настроим iptables:

sudo iptables -A FORWARD -i eth0 -o eth1 -s 11.1.1.0/24 -j ACCEPT
sudo iptables -A POSTROUTING -t nat -j MASQUERADE

Необходимо также включить IP-форвардинг. Сначало вот эту команду:

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

Потом открываем для редактирования файл /etc/sysctl.conf. Добавляем следующие строчки:

net.ipv4.conf.default.forwarding=1
net.ipv4.conf.all.forwarding=1

Вуаля. Шлюз готов к работе! Проведем тест работы NAT. Перезапускаем сетевые интерфейсы командой:

sudo /etc/init.d/networking restart

После этого на той машине, где мы ставили IP и сеть работала, поставим в настройках сетевой карты DNS адреса серверов. Можно провайдера, можно например OpenDNS: 207.68.222.222 и 207.68.220.220. После пытаемся зайти на любой сайт, и желательно не на 1. Если все работает – считай пол работы сделано!
У iptables есть, на мой взгляд, полезная вещь – после перезапуска системы – правила обнуляются. Что бы этого не произошло, нужно сохранить их:

sudo sh -c "iptables-save > /etc/iptables.up.rules"


Осталось дописать команду скрипт загрузки сетевых интерфейсов, которая будет подгружать наши настройки iptables. Выглядит она вот так:
pre-up iptables-restore < /etc/iptables.up.rules

Собственно на этом я прошлый раз и остановился. Но ведь наш сервер – далеко не полноценный роутер. Нужно вручную вписывать IP-шники и DNS. А вдруг DNS поменяется, прийдеть снова настраивать? Поэтому я решил продолжить.

4. Поднимим DNS и DHCP сервер. Есть простой и удобный вариант. Называется пакет dnsmasq. Работает демоном. Устанавливаем:

sudo apt-get install dnsmasq

Теперь нужно отредактировать конфиг. Я предпочитаю бекапить стандартный, и потом создавать новый с нуля. Бекапим конфиг:

sudo cat /etc/dnsmasq.conf /etc/dnsmasq.conf.default

Теперь создаем новый конфиг, открывая его для редактирования:

sudo nano /etc/dnsmasq.conf

Нам нужно будет вписать все 2 строчки, все остальное сервер сделает сам.

Первая строка разрешает серверу принимать DNS запросы из локальной сети, а вторая описывает диапазон выдаваемых адресов, сетевую маску и время жизни IP адреса соотвественно:

listen-address=127.0.0.1, 11.1.1.1
dhcp-range=11.1.1.100,11.1.1.150,255.0.0.0,24h

А вот теперь осталось только перезапустить «сеть» и сам демон:

sudo /etc/init.d/networking restart
sudo /etc/init.d/dnsmasq restart

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

P.S. У меня все работает!

Обновлено: 13.03.2015