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

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

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

 

2. Теперь мы определили интерфейсы, необходимо их сконфигурировать. Открываем конфиг следующей командой:

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

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

После этого пропингуйте клиента. Если пинг идет — локалка работает — идем дальше. Если нет — решайте проблему, к этой статье технические неполадки локальной сети не имеют никакого отношения.

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

  • Здравствуйте!
    Хочу уточнить о вашей статье. Вы написали
    —————————————————————————————————————————————
    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

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

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