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

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

1. Для начала, необходимо определить, какой интерфейс у нас смотрит в интернет, а какой в локальную сеть.
У меня следующий конфиг:
eth0 смотрит в локальную сеть;
eth1 смотрит в интернет, получает IP автоматически, протокол PPPoE;
Следующие настройки будут проходим в соответствии с моей конфигурацией. Я думаю не нужно иметь много мозгов, что бы сменить названия интерфейсов на ваши.
2. Теперь мы определили интерфейсы, необходимо их сконфигурировать. Открываем конфиг следующей командой:
sudo nano /etc/network/interfaces

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

auto eth0
iface eth0 inet static
address 11.1.1.1
netmask 255.0.0.0

Я подразумеваю, что интернет у вас уже работает, а значит, интерфейс eth1 уже настроен. Можем теперь поставить на машине-клиенте 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. После пытаемся зайти на любой сайт, и желательно не на один. Если все работает — считай пол работы сделано. У 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. У меня все работает!

Комментарии 9

  • Здравствуйте!
    Хочу уточнить о вашей статье. Вы написали
    —————————————————————————————————————————————
    TEXT_№1
    1. Для начала, необходимо определить, какой интерфейс у нас смотрит в интернет, а какой в локальную сеть.
    У меня следующий конфиг:
    eth0 смотрит в локальную сеть;
    eth1 смотрит в интернет, получает IP автоматически, а протокол pppoe;
    —————————————————————————————————————————————

    Но затем пишите
    —————————————————————————————————————————————
    TEXT_№2
    Находим там интерфейс смотрящий в локальную сеть(eth1 (ОБРАТИТЕ ВНИМАНИЕ)), и настраиваем его на необходимый IP. Я взял 11.1.1.1,получилось вот так:
    —————————————————————————————————————————————
    Может вы имели ввиду в TEXT_№2 «Находим интерфейс смотрящий в локальную сеть(eth0!!!!!!!!!!!)»?

    • Действительно, нахимичил когда статью переносил со старого блога. Исправил. Спасибо, что заметил.

  • А может всетаки не :
    sudo iptables -A FORWARD -i eth1 -o eth0 -s 11.1.1.0/24 -j ACCEPT
    а
    sudo iptables -A FORWARD -i eth0 -o eth1 -s 11.1.1.0/24 -j ACCEPT

  • Подскажите по такой ситуации пожалуйста. NAT настроил все работает. Мне надо чтоб по запросу ftp://mysite.com происходил форвард на машину внутри сети, в то время как FTP запросы не адресованные моему сайту уходили по назначению. Надеюсь понятно написал.

    • А в сети есть свой DNS сервер? Создайте в нем необходимую запись. Или вам нужно именно через NAT?

      • Здравствуйте, есть Proxmox v. 3.1-24
        на нем запущено 5 виртуалок с ID 100…104
        с выделенными IP адресами 10.0.0.1…0.5
        есть сервер приложений (appserv) на 100 машине с внешним IP 37.44.ххх.ххх и внутренним 192.168.4.42
        есть сервер базы (dbserv) данных с внешним IP 37.44.ххх.ххх и внутренним 170.10.16.77 (БД переносили на другой сервер)
        они в одном домене dom
        в общем нужна связь appserv с dbserv
        из консоли сервера приложений внешний ip адрес сервера БД пингуется который начинается на 37…., а внутренний адрес который 170.10.16.77 не пингуется, но appser обращается к базе данных dbserv по внутреннему адресу 170.10.16.77
        Из за этого не работает веб интерфейс нужного приложения с ошибкой 503
        Подскажите как наладить связь между ними, куда смотреть, где копать?
        На всех виртуалках стоит CentOs-6-x86_x64

  • Здравствуйте, есть Proxmox v. 3.1-24
    на нем запущено 5 виртуалок с ID 100…104
    с выделенными IP адресами 10.0.0.1…0.5
    есть сервер приложений (appserv) на 100 машине с внешним IP 37.44.ххх.ххх и внутренним 192.168.4.42
    есть сервер базы (dbserv) данных с внешним IP 37.44.ххх.ххх и внутренним 170.10.16.77 (БД переносили на другой сервер)
    они в одном домене dom

    в общем нужна связь appserv с dbserv

    из консоли сервера приложений внешний ip адрес сервера БД пингуется который начинается на 37…., а внутренний адрес который 170.10.16.77 не пингуется, но appser обращается к базе данных dbserv по внутреннему адресу 170.10.16.77
    Из за этого не работает веб интерфейс нужного приложения с ошибкой 503
    Подскажите как наладить связь между ними, куда смотреть, где копать?
    На всех виртуалках стоит CentOs-6-x86_x64

    • Ох, тут на сложном что-то :). Боюсь я не настолько специалист чтобы вот так схожу сказать. Спросите на профильном форуме или лучше на редите.

      А еще зацените мой блог на английском, в шапке сайта ссылка.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *