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

В качестве примера рассмотрим организацию доступа к терминальному серверу в локальной сети через интернет, используя в качестве шлюза роутер на базе Ubuntu Server, настройка которого описана здесь. В нашей тестовой лаборатории была собрана следующая схема:
В данном случае у нас имеется локальная сеть 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 внутрь сети. Теперь опишем форвардинг:
Первая строка подменяет адрес приемника на внутренний 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 внутрь сети. Теперь опишем форвардинг:
# Форвардинг 3389iptables -t nat -A PREROUTING -p tcp -d 192.168.64.134 --dport 3389 -j DNAT --to-destination 10.0.0.2:3389iptables -t nat -A POSTROUTING -p tcp --dst 10.0.0.2 --dport 3389 -j SNAT --to-source 192.168.64.134
Первая строка подменяет адрес приемника на внутренний ip, а вторая адрес отправителя на внешний. Сохраняем файл, перезагружаем сервер:
sudo rebootПроверяем, все должно работать:
Как видим, ничего сложного. Главное - понимание того, что вы делаете. Не тупое повторение скопированных команд, а знание того, что вы делаете, зачем и почему именно таким образом. Успехов!

Спасибо за разъяснение моего вопроса в теме "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
Очень интересная статья!!!
Спасибо большое, в ближайгие день два обязательно попробуем у себя такое организовать!
У меня нет постоянного внешнего адреса. Как быть в таком случае?
Самое простое решение - обратиться к провайдеру за приобретением выделенного ip-адреса, стоит это удовольствие недорого.
Подскажите пожалуйста, как перебросить порты на VPN сервер. Поменял в /etc/nat номера портов. Ничего не получилось. Заваливется на проверке имени и пароля. Если из локальной сети подключаться к серверу, подключение проходит.
Что именно пробрасываете и как? Если PPTP то кроме проброса 1723 порта нужно еще разрешить хождение GRE пакетов через NAT, а это уже проблемно. Проще использовать специализированные пакеты типа pptpproxy.
Именно PPTP. Спасибо за подсказку. Хоть ясно теперь в какую сторону копать надо.
Спасибо автору!!! очень интересно и доступно для новичка!
Интересно было бы еще узнать о возможностях ограничения скорости клиентам. заранее спасибо =)
Виктор, уточните, какую именно скорость надо ограничивать. Либо по данному порту, либо скорость доступа в интернет из локальной сети. По порту - я не в курсе, а если касаться именно скорости интернета - то при перебросе порта на SQUID с траффиком работает именно данный прокси сервер, а в нем скорости регулируются в файле конфигурации. Можно делить скорость и на клиентов, и на группы клиентов, и по типам файлов ставить обрезку. Если надо - пишите, дам адрес, где подробнее можно посмотреть.
С уважением, Роман.
Добрый день, появился вопрос: как настроить доступ к внутреннему серверу, на котором размещен сайт
Если нужен доступ только к веб серверу "пробросьте" наружу 80 порт. Доступ к сайту можно будет получить набрав в браузере ваш внешний IP адрес, если у вас есть доменное имя, то оно также может указывать на ваш сайт, для этого нужно в А записи для домена указать ваш внешний IP (или попросить об этом регистратора).
Настроили сервер как написано в статье Linux. Настройка роутера (NAT + DHCP + Squid), при таких настройках пользователи прекрасно могут качать torren-файлы, а вот раздавать не могут.
Подскажите пожалуйста, а как настроить так, чтобы пользователь мог не только качать но и раздавать torrent-файлы.
Попробовали сделать как написано в статье про форвардинг портов на роутере но результат отрицательный.
Спасибо.
Не могут раздавать вообще или не могут принимать входящие подключения? Если второе, то следует разрешить доступ из внешней сети внутрь, для этого достаточно закомментировать соответствующее правило в /etc/nat. Однако учтите, что подобная настройка значительно снизит безопасность сети.
Пользователи не могут принимать входящие подключения.
# Запрещаем доступ снаружи во внутреннюю сеть
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 клиента.
Вы не поможете написать такое правило, я как ни стараюсь ни чего не выходит (порт torrent 6886)
Спасибо
С торрентами не все так просто, надо будет посмотреть, каким образом это лучше сделать.
Посмотрите пожалуйста. Буду очень благодарен.
Попробуйте сделать так. В настройках торрент клиента посмотрите порт для входящих соединений. Также снимите опцию менять этот порт при каждом запуске. Затем сделайте его проброс так, как описано в этой статье.
Не помогло :(
Вы уверены, что правильный порт пробросили? У меня например в торренте стоит 43246.
Подскажите, как направить трафик от клиентских машин к адресам 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-адреса, это сильно влияет на те указания которые даны в этой статье?
Вот здесь скорее всего и засада. Если вы еще за одним NAT'ом (провайдерским), то торрент может и не принимать входящие соединения. Не пробовали подключить этот ПК к интернету напрямую?
Доброго Вам времени суток.
Подскажите такой момент: предположим, что у меня есть сервер, настроенный по Вашим рекомендациям.
Eth0 - инет, eth1 - локальная сеть.
Дальше интереснее: предположим использование протокола RDP, но с одной оговоркой. В локалке он работает по порту 3389, но пользователи из инета должны подключаться на порт, к примеру, 12434. т.е. в строке подключения пишем xxx.xxx.xxx.xxx:12434.
Данный вариант обрабатывался на "железном" роутере, а на убунте просто не пробовался.
Вопрос вот в чем: Как пишется правило в ip-tables?
Не влезло в один коммент.
Извините за глупый вопрос, но думалка уже отказывается работать :-)
С уважением, Роман.
Когда подключаю комп напрямую, то раздает без проблем. Засада именно на сервере.
И еще вопрос: А можно трафик торрента направит через squid
Точно также, только заменяете номера портов на внешнем интерфейсе на нестандартные. Проанализируйте, что делают цепочки и сразу все станет понятно.
Трудно сказать в чем дело, надо смотреть вживую. Возможно двойной NAT не нравится или еще что-то. Торренты лежат довольно далеко от сферы наших интересов, поэтому никогда такой вопрос не поднимали.
Через прокси вроде бы можно, но смысл?
Хм... Пробовал сегодня на тестовой машине сделать форвардинг в точности как указано в данной статье, а именно: поднял 10.04.1 server, обновился, настроил nat, dhcp, squid. Прописал правила, всё перепроверил. Не проходит соединение. Заметил одну деталь: когда комп, к которому подключаюсь, находится за "роутером", и включен, то коннект идет некоторое время, потом падает, а если этот комп выключить - то коннект отключается сразу. Если коннектиться напрямую (не из-за роутера) то коннект проходит нормально.
Добавьте цепочку:
#Разрешаем входящие подключения на 3389
Доброго времени суток
пытался сделать проброс по вашей ста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
А каким образом присваивается выделенный IP? Непосредственно интерфейсу ppp0 или ему присваивается внутренний IP сети провайдера, который уже провайдером маршрутизируется во внешний?
Еще проверьте iptables на предмет запрещающих правил. Кстати перезапуск сети не всегда приводит к срабатыванию правил, попробуйте перезагрузить сервер.
интерфейс ppp0 имеет выделенный постоянный IP 91.143.x.x
перзагружал систему командой sudo reboot
и ещё пожалуйста вопрос не к этой статье а по VPNну: зависает pptpd, строку long config file line ignored поленился поставить =) а вот теперь при перезагрузке системы висит strating pptp daemond и всё на этом сервер не грузится и я не могу ввести не одну команду.. подскажите пожалуйста как это лечить спасибо
Грузитесь в режим восстановления (ESC при загрузке) и добавляйте в конец /etc/pptpd.conf перенос строки.
Извеняюсь за глупость.. а опишите по подробней что за перенос строки )
Открываете /etc/pptpd.conf, ставите курсов в конец последней строки, нажимаете Enter, сохраняете файл.
Пробовал устанавливать Hamachi на Ubuntu Server и чтобы через хамачи подключаться удалённо к серверу и изменять настройки если нужно. Но Hamachi установил, настроил, прописал перенаправление портов в /etc/nat, перезапускаю сервер, а хамачи автоматом не запустилось, хотя в автозагрузке прописал. После этого не мог попасть в Webmin на сервере.
Извините, если это сообщение не относится к теме статьи.
Чем можно заменить Hamachi на сервере или как правильно его настроить, чтобы он работал нормально?
Использовал статьи:
supware.net/other-fun-stuff/hamachiubuntuhowto
и
forum.ubuntu.ru/index.php?topic=49368.0
К сожалению про Hamachi сказать ничего не могу, это слишком далеко от сферы наших интересов. Я так понимаю нужен удаленный доступ к серверу? А чем SSH не устраивает?
На сервере нет выделенного IP и сам сервер находится за провейдерским роутером. С помощью хамачи создать Виртуальную сеть и через эту сеть получать удалённый доступ к серверу по SSH и через браузер (Webmin)
По моему, проще будет купить у провайдера выделенный IP, или смотрите в сторону DynDNS.
Пробую настроить форвардинг порта 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
В чем беда? Подскажите?
Правило DNAT вы прописали, а SNAT - забыли.
Не могли бы вы дописать нужное правило? Я уже совсем запутался.