LINUX.ORG.RU

Iptables, переброска порта.


0

1

Добрый день. Настраиваю у себя небольшую сеть. Как маршрутизатор использую Ubuntu Server 11.04. У него два интерфейса eth1 - внешний (с IP от провайдера) и eth0 для NAT. Суть вопроса пока не в этом, но для полной картины приведу все настройки

/etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

auto eth1
iface eth1 inet static

	address x.x.x.x
        netmask 255.255.255.240
        gateway x.x.x.x
        dns-nameservers x.x.x.x
    
auto eth0
iface eth0 inet static
        address 192.168.0.1
        network 192.168.0.0
        netmask 255.255.254.0
        broadcast 192.168.1.255
        



Вся настройка NAT делается следующими скриптами:

Очистка от всех правил

#!/bin/bash

echo "Stopping fw..."

/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat -X
/sbin/iptables -t mangle -F
/sbin/iptables -t mangle -X
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

nat.sh

#! /bin/bash

FWVER=0.1

echo -e "\n\nLoading simple rc.firewall-iptables version $FWVER..\n"
DEPMOD=/sbin/depmod
MODPROBE=/sbin/modprobe

EXTIF="eth1"
INTIF="eth0"

echo "    External Interface $EXTIF"
echo "    Internal Interface $INTIF"


#===================================================================

echo -en "    loading modules: "
echo "  - Verifying that all kernel modules are ok"

$DEPMOD -a
echo "------------------------------------------------------------------------------------------"
echo -en "ip_tables, "
$MODPROBE ip_tables
echo -en "nf_conntrack, "
$MODPROBE nf_conntrack
echo -en "nf_conntrack_ftp, "
$MODPROBE nf_conntrack_ftp
echo -en "nf_conntrack_irc, "
$MODPROBE nf_conntrack_irc
echo -en "iptable_nat, "
$MODPROBE iptable_nat
echo -en "nf_nat_ftp "
$MODPROBE nf_nat_ftp
echo -en "\n------------------------------------------------------------------------------------------"

echo -en " \nDone loading modules.\n"
echo " Enabling forwarding.."
echo "1" > /proc/sys/net/ipv4/ip_forward
echo " Enabling DynamicAddr.."
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
echo " Clearing any existing rules and setting default policy.."

iptables-restore <<-EOF
*nat
-A POSTROUTING -o "$EXTIF" -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i "$EXTIF" -o "$INTIF" -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i "$INTIF" -o "$EXTIF" -j ACCEPT
-A FORWARD -j LOG
COMMIT
EOF

echo -e "\nrc.frewall-iptables v$FWVER done.\n"

Все это дело работает на ура + в связке с isc-dhcp + bind9. Вопрос в следующем скрипте. В NAT есть машинка под WinXp куда мне бы хотелось иметь доступ удаленно (RDP). Порт там стандартный 3389. А заходить хочу не через него, а через другой (скажем 6882)

Делаю так

pf.sh

!/bin/bash


EXT_R_IP=x.x.x.x
LOCAL_IP=192.168.1.10
PORT1=6882
PORT2=3389
EXTIF=eth1
INTIF=eth0

echo -ne "External IP $EXT_R_IP\n"
echo -ne "IP to be forwarded to $LOCAL_IP\n"
echo -ne "External port to be knocked at $PORT1\n"
echo -ne "RDP port at $LOCAL_IP is $PORT2\n"
echo -ne "Doing the f**king magic.......\n"
echo -ne "-----------------------------------------------------------\n"

/sbin/iptables -A INPUT -p tcp -i $EXTIF --dport $PORT1 -j ACCEPT
/sbin/iptables -t nat -A PREROUTING -p tcp -d $EXT_R_IP --dport $PORT1 -j DNAT --to-destination $LOCAL_IP:$PORT2
/sbin/iptables -A FORWARD -i $EXTIF -d $LOCAL_IP -p tcp --dport $PORT2 -j ACCEPT

Но ничего не работает. Как не бьюсь, не заходит удаленно. Подскажите, что неверно здесь?


Вот вывод iptables -L -nv


Chain INPUT (policy ACCEPT 61 packets, 4104 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  eth1   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:6882 

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  eth1   eth0    0.0.0.0/0            0.0.0.0/0           ctstate RELATED,ESTABLISHED 
    0     0 ACCEPT     all  --  eth0   eth1    0.0.0.0/0            0.0.0.0/0           
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 
    0     0 ACCEPT     tcp  --  eth1   *       0.0.0.0/0            192.168.1.10        tcp dpt:3389 

Chain OUTPUT (policy ACCEPT 33 packets, 4480 bytes)
 pkts bytes target     prot opt in     out     source               destination         


mpp5 ()

Посмотрите tcpdump'ом, что:
1) syn-пакет приходит на интерфейс eth1
2) syn-пакет уходит с интерфейса eth0

Тогда, хотя бы будет понятно, чьи это проблемы --- провайдера, XP или вашего сервера.

mky ★★★★★ ()
Ответ на: комментарий от mky

Не знаю, то ли имелось ввиду, но я сделал так:

tcpdump -n tcp and port 6882 and 'tcp[tcpflags] & tcp-syn == tcp-syn'

Стучусь по RDP — ноль эмоций. Если пинговать eth1 и глядеть по eth1 (это внешка) то все ок. Такое ощущение, что сам порт 6882 закрыт на внешке.

mpp5 ()
Ответ на: комментарий от mpp5

Так, стоп, вру.

Сделал tcpdump -i eth1 tcp port 6882 и tcpdump -i eth0 tcp port 3389. Пакеты ходят! Причем как надо, запрос на RDP переправляется на 192.168.1.10 Но резалтов нет =( не подключается. Может ему как-то нужно и обратно выдать ответ?

mpp5 ()
Ответ на: комментарий от poshat

т.е. поглядеть на самой машине с WinXP какие порты открыты, когда к ней подключаешься? дык вроде 3389 и все. + об этом куча мануалов говорит. пробовал подключаться к 192.168.1.10 из внутренней (192й подсети) все ок. т.е. файрволл на 192.168.1.10 не рубит подключения.

mpp5 ()
Ответ на: комментарий от spunky

Видимо, да.

Т.е. пакеты приходят куда нужно. Думаю, тут отмалчивается 1.10 машина. Поглащает запросы, как черная дыра. Вот только не пойму как это проверить? Сейчас пока вся работа через ssh... нужен ли физ. доступ к 1.10 или еще можно что-нибудь с tcpdump покрутить?

mpp5 ()
Ответ на: комментарий от mpp5

файрволл на 192.168.1.10 может не рубить подключения именно с локальной подсети, а наружних клиентов брить напрочь. Можешь как вариант вместе с dnat использовать и snat, подменяя заодно и адрес источника подключения. А можешь просто уточнить в firewall.cpl настройки.

spunky ★★ ()
Ответ на: комментарий от mpp5

работа через ssh - это уже пол победы! Пробрасываешь тоннель с локального порта (типа 12345 или что тебе больше нравится) на localip:3389 и подключаешься на 127.0.0.1:12345, машинка с RDP увидит подключения от ssh-сервера, а не снаружи сети. Если дело в обрубающем подключения из внешних сетей фаерволле, то эта бочка может тебя выручить. Правда, проброс локальных портов может быть запрещён в настройках ssh-сервера.... тогда начинай пляски с одновременной подменой и адреса источника подключения к RDP-серверу. Т.е. у тебя будут отдновременно отрабатывать и SNAT, и DNAT.

spunky ★★ ()
Ответ на: комментарий от spunky

>Можешь как вариант вместе с dnat использовать и snat

А как это сделать? написать еще одно правило, типо:

/sbin/iptables -t nat -A PREROUTING -p tcp -d $EXT_R_IP --dport $PORT1 -j SNAT --to-destination $LOCAL_IP:$PORT2?

mpp5 ()
Ответ на: комментарий от mpp5

>Вот только не пойму как это проверить?

telnet 192.168.1.10 3389

Mr_Alone ★★★★★ ()
Ответ на: комментарий от mpp5

хм, вроде бы SNAT делается уже в POSTROUTING. Посмотри, например, вот эту табличку. И, при всём при этом, тебе надо сорснатить уже изменённый в прероутинге нат-таблицы пакет, т.е. там будет другой порт :) И --to-destination ожидаемо превращается... превращается... превращается... в элегантный --to-source, ня :)

з.ы. смотри ssh не убей случайно, а то я тебе тут левых советов как надаю сейчас!

spunky ★★ ()

кстати, а на RDP-сервере с маршрутами наружу всё ок? Машина может просто игнорировать входящий трафик из внешних сетей, если на них нет маршрута

spunky ★★ ()
Ответ на: комментарий от spunky

Да, на машине все ок. Вживую ( =) ) сегодня проверялось: есть пинг и до шлюза и выход в интернет.

ох, табличка кстати, благодарю. Ток ее еще осилить нужно, чем и займусь... хотя, надеюсь, что завтра вылечу это все правкой файра на 1.10. или... бля, там может быть пан Касперсий, в-рот-мне-ноги... может эта сука и режет все... (прошу извинить за выражения, просто вырвалось)

mpp5 ()
Ответ на: комментарий от mpp5

Вобщем, всем пока спасибо. Завтра продолжу на работе. Кому интересно, может позже в этот топик заглянуть, где я буду жаловаться на жизнь дальше или прийду альфа-самцом =)

mpp5 ()
Ответ на: комментарий от mpp5

SNAT надо POSTROUTING, можно добавить -i eth1.

А XP, это оффтопик здесь, но, там, вроде, по умолчу как-то закрыта возможность подключения не с локальной сети.

mky ★★★★★ ()
Ответ на: комментарий от mky

Итак, отписываюсь. Добавил правило

iptables -t nat -I POSTROUTING -o eth0 -p tcp -d 192.168.1.10 -j SNAT --to-source 192.168.0.1

И все заработало. Т.е. реально резало пакеты из внешки, а из локалки пропустило! Всем спасибо!

mpp5 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.