The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Проброс порта внутрь сети через NAT в Linux (nat iptables linux)


<< Предыдущая ИНДЕКС Правка src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: nat, iptables, linux,  (найти похожие документы)
From: Dmitry A. Koptev <dimez@nm.ru.> Date: Mon, 17 Oct 2005 18:21:07 +0000 (UTC) Subject: Проброс порта внутрь сети через NAT в Linux Оригинал: http://dimez.nm.ru/docs/nat/ ДАНО: Локальная сеть, роутер с 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) $IFACE - внешний сетевой интерфейс на роутере(например, eth0) 2) $NEW_IP - новый IP, на который будем "сажать" "выведенную" машину из локалки (не может же она жить без IP :)(Если провайдер дал Вам больше одного внешнего I P-адреса) 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--- Всё! Теперь нашу локальную машину могут ломать хакеры всего интернета!! :) P.S. Все дополнения, исправления, пожелания, деньги и ценные вещи приветствуются :)

<< Предыдущая ИНДЕКС Правка src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Irina V Smorodina (?), 12:23, 26/02/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    День добрый! у меня сложилась ситуация, когда мне нужно сделать доступ к локальной машине извне на порт 3389.
    У меня стоит на роутере fedora core 2.
    согласно вышеописанному, делаю
    # iptables -t nat -A PREROUTING -p tcp -d $EXT_R_IP --dport 3389 -j DNAT --to-destination $LOCAL_IP:3389
            # iptables -A FORWARD -i eth0 -d $LOCAL_IP -p tcp --dport 3389 -j ACCEPT

    но к локальной машине по этому порту так и не пускает.

     
     
  • 2.3, sub (?), 04:00, 07/05/2006 [^] [^^] [^^^] [ответить]  
  • +/
    1. Точно ли включен доступ на локальной машине RD
    2. Не перебивает ли какоенибудь правило iptables твою цепочку проброса портов...
     
  • 2.4, sub (?), 04:02, 07/05/2006 [^] [^^] [^^^] [ответить]  
  • +/
    И ещё... какой у тебя ЯДРО на твоей FC2 ???????
    в мануале сказано, цетирую:
    "Сразу скажу, что на ядрах 2.2.x это нормально не получается,
    только используя утилиты iproute2 Алексея Кузнецова(сам не пробовал,
    но, говорят, получается). Так что я рассматриваю вариант kernel-2.4.x
    + iptables."
     

  • 1.2, sub (?), 03:55, 07/05/2006 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Linux & Windows
    ==
    Проброс порта, в большенстве нужен для администрирования сервера в локальной сети.
    Помимо UNIX серверов, частенько необходим доступ, напрмер к Домену, который само собой работает под управлением windows 2k, 2003. Но если администратор работает всю жизнь под unix, и пользуеться удалённым клиентом rdesktop (unix).... может возникнуть проблема, как один раз возникла у меня. Пробросил я порт 3389 на локальную машинку, под управлением windows 2003 server, но имя пользователя на ней на русском языке, пароль на английском. Стандартная комбинация Shift + Alt или Shift + Ctrl под rdesktop (unix) - НЕ РАБОТАЕТ, как же залогиниться????
    Ответ прост - Экранная Клавиатура. Запускаеться она комбинацией клавиш
                     !!! windows + U !!!
    собственно такой небольшой ньюанс, который не раз поможет Вам быстро и оперативно залогиниться удалённо.
     
     
  • 2.5, Dmitriy (??), 09:06, 20/05/2006 [^] [^^] [^^^] [ответить]  
  • +/
    >Пробросил я порт 3389
    >на локальную машинку, под управлением windows 2003 server, но имя пользователя
    >на ней на русском языке, пароль на английском. Стандартная комбинация Shift
    >+ Alt или Shift + Ctrl под rdesktop (unix) - НЕ
    >РАБОТАЕТ, как же залогиниться????

    x11.conf отменили?
    XkbOption и пр.

     

  • 1.6, Илья (??), 14:16, 20/07/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Стандартная комбинация Shift + Alt или Shift + Ctrl под rdesktop (unix) - НЕ РАБОТАЕТ

    Это после каго перепугу? Все работает

     
  • 1.7, init (?), 17:11, 26/04/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Сам только что пропарился с пробросом портов... Вот вычитал в инете
    ptables -t nat -A PREROUTING -s $FROM -d $GATE_IP -i eth1 -p tcp -m tcp --sport 1024:65535 --dport 3389 -j DNAT --to-destination $W2K_SERVER

    iptables -t nat -A POSTROUTING -d $W2K_SERVER -o eth0 -p tcp -m tcp --dport 3389 -j SNAT --to-source $GATE_INNER_IP

    iptables -A INPUT -s $FROM -d $GATE_IP -i eth1 -p tcp -m tcp --dport 3389 -j ACCEPT
    iptables -A FORWARD -s $FROM -i eth1 -p tcp -m tcp --dport 3389 -j ACCEPT
    iptables -A FORWARD -s $W2K_SERVER -d $FROM -i eth0 -p tcp -m tcp --sport 3389 -j ACCEPT

    где
    $FROM - кому разрешено ломиться к внутреннему серверу
    $GATE_IP - внешний ip-адрес шлюза
    $GATE_INNER_IP - внутренний ip-адрес шлюза
    $W2K_SERVER - ну это понятно :)


    -------------
    спасибки Xman'у

     
  • 1.8, system (??), 13:57, 25/06/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    а в free можно шота подобное сделать???
     
     
  • 2.10, Dmitry (??), 08:59, 18/11/2008 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Да конечно, а IPFW юзать rdr.
    Например:
    "rdr on $ExtIf proto tcp from any to $ExtIP port 33334 -> 10.х.х.х/32 port rdp"
     
     
  • 3.11, Dmitry (??), 09:00, 18/11/2008 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ой, извиняюсь PF надо.
     

  • 1.9, Ямберт (?), 13:12, 21/08/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    У меня другая задача, нужно пробросить порт но маршрутизация сделана на Win XP. Нужно чтоб апачь на одной из машин был через другую виден вовне.
     
  • 1.12, ss1 (?), 07:36, 04/12/2008 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Спасибо большое статья работает))))
     
  • 1.13, vasia (??), 01:04, 28/05/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    А как сделать что бы это работало когда внешний ип по дхцп и внутри сети всем по дхцп раздается и что б у всех во внутреней сети был виден этот порт?
     
     
  • 2.15, ImSolo (?), 16:41, 01/06/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Юзать DNS внутри сети и писать вместо IP DNS-имя. У меня так.
     

  • 1.14, Агент павел... (?), 01:24, 01/06/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Какой этот?
     
  • 1.16, denis (??), 00:38, 06/06/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    спасибо! помогло!

    10 баллов по 10 бальной шкале автору! недавно сел за iptables, но поскольку проброс понадобился раньше чем прочитал про них, пришлось юзать скрипт. спасибо!!!

     
  • 1.17, Decoy (?), 16:35, 16/07/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Почему же только '-p tcp'? Как на счет UDP, ICMP?.. Я бы убрал '-p tcp'.
     
  • 1.18, Руслан (?), 15:40, 17/09/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    У меня только при:
    # iptables -t nat -A PREROUTING -p tcp -i $EXT_IFACE --dport $PORT1 -j DNAT --to-destination $LOCAL_IP:$PORT2
    # iptables -A FORWARD -i eth0 -d $LOCAL_IP -p tcp --dport $PORT2 -j ACCEPT
    заработало.
     
  • 1.19, Птр (?), 13:45, 18/11/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Толково и без воды. На wl-500gP+ usb wimax YOTA c прошивкой от Олега нужно было пробросить порт с wimax. Много искал. Ничего путного не выходило. Данная статья помогла. АВТОРУ СПАСИБО ОГРОМНОЕ!!!!!!
     
  • 1.20, Дон (?), 14:20, 08/02/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    возможно ли сделать проброс портов через один интерфейс?
    Имеем
    1) fedora core 11 на "сервере"(поставлена в роутере  а  DMZ).
    2) 3 машинки каждой нужен проброс на разные порты(от 2 до 5-ти).
    3) роутер(из-за лимита количества правил 10-15 и резделении по протоколам)
     
     
  • 2.21, Дон (?), 14:24, 08/02/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Система висит(
    1) на DMZ
    3)(из-за лимита количества правил 10-15 и резделении по протоколам, такое количество правил не реализовать)
     

  • 1.22, Beavis (??), 21:41, 12/06/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Получаю $EXT_R_IP по средствам DHCP сервера провайдера. Каким образом следует изменить правило?
     
  • 1.23, Lorgus (?), 13:14, 07/07/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    во во... меня тож DHCP интересует, от прова DHCP и ppp0
     
  • 1.24, Георгий (??), 15:52, 09/08/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    iptables -F FORWARD
    iptables -t nat -A PREROUTING -p tcp -d 192.168.56.11 --dport 2221 -j DNAT --to-destination 192.0.2.102:22
    #iptables -A FORWARD -i eth0 -p tcp  --sport 2221 -d 192.0.2.102 --dport 22 -j ACCEPT

    iptables -L

    Для чего нужна вторая строчка, если у меня работает и без нее?
    Суть: на локальном компе с 192.168.56.11 с помощью OpenVZ сделан контейнер без внешнего доступа. Вышеприведенным кодом делаю ssh доступ к нему по порту 2221 (стандартный 22 используется для доступа к самому компу).

     
     
  • 2.33, Артём (?), 11:11, 13/11/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Разрешает прохождение (форвардинг) пакетов. Понимаешь ли... У нормальных сисадминов стоит правило iptables -P FORWARD DROP, дабы всякие козявкины не ломали сетку.
     

  • 1.25, Sharp (?), 09:55, 31/08/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Скажите пожалуйста:
    1) Те кто будет по проброшеному порту заходить на машину в локалке будут знать, что они зашли на локальную машину, а не на роутер?
    2) Провайдер от которого у меня интернет может выяснить, что за роутером ещё машины есть, если локальным машинам устроить проброс портов?
     
     
  • 2.26, Gotik (??), 18:57, 16/10/2010 [^] [^^] [^^^] [ответить]  
  • +/
    1) - Нет небудут.
    2) - При сильном желании может.Но только какая ему разница?))
     

  • 1.27, madmas (?), 20:48, 18/10/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А какие еще нужно добавить правила (чтобы добраться до GATE_INNER_IP), если перед машиной GATE стоит железный файервол, который уже выбрасывает GATE наружу? Т.е. получается что у GATE оба IP адреса внутренние.
     
  • 1.28, доктор хата (?), 02:28, 17/02/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    фууууу, сколько ламоты!
    Я б таких не подпускал к компам без сдачи на права. Да!
    И в инет бы не выпускал писать. Только читать.
    Так-то.
     
  • 1.29, Boba (?), 21:19, 21/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Сделал все по описанию, два раза проверил, - не работает.
    Linux - CentOS 6.3
    Видимо, статья устарела.
     
  • 1.30, ArtM (?), 23:00, 27/08/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Господа, что же получается, что DMZ в каком-нибудь DLink-е, мулька для Юзверей?
    кто-нубудь делал ли DMZ на неком Firehol (это такой farewall, достаточно интеллигентный)
     
  • 1.31, mikis (?), 15:41, 03/05/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Подскажите, как подключиться с этой же локальной сети где веб сервер по внешнему ІР?
     
  • 1.32, Rus (??), 19:45, 16/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    У меня шлюз-комп. 2 сетевухи. 1-ая сетевуха 192.168.1.10 смотрит в инет на роутер 192.168.1.1
    вторая сетевуха смотрит внутрь сети. у нее IP 10.10.2.1. А у компа что мне недо IP 10.10.2.200
    Пробрасываю ssh и RDP так:
    iptables -t nat -A PREROUTING -p tcp -d 192.168.1.10 --dport 2222 -j DNAT --to-destination 10.10.2.200:22
    iptables -A FORWARD -i eth0 -d 10.10.2.200 -p tcp --dport 22 -j ACCEPT
    iptables -t nat -A PREROUTING -p tcp -d 192.168.1.10 --dport 33389 -j DNAT --to-destination 10.10.2.200:3389
    iptables -A FORWARD -i eth0 -d 10.10.2.200 -p tcp --dport 3389 -j ACCEPT
    Причем из вне на ssh я захожу по порту 2222 меня перебрасывает на комп на порт 22
    а по удаленке захожу по порту 33389 меня перебрасывает на комп на порт 3389

    p.s. Это так инфа для тех у кого не получается.. Смотрите примеры - пробуйте.
    спасибо за спасибо )

     
     
  • 2.34, Гость (??), 21:38, 22/04/2020 [^] [^^] [^^^] [ответить]  
  • +/
    eth0 смотрит наружу или внутрь?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру