Ubuntu Server. Настраиваем форвардинг портов на роутере.

| Комментариев: 131
forwarding.png
Одной из наиболее частых задач для системного администратора является предоставление доступа к ресурсам локальной сети для удаленных пользователей. Сделать этом можно разными способами, один из них - форвардинг портов. Суть этого метода в том, что клиент обращается к определенному порту шлюза, который в свою очередь перенаправляет запрос к порту локального ПК.
По сути форвардинг (перенаправление, проброс на жаргоне) портов дает возможность вынести определенные сервисы локальной сети в интернет. Это дает возможность держать почтовые (Web, FTP и т.п.) сервера в более безопасной зоне локальной сети (а лучше в DMZ). При этом следует осознавать потенциальную опасность подобного способа по сравнению с VPN или DirectAccess доступом, в данном случае ваши сервисы будут доступны всем желающим и стоит уделить особое внимание безопасности подобного решения.

В качестве примера рассмотрим организацию доступа к терминальному серверу в локальной сети через интернет, используя в качестве шлюза роутер на базе Ubuntu Server, настройка которого описана здесь. В нашей тестовой лаборатории была собрана следующая схема:

port-forwarding.png

В данном случае у нас имеется локальная сеть 10.0.0.0/24 в которой присутствует сервер терминалов по адресу 10.0.0.2, роутер с внутренним адресом 10.0.0.1 и внешним 192.168.64.134 (данный адрес взят нами для примера, в реальности здесь должен быть белый IP адрес) и ноутбук во внешней сети, который должен получить доступ к серверу терминалов.

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

Правило1
Правило2
Правило3

Пришедший пакет анализируется и если он удовлетворяет условиям Правила 1, то к нему применяется указанное в правиле действие, иначе переходим к Правилу 2 и т.д. Очевидно, что если мы укажем в Правиле 1 общее правило для всего приходящего трафика, а в Правилах 2 и 3 частные ситуации, то эти правила работать не будут, т.к. более общее Правило 1 стоит раньше. Поэтому сначала требуется описать более частные случаи, затем более общие и следить за тем, чтобы вышестоящие правила не перекрывали нежестоящие.

Итак, приступим. Для выполнения нашего условия (перенаправление порта 3389 во внутреннюю сеть) добавим в файл /etc/nat после секции "# Включаем NAT ", но до секции "# Запрещаем доступ снаружи во внутреннюю сеть" следующие строки:

#Разрешаем входящие подключения на 3389

iptables -A FORWARD -i eth0 -p tcp --dport 3389 -j ACCEPT


Это правило разрешает прохождение входящих пакетов на порт 3389 внутрь сети. Теперь опишем форвардинг:

# Форвардинг 3389
iptables -t nat -A PREROUTING -p tcp -d 192.168.64.134 --dport 3389 -j DNAT --to-destination 10.0.0.2:3389
iptables -t nat -A POSTROUTING -p tcp --dst 10.0.0.2 --dport 3389 -j SNAT --to-source 192.168.64.134


Первая строка подменяет адрес приемника на внутренний ip, а вторая адрес отправителя на внешний. Сохраняем  файл, перезагружаем сервер:

sudo reboot


Проверяем, все должно работать:

port-forwarding2.png

Как видим, ничего сложного. Главное - понимание того, что вы делаете. Не тупое повторение скопированных команд, а знание того, что вы делаете, зачем и почему именно таким образом. Успехов!

Комментариев: 131

Спасибо за разъяснение моего вопроса в теме "Linux. Настройка роутера (NAT + DHCP + Squid"
Я решил все же эту проблему другим способом:
написал в конце файла nat
# Подключение к удаленному рабочему столу к RDP серверу
iptables -t nat -I PREROUTING --dst внешний адрес -p tcp --dport 3390 -j DNAT --to-destination внутренний адрес компьютера:3389
iptables -t nat -I POSTROUTING -p tcp --dst внутренний адрес компьютера --dport 3389 -j SNAT --to-source внутренний адрес шлюза
iptables -t nat -I OUTPUT --dst внешний адрес -p tcp --dport 3390 -j DNAT --to-destination внутренний адрес компьютера:3389
iptables -I FORWARD -i eth1 --dst внутренний адрес компьютера -j ACCEPT

Очень интересная статья!!!
Спасибо большое, в ближайгие день два обязательно попробуем у себя такое организовать!

У меня нет постоянного внешнего адреса. Как быть в таком случае?

Подскажите пожалуйста, как перебросить порты на VPN сервер. Поменял в /etc/nat номера портов. Ничего не получилось. Заваливется на проверке имени и пароля. Если из локальной сети подключаться к серверу, подключение проходит.

Именно PPTP. Спасибо за подсказку. Хоть ясно теперь в какую сторону копать надо.

Спасибо автору!!! очень интересно и доступно для новичка!
Интересно было бы еще узнать о возможностях ограничения скорости клиентам. заранее спасибо =)

Виктор, уточните, какую именно скорость надо ограничивать. Либо по данному порту, либо скорость доступа в интернет из локальной сети. По порту - я не в курсе, а если касаться именно скорости интернета - то при перебросе порта на SQUID с траффиком работает именно данный прокси сервер, а в нем скорости регулируются в файле конфигурации. Можно делить скорость и на клиентов, и на группы клиентов, и по типам файлов ставить обрезку. Если надо - пишите, дам адрес, где подробнее можно посмотреть.
С уважением, Роман.

Добрый день, появился вопрос: как настроить доступ к внутреннему серверу, на котором размещен сайт

Настроили сервер как написано в статье Linux. Настройка роутера (NAT + DHCP + Squid), при таких настройках пользователи прекрасно могут качать torren-файлы, а вот раздавать не могут.
Подскажите пожалуйста, а как настроить так, чтобы пользователь мог не только качать но и раздавать torrent-файлы.
Попробовали сделать как написано в статье про форвардинг портов на роутере но результат отрицательный.
Спасибо.

Пользователи не могут принимать входящие подключения.

# Запрещаем доступ снаружи во внутреннюю сеть
iptables -A FORWARD -i eth0 -o eth0 -j REJECT

Я так понимаю надо перед этим правилом добавить правило которое разрешало бы доступ по порту 6886 (на этом порту висят torrent-программы моего начальства)
Подскажите как правильно написать правило.
А если можно, то + разрешить этот порт только для конкретных ip-адресов внутренней сети.
Спасибо.

Обнаружилась другая проблема: нашел у себя опечатку в строке iptables -A FORWARD -i eth0 -o eth0 -j REJECT
исправил на iptables -A FORWARD -i eth0 -o eth1 -j REJECT после этого в интернет может выйти только браузер, ни почта ни аська ни торреты ни чего не работает :(
В чем может быть проблема?

Спасибо заработало.
Торрент-файл качается и раздается, но есть один минус: как только пользователь полностью скачивает файл раздача прекращается :(

Вы не поможете написать такое правило, я как ни стараюсь ни чего не выходит (порт torrent 6886)
Спасибо

Посмотрите пожалуйста. Буду очень благодарен.

Не помогло :(

Подскажите, как направить трафик от клиентских машин к адресам 192.168.50.0 на второй шлюз в этой же сети 192.168.1.100
Основной шлюз, DHCP и squid 192.168.1.1

Пока выпоолняю на клиентских Win-машинах
route add 192.168.50.0 mask 255.255.255.0 192.168.1.100

У меня порт 6886
И у нас нет выделенного ip-адреса, это сильно влияет на те указания которые даны в этой статье?

Доброго Вам времени суток.
Подскажите такой момент: предположим, что у меня есть сервер, настроенный по Вашим рекомендациям.
Eth0 - инет, eth1 - локальная сеть.
Дальше интереснее: предположим использование протокола RDP, но с одной оговоркой. В локалке он работает по порту 3389, но пользователи из инета должны подключаться на порт, к примеру, 12434. т.е. в строке подключения пишем xxx.xxx.xxx.xxx:12434.
Данный вариант обрабатывался на "железном" роутере, а на убунте просто не пробовался.
Вопрос вот в чем: Как пишется правило в ip-tables?

Не влезло в один коммент.
Извините за глупый вопрос, но думалка уже отказывается работать :-)
С уважением, Роман.

Когда подключаю комп напрямую, то раздает без проблем. Засада именно на сервере.

И еще вопрос: А можно трафик торрента направит через squid

Хм... Пробовал сегодня на тестовой машине сделать форвардинг в точности как указано в данной статье, а именно: поднял 10.04.1 server, обновился, настроил nat, dhcp, squid. Прописал правила, всё перепроверил. Не проходит соединение. Заметил одну деталь: когда комп, к которому подключаюсь, находится за "роутером", и включен, то коннект идет некоторое время, потом падает, а если этот комп выключить - то коннект отключается сразу. Если коннектиться напрямую (не из-за роутера) то коннект проходит нормально.

Доброго времени суток
пытался сделать проброс по вашей стаnье не вышло
не RDP не POP,SMTP
подскажите где могу ошибаться?
внешний интерфейс ppp0

#Разрешаем входящие подключения на smtp
iptables -A FORWARD -i ppp0 -p tcp --dport 25 -j ACCEPT

# Форвардинг smtp
iptables -t nat -A PREROUTING -p tcp -d x.x.x.x --dport 25 -j DNAT --to-destination 192.168.0.11:25
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.11 --dport 25 -j SNAT --to-source x.x.x.x

интерфейс ppp0 имеет выделенный постоянный IP 91.143.x.x
перзагружал систему командой sudo reboot
и ещё пожалуйста вопрос не к этой статье а по VPNну: зависает pptpd, строку long config file line ignored поленился поставить =) а вот теперь при перезагрузке системы висит strating pptp daemond и всё на этом сервер не грузится и я не могу ввести не одну команду.. подскажите пожалуйста как это лечить спасибо

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

Пробовал устанавливать Hamachi на Ubuntu Server и чтобы через хамачи подключаться удалённо к серверу и изменять настройки если нужно. Но Hamachi установил, настроил, прописал перенаправление портов в /etc/nat, перезапускаю сервер, а хамачи автоматом не запустилось, хотя в автозагрузке прописал. После этого не мог попасть в Webmin на сервере.
Извините, если это сообщение не относится к теме статьи.
Чем можно заменить Hamachi на сервере или как правильно его настроить, чтобы он работал нормально?
Использовал статьи:
supware.net/other-fun-stuff/hamachiubuntuhowto
и
forum.ubuntu.ru/index.php?topic=49368.0

На сервере нет выделенного IP и сам сервер находится за провейдерским роутером. С помощью хамачи создать Виртуальную сеть и через эту сеть получать удалённый доступ к серверу по SSH и через браузер (Webmin)

Пробую настроить форвардинг порта 3389 по вашей статье, но у меня ничего не получается. Вот пример файла nat.

#!/bin/sh
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp -d 192.168.2.2 --dport 3389 -j DNAT --to-destination 192.168.0.34:3389
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.34 --dport 3389 -j SNAT --to-source 192.168.2.2
iptables -A FORWARD -i eth0 -p tcp --dport 3389 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT?
iptables -A FORWARD -i eth0 -o eth1 -j REJECT

192.168.2.2 адрес внешнего интерфейса шлюза ubuntu
192.168.0.34 адрес сервера терминалов

Вот проблема что не могу подключиться к серверу терминалов. Что я делаю не так?

Добрый день!
Не могу сделать проброс портов, всё написал по инструкции. Проброс не работает
eth0 интернет
eth2 локальная сеть
конфиг rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Включаем форвардинг пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward

# Разрешаем трафик на loopback-интерфейсе
iptables -A INPUT -i lo -j ACCEPT

# Разрешаем доступ из внутренней сети наружу
iptables -A FORWARD -i eth2 -o eth0 -j ACCEPT

# Включаем NAT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE

#Разрешаем входящие подключения на 3389
iptables -A FORWARD -i eth0 -p tcp --dport 3389 -j ACCEPT


# Форвардинг 3389
iptables -t nat -A PREROUTING -p tcp -d 79.40.184.166 --dport 3389 -j DNAT --to-destination 192.168.0.24:3389

# Разрешаем ответы из внешней сети
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Запрещаем доступ снаружи во внутреннюю сеть
iptables -A FORWARD -i eth0 -o eth2 -j REJECT

exit 0

конфиг /etc/network/interfaces
auto eth0 eth2
#auto lo
#iface lo inet loopback


iface eth0 inet static
address 79.40.184.166
netmask 255.255.255.252
broadcast 79.40.184.167
network 79.40.184.164
gateway 79.40.184.165
up ip route add 79.40.184.166/30 via 79.40.184.165


iface eth2 inet static
address 192.168.0.145
netmask 255.255.255.0
broadcast 192.168.0.255
network 192.168.0.0

post-up /etc/rc.local

В чем беда? Подскажите?

Не могли бы вы дописать нужное правило? Я уже совсем запутался.

Комментировать

Подписка на блог

Подпишись  на обновление блога по RSS Мы в Твиттере

 

Архивы по месяцам

Реклама

Статистика

Работает на  Movable Type 5.12

 

Яндекс.Метрика

География

free counters

Об этой записи

Сообщение опубликовано 13.08.2010 18:52. Автор — Уваров А.С..

Предыдущая запись — Установка ключа защиты 1С Предприятие на Ubuntu 10.04

Следующая запись — Файловый сервер. Какую ОС и файловую систему выбрать?

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.