From: Dmitry A. Koptev <dimez@nm.ru>
Subject: Переброс соединений нв машину с нереальным IP через NAT в Linux
ДАНО:
Локальная сеть, роутер с 2-мя сетевыми карточками(под управлением Linux), в одну
карточку включен шнур, по которому идёт интернет :-) Из роутера идёт второй шнур,
который раздаёт этот интернет всей локалке.
НАДО:
"Пробросить" порт(либо вообще "выкинуть" машину наружу) внутрь локалки, то-есть
обеспечить доступ извне(из дикого интернета) к какой-то локальной машине
РЕШЕНИЕ:
Сразу скажу, что на ядрах 2.2.x это нормально не получается, только используя
утилиты iproute2 Алексея Кузнецова(сам не пробовал, но, говорят, получается).
Так что я рассматр иваю вариант kernel-2.4.x + iptables.
Ставим ЯДРО (посвежее http://www.kernel.org/pub/linux/kernel/), в ядре включаем всё,
что касаемо iptables, ставим IPTABLES ( http://www.netfilter.org/ )
(если ещё не поставлены, кстати, рекомендую ставить тоже самые свежие)
Обозначения
$EXT_R_IP - внешний IP роутера
$LOCAL_IP - внутренний "фэйковый" адрес машины, которую надо "выкидывать" наружу
$PORT1 - Порт, на который будут заходить извне и попадать на локальную машину
$PORT2 - Порт, который "выбрасывается" наружу(например, 80 - http, либо 21 - ftp)
На роутере говорим следующие команды(от рута)
# iptables -t nat -A PREROUTING -p tcp -d $EXT_R_IP --dport $PORT1 -j DNAT --to-destination $LOCAL_IP:$PORT2
# iptables -A FORWARD -i eth0 -d $LOCAL_IP -p tcp --dport $PORT2 -j ACCEPT
Вуаля! Машина видна снаружи!
!!!БОЛЬШОЕ ПРЕДУПРЕЖДЕНИЕ!!! Прежде чем "выкидывать" порт наружу - имеет смысл
поставить на эту машину firewall, либо поставить новую версию
программы(web-сервер или прочее), которую случайно не поломают.
Вариант #2 - требуется вообще "выкинуть" машину наружу, но административными мерами
(то есть, не трогая самой машины)
Тут ЕЩЁ БОЛЬШЕЕ ПРЕДУПРЕЖДЕНИЕ!!! Это гораздо опаснее, чем обычный "проброс"
порта - так что ставить нормальный firewall просто необходимость, а не
прихоть!!!
Обозначения
1) $DEV - внешний сетевой интерфейс на роутере(например, eth0)
2) $NEW_IP - новый IP, на который будем "сажать" "выведенную" машину из локалки
(не может же она жить без IP :)
(Если провайдер дал Вам больше одного внешнего IP-адреса)
3) $BC,$NM,$GW - соответственно, broadcast,netmask,gateway, который выдаёт
провайдер(в общих чертах)
4) $LOCAL_IP - тоже самое, что и вверху
Сначала надо сделать alias(у нас же нет третьей сетевой карточки) сетевого
интерфейса (все команды - от рута, естественно)
# ifconfig $DEV:0 $NEW_IP netmask $NM broadcast $BC
# route add $NEW_IP gw $GW netmask 0.0.0.0 metric 1 dev $DEV:0
# iptables -t nat -A PREROUTING -p tcp -d $NEW_IP -j DNAT --to-destination $LOCAL_IP
# iptables -A FORWARD -i eth0 -d $LOCAL_IP -j ACCEPT
Всё! Теперь нашу локальную машину могут ломать хакеры всего интернета!! :)
P.S. Все дополнения, исправления, пожелания, деньги и ценные вещи приветствуются :)