Написал я эту статью уже очень давно, опубликована она была на другом сайте и вот я решил выложить ее на своем блоге, — все-таки трудился, зря что ли.
Данная статья, это своего рода заметка на тему проброса портов на сервере под управлением ОС FreeBSD. Итак исходные данные задачи: сервер с FreeBSD и двумя сетевыми картами. Первая — fxp0 (10.0.0.10) — смотрит на роутер с адресом 10.0.0.1 — выход в интернет; вторая — ed0 (192.168.1.1) — подключена ко второму серверу M$ Windows 2008. Задача: пробросить порты на первом сервере для доступа ко второму через RDP и Radmin. Способов есть несколько с помощью IPNAT, NATd, PF и Rinetd, их мы и рассмотрим по порядку.
Замечу, что параметры в файлы конфигурации можно добавлять двумя методами, показанными ниже.
Подгружаем IPNAT со следующими параметрами:
# cat /etc/rc.conf | grep ipnat ipnat_enable="YES" ipnat_program="/sbin/ipnat -CF -f" ipnat_rules="/etc/ipnat.rules"
или можно по другому:
# ee /etc/rc.conf
добавляем в конец файла:
ipnat_enable="YES" ipnat_program="/sbin/ipnat -CF -f" ipnat_rules="/etc/ipnat.rules"
RDP работает на 3389 порту, а Radmin по умолчанию на 4899 (если не указан другой порт в его настройках). В целях безопасности у рекомендую указывать другой порт я советую указывать порт отличный от стандартных, но для наглядности в статье буду использовать стандартные порты.
Для проброса портов в IPNAT применяется инструкция rdr:
# cat /etc/ipnat.rules | grep rdr rdr fxp0 0.0.0.0 port 3389 -> 192.168.1.1 port 3389 rdr fxp0 0.0.0.0 port 4899 -> 192.168.1.1 port 4899
Рассмотрим значения каждой части строки конфигурации:
rdr — (от англ. — redirect) указывает, что это именно перенаправление;
fxp0 — интерфейс маршрутизатора, который «смотрит» в интернет;
0.0.0.0 — статический ip-шник сервера (сетевого интерфейса который «смотрит» интернет и на который приходят пакеты, именно этот IP указывается, как адресс удаленной компьютера в RDP или Radmin);
port 3389 — собственно порт, с которого трафик перенаправляется из внешней сети во внутреннюю сеть;
192.168.1.1 — ip-адрес машины во внутренней сети, на который и будем заворачивать трафик;
port 3389 — порт на который происходит перенаправление во внутренней сети.
Точно также и для второй строки. Также можно строку редиректа прочитать так: перенаправляем (rdr) пакеты с интерфейса (fxp0) с адресом (0.0.0.0), если они пришли на порт (port 3389), во внутреннюю сеть (->) на адрес (192.168.1.1) на порт (port 3389). (Шото я гоню такое… :) )
После того как в /etc/ipnat.rules внесены все правила редиректа, IPNAT нужно перезапустить:
# /sbin/ipnat -CF -f /etc/ipnat.rules
С помощью NATd:
При испольвовании NATd, используется опция ядра DIVERT. Подгружаем NATd так:
# cat /etc/rc.conf | grep nat natd_enable="YES" #включаем поддержку natd natd_interface="fxp0" #указываем интерфейс, на котором работает natd natd_flags="-f /etc/natd.conf" #указываем конфигурационный файл для natd
Теперь переходим к natd.conf, здесь синтаксис отличается от предыдущего, но тоже в целом понятен:
# cat /etc/natd.conf redirect_port tcp 192.168.1.1:3389 3389 redirect_port tcp 192.168.1.1:4899 4899
Здесь:
redirect_port — тоже самое, что rdr, инструкция перенаправления;
tcp (udp) — тип трафика, который будем редиректить;
192.168.1.1:3389 — сокет (связка ip + порт), на который будет перенаправляться трафик;
3389 — номер порта, с которого будет заворачиваться трафик.
Перезапускаем NATd:
# sh /etc/rc.d/natd restart Stopping natd. Waiting for PIDS: .......... Starting natd. Loading ..........
Будьте внимательны!
Файл /etc/natd.conf (как и многие другие конфигурационные файлы) должен заканчиваться пустой строкой!
В этом случае проброс реализуем, добавляя в /etc/pf.conf такие строки:
rdr on fxp0 proto { tcp, udp } from any to 0.0.0.0 port 3389 -> 192.168.1.1 port 3389 rdr on fxp0 proto { tcp, udp } from any to 0.0.0.0 port 4899 -> 192.168.1.1 port 4899
Здесь:
rdr — уже понятно, что это такое :)
on fxp0 — интерфейс маршрутизатора, который «смотрит» в интернет;
proto { tcp, udp } — тип трафика для проброса;
from any — сети, с которых будет работать переадресация, в данном случае — любая сеть;
to 0.0.0.0 — на этот IP приходит трафик извне;
port 3389 — на этом порту «слушаем» пакеты, которые будут перенаправляться;
192.168.1.1 port 3389 — IP и порт, на который будет форвардиться трафик в локальной сети.
Теперь о неприятном. Недостаток этих способов в том, что с ними много возни и не всегда получается сделать так как хочется — быстро и чтоб сразу работало. Тем более, что например для IPNAT нужен внешний статический ip-шник, а это не всегда доступно. Для решения всех проблем сразу есть замечательный инструмент — rinetd, которым я теперь пользуюсь все время — и быстро и сразу работает.
Устанавливаем rinetd:
# cd /usr/ports/net/rinetd # make install clean
Добавляем rinetd в rc.conf:
# ee /etc/rc.conf rinetd_enable="YES"
Открываем файл конфигурации rinetd
# ee /usr/local/etc/rinetd.conf
и добавляем в него следующие правила:
xxx.xxx.xxx.xxx 4899 192.168.1.1 4899 xxx.xxx.xxx.xxx 3389 192.168.1.1 3389
Вот первая прелесть: вместо xxx.xxx.xxx.xxx можно указать 0.0.0.0 если нет статического IP.
Строка редиректа проста до безобразия:
ххх.ххх.ххх.ххх – внешний IP адрес, на который приходит трафик;
4899 – номер порта, на котором «слушаем» пакеты;
192.168.1.1 – внутренний IP адрес на который мы делаем проброс портов;
4899 — порт во внутренней сети, на который заворачиваем пакеты.
0.0.0.0 40001 192.168.1.2 4899 0.0.0.0 40002 192.168.1.2 3389
Здесь для пущей безопасности, порты на которых «слушаем» изменены на 40001 и 40002. В этом случае в настройках Radmin на удаленной машине нужно указать, не стандартный порт у молчанию, а этот — 40001. В случае с RDP нужно на локальной машине, с которой подключаемся, указывать порт через двоеточие прямо в строке подключения ххх.ххх.ххх.хххх:40002.
После этого необходимо внести исключения в firewall, чтобы он не отфутболивал пакеты адресованные нашим портам. Для этого открываем файл конфигурации firewall и вносим в него следующие строки:
${fwcmd} add allow tcp from any to me 3389 ${fwcmd} add allow tcp from any to me 4899
Теперь перезагружаем rinetd и firewall:
# /etc/rc.d ipfw restart # /usr/local/sbin/rinetd rinetd restart (или start если он не был запущен).
Возможно придется перезапустить Freebsd, если команды не выполняются.
Вот, собственно и все. О таких прописных истинах, как то, что Radmin должен быть установлен на удаленной машине и RDP разрешен, думаю, говорить не стоит.
— — — — — — — — — — — уже не актуально- — — — — — — — — — —
Также замечу, что способ с rinetd замечательно работает с сервисом DDNS от «Укртелекома» — в этом случае заказываем на сайте my.ukrtelecom.ua в личном кабинете себе динамический DNS вида *.ddns.ukrtel.net, который будет доступен независимо от того, с каким IP в данный момент поднята сессия. Например, вы заказали DDNS такого вида cooldomain.ddns.ukrtel.net, то в Radmin в поле «IP адрес или DNS имя» указываем именно его, а в поле порт или оставляем «По умолчанию» 4899 или задаем свой порт. В случае с RDP, в окне «Подключение к удаленному рабочему столу» указываем так: cooldomain.ddns.ukrtel.net — если rinetd настроена на прослушивание стандартного порта, или так: cooldomain.ddns.ukrtel.net:40002 — если rinetd настроена на другой порт.
— — — — — — — — — — — /уже не актуально- — — — — — — — — — —
Еще раз уточняю детали:
— для Radmin: на удаленной машине (к которой будем коннектиться), устанавливаем Radmin Server, в настройках создаем пользователя и пароль для подключения, а также даем ему права; далее настраиваем rinetd как указано выше (например на нестандартный порт 40001); на локальной машине в Radmin создаем подключение с такими параметрами как на скриншоте ниже и можно пробовать подключатся.
— для RDP: на удаленной машине настраиваем уделенный доступ (Свойства системы -> Настойка удаленного доступа -> вкладка Удаленное использование -> ставим переключатель напротив Разрешать подключения от компьютеров с любой версией удаленного рабочего стола); настраиваем rinetd на нестандартный порт (например 40002); на локальной машине в окне подключения прописываем такую строку: cooldomain.ddns.ukrtel.net:40002
Если все правильно сделано и нет других факторов, которые могут мешать нормальному пробросу портов (например кривые правила фаервола), то все должно работать.
Удачных пробросов, честь имею.
Обижаться и негодовать, это все равно, что выпить яд в надежде, что он убьет твоих врагов