Переброс соединений на машину с нереальным IP через NAT в Linux

дано:

Локальная сеть, роутер с 2-мя сетевыми карточками (под управлением Linux), в одну карточку включен шнур, по которому идет Интернет :-) Из роутера идет второй шнур, который раздает этот Интернет всей локалке. Классика, вобщем.

надо:

Пробросить порт (либо вообще "выкинуть" машину наружу) внутрь локалки, то есть обеспечить доступ извне (из дикого Интернета) к какой-то локальной машине.

решение:

Сразу скажу, что на ядрах 2.2.x это нормально не получается, разве что можно использовать утилиты iproute2 Алексея Кузнецова (сам не пробовал, но, говорят, получается). Так что я рассматриваю вариант kernel-2.4.x + iptables.
Ставим ядро (посвежее), в ядре включаем все, что касаемо iptables, ставим iptables (если еще не поставлен. Кстати, рекомендую ставить тоже самую свежую версию).


Обозначения:
$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, либо поставить новую версию программы (веб-сервер или прочее), которую случайно не поломают.

вариант #2

Требуется вообще "выкинуть" машину наружу, но административными мерами (то есть, не трогая самой машины).
Тут еще большее предупреждение: это гораздо опаснее, чем обычный "проброс" порта — так что ставить нормальный firewall просто необходимость, а не прихоть!


Обозначения:
1) $IFACE — внешний сетевой интерфейс на роутере (например, eth0).
2) $NEW_IP — новый IP, на который будем сажать "выведенную" машину из локалки (не может же она жить без IP-адреса :) Это, конечно, возможно только если провайдер дал вам больше одного внешнего IP-адреса ;)
3) $BC, $NM, $GW — соответственно, broadcast, netmask, gateway.
4) $LOCAL_IP — тоже самое, что и в предыдущем случае.


Сначала надо сделать alias (у нас же нет третьей сетевой карточки) сетевого интерфейса (все команды — от рута, естественно).

# ifconfig $IFACE:0 $NEW_IP netmask $NM broadcast $BC
# route add $NEW_IP gw $GW netmask 0.0.0.0 metric 1 dev $IFACE: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

Еще можно написать скрипт, который легко опускает/поднимает DNAT:

---cat-/etc/rc.d/rc.dnat---

#!/bin/bash
$IFACE=eth0
$LOCAL_IP="192.168.1.251"
$NEW_IP="q.w.e.r"
$NM="a.s.d.f"
$BC="z.x.c.v"
$GW="p.o.i.u"

case "$1" in
'stop')
iptables -D FORWARD -i eth0 -d $LOCAL_IP -j ACCEPT
iptables -t nat -D PREROUTING -p tcp -d $NEW_IP -j DNAT --to-destination $LOCAL_IP
route del $NEW_IP gw $GW netmask 0.0.0.0 metric 1 dev $IFACE:0
ifconfig $IFACE:0 down
;;
'start')
ifconfig $IFACE:0 $NEW_IP netmask $NM broadcast $BC
route add $NEW_IP gw $GW netmask 0.0.0.0 metric 1 dev $IFACE: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
;;
'restart')
$0 stop && $0 start
;;
*)
echo "usage $0 start|stop|restart"
;;
esac

---end-of-cat---

Все! Теперь нашу локальную машину могут ломать хакеры всего Интернета!! :)

 

Dmitry A. Koptev



Сетевые решения. Статья была опубликована в номере 05 за 2003 год в рубрике sysadmin

©1999-2024 Сетевые решения