URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID10
Нить номер: 4491
[ Назад ]

Исходное сообщение
"iptables:возможно ли сделать такое?"

Отправлено shas , 30-Янв-10 21:38 
Hi!

Сделал попытки реализовать следующее и закрались смутные сомнения:"А возможно ли оно?".

Задача вроде бы банальная.
Есть сервер с внешним (ххх.ххх.ххх.ххх) и внутренним (192.168.0.5) адресами.
На этом сервере запущена некая программа, которая слушает только на внутреннем интерфейсе
порт 2000.
Надо, подключившись с внешнего интерфейса, попасть на внутренний на порт 2000.
Из вне пробросить соединение на компьютер во внутренней сети не составляет проблемы.
Но в описанной выше задаче, такие способы почему-то не срабатывают.
Т.о. вариации на тему
-A PREROUTING -p tcp -d ххх.ххх.ххх.ххх --dport 2000 -j DNAT --to-destination 192.168.0.5:2000
не решили проблему.

Подскажите, плиз, как реализовать желаемое?


Содержание

Сообщения в этом обсуждении
"iptables:возможно ли сделать такое?"
Отправлено shadow_alone , 30-Янв-10 22:16 
первое что пришло в голову:
А является ли данный сервер шлюзом для данного компьютера?
А порт слушает точно tcp?

"iptables:возможно ли сделать такое?"
Отправлено shas , 30-Янв-10 22:37 
>первое что пришло в голову:
>А является ли данный сервер шлюзом для данного компьютера?
>А порт слушает точно tcp?

Может я неправильно понял первый вопрос, но
никаких других компьютеров, кроме сервера нет.
Просто пакет на сервер на 2000 порт приходит на внешний интерфейс,
а надо сделать, как будто он пришел на внутренний.

А порт точно tcp.


"iptables:возможно ли сделать такое?"
Отправлено shadow_alone , 30-Янв-10 22:43 
Все понял, не внимательно читал изначально

открыт ли 2000 порт извне?
включен ли форвардинг?

дайте вывод
iptables -L -n -v


и вывод
sysctl -a|grep net.ipv4.ip_forward


"iptables:возможно ли сделать такое?"
Отправлено shas , 30-Янв-10 23:12 
>[оверквотинг удален]
>
>открыт ли 2000 порт извне?
>включен ли форвардинг?
>
>дайте вывод
>iptables -L -n -v
>
>
>и вывод
>sysctl -a|grep net.ipv4.ip_forward

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
   54  5779 ACCEPT     0    --  lo     *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 ACCEPT     0    --  eth1   *       0.0.0.0/0            0.0.0.0/0
    6   384 ACCEPT     0    --  eth0   *       0.0.0.0/0            0.0.0.0/0
    0     0 DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     0    --  *      *       0.0.0.0/0            192.168.0.5
    0     0 ACCEPT     0    --  *      *       0.0.0.0/0            127.0.0.1
    0     0 ACCEPT     icmp --  *      eth0    192.168.0.0/24       0.0.0.0/0
    0     0 ACCEPT     icmp --  eth0   *       0.0.0.0/0            192.168.0.0/24
    0     0 ACCEPT     udp  --  eth0   *       192.168.0.0/24       0.0.0.0/0           multiport dports 53,1194
    0     0 ACCEPT     udp  --  *      eth0    0.0.0.0/0            192.168.0.0/24      multiport sports 53,1194
    0     0 ACCEPT     tcp  --  eth0   *       192.168.0.0/24       0.0.0.0/0           multiport dports 22,25,53,443,465,80,85,110
    0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            192.168.0.0/24      multiport sports 22,25,53,443,465,80,85,110
    0     0 DROP      !icmp --  eth0   *       192.168.0.0/24       0.0.0.0/0           state INVALID
    0     0 DROP      !icmp --  *      eth0    0.0.0.0/0            192.168.0.0/24      state INVALID

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

net.ipv4.ip_forward = 1


"iptables:возможно ли сделать такое?"
Отправлено shadow_alone , 30-Янв-10 23:28 
если я правильно понял, eth0 у вас наружка.
добавьте в цепочку forward, до последних 2-х DROP

-A FORWARD -p tcp -m tcp -i eth0 -d 192.168.0.0/24 --dport 2000 -j ACCEPT


"iptables:возможно ли сделать такое?"
Отправлено reader , 31-Янв-10 01:06 
>если я правильно понял, eth0 у вас наружка.
>добавьте в цепочку forward, до последних 2-х DROP
>
>-A FORWARD -p tcp -m tcp -i eth0 -d 192.168.0.0/24 --dport 2000
>-j ACCEPT

вроде внешний eth1 :)

а первое правило в FORWARD ?

скорей всего это нужно в INPUT, адрес у этой же машины, хоть и у другого интерфейса.

http://www.opennet.me/openforum/vsluhforumID1/86766.html


"iptables:возможно ли сделать такое?"
Отправлено shadow_alone , 31-Янв-10 01:12 
>[оверквотинг удален]
>>-j ACCEPT
>
>вроде внешний eth1 :)
>
>а первое правило в FORWARD ?
>
>скорей всего это нужно в INPUT, адрес у этой же машины, хоть
>и у другого интерфейса.
>
>http://www.opennet.me/openforum/vsluhforumID1/86766.html

input у вас открыт:
0     0 ACCEPT     0    --  eth1   *       0.0.0.0/0            0.0.0.0/0
6   384 ACCEPT     0    --  eth0   *       0.0.0.0/0            0.0.0.0/0

добавьте тогда это правило с параметром eth1

-A FORWARD -p tcp -m tcp -i eth1 -d 192.168.0.0/24 --dport 2000 -j ACCEPT
-A FORWARD -p tcp -m tcp -s 192.168.0.0/24 --sport 2000 -o eth1 -j ACCEPT

ну или расширьте ваши правила, добавив 2000 порт, так где tcp


"iptables:возможно ли сделать такое?"
Отправлено reader , 31-Янв-10 01:25 
>[оверквотинг удален]
>    0.0.0.0/0
>
>добавьте тогда это правило с параметром eth1
>
>-A FORWARD -p tcp -m tcp -i eth1 -d 192.168.0.0/24 --dport 2000
>-j ACCEPT
>-A FORWARD -p tcp -m tcp -s 192.168.0.0/24 --sport 2000 -o eth1
>-j ACCEPT
>
>ну или расширьте ваши правила, добавив 2000 порт, так где tcp

не я задал вопрос, так смотрю просто :)


"iptables:возможно ли сделать такое?"
Отправлено shadow_alone , 31-Янв-10 01:43 
блин, не обратил внимания.. не путай...

вообщем, эти правила на внешний интерфейс.

судя по правилам форвардинга, внешний eth0


"iptables:возможно ли сделать такое?"
Отправлено Pancher , 02-Фев-10 15:51 
>[оверквотинг удален]
>
>Chain OUTPUT (policy ACCEPT 221 packets, 28995 bytes)
> pkts bytes target     prot opt in  
>   out     source  
>          
> destination
>
>
>
>net.ipv4.ip_forward = 1

Поробуте разрешить tcp пакеты со статусом NEW.
Было, как то подобное, вот только не помню помогло или нет..


"iptables:возможно ли сделать такое?"
Отправлено shas , 31-Янв-10 09:44 
Спасибо за ответы, но не работает.
Для чистоты эксперимента поступил следующим образом.
Набросал следующую программу:

#!/usr/bin/perl -w
use strict;
use IO::Socket;
my $quit=0;
$SIG{INT}=sub {$quit=1};
my $listen_socket = IO::Socket::INET->new(LocalPort=>5000,
                                          Listen=>5,
                                          Proto=>'tcp',
                                          Reuse=>1,
                                          Timeout=>3600);
die "Error 1:$@" unless $listen_socket;
warn "Waiting for connection...\n";
my $count=0;
while(!$quit){
    next unless my $conn=$listen_socket->accept;
    $count++;
    warn "$count\n";
    $conn->close;
}
$listen_socket->close;
warn "Bye!\n"

Вообщем все просто:открыли сокет и слушаем порт 5000. Если что-то пришло - выводим $count.
Если в открытии сокета не указывать LocalAddr, то программа слушает все интерфейсы.
Можно проверить:
telnet 192.168.0.5 5000
telnet 127.0.0.1 5000
telnet xxx.xxx.xxx.xxx 5000
приводят к реакции программы (xxx.xxx.xxx.xxx-внешний IP-шник).

Теперь добавим в открытие сокета конкретный интерфейс:
my $listen_socket = IO::Socket::INET->new(LocalAddr=>'127.0.0.1',
                                          LocalPort=>5000,
                                          Listen=>5,
                                          Proto=>'tcp',
                                          Reuse=>1,
                                          Timeout=>3600);

Теперь к реакции программы приводит только
telnet 127.0.0.1 5000

Так вот вопрос, возможно ли с помощью iptables добиться ответа программы
теперь подключившись с других сетевых интерфейсов?


"iptables:возможно ли сделать такое?"
Отправлено reader , 31-Янв-10 14:36 
>[оверквотинг удален]
>                                          Listen=>5,
>                                          Proto=>'tcp',
>                                          Reuse=>1,
>                                          Timeout=>3600);
>
>Теперь к реакции программы приводит только
>telnet 127.0.0.1 5000
>
>Так вот вопрос, возможно ли с помощью iptables добиться ответа программы
>теперь подключившись с других сетевых интерфейсов?

сильно сомневаюсь, что на этот вопрос кто-то кроме разработчиков точно сможет ответитью :)
но можно экспериментировать, но для этого нужен инструмент который выловит хотя-бы один пакет после того как он пройдет через iptables.


"iptables:возможно ли сделать такое?"
Отправлено reader , 31-Янв-10 15:53 
а в целом наверно задачу можно решить с помощью VPN , если с iptables не получится.
во всяком случае с ssh подобное у меня было.

"iptables:возможно ли сделать такое?"
Отправлено shas , 31-Янв-10 16:37 
>а в целом наверно задачу можно решить с помощью VPN , если
>с iptables не получится.
>во всяком случае с ssh подобное у меня было.

Спасибо!
Я тоже так думаю, что VPN должен помочь.
Но и про iptables я тоже так думал до недавнего времени. :)


"iptables:возможно ли сделать такое?"
Отправлено reader , 01-Фев-10 21:23 
указал squid-у слушать на внешнем интерфейсе шлюза. в браузере внутри сети, адресом прокси, указал ip внутреннего интерфейса шлюза и на шлюзе соответственно сделал проброс с внутреннего на внешний. все замечательно отработало и как ожидал пакеты ходили через INPUT и OUTPUT , а не через FORWARD.

"iptables:возможно ли сделать такое?"
Отправлено shas , 05-Фев-10 19:56 
>указал squid-у слушать на внешнем интерфейсе шлюза. в браузере внутри сети, адресом
>прокси, указал ip внутреннего интерфейса шлюза и на шлюзе соответственно сделал
>проброс с внутреннего на внешний. все замечательно отработало и как ожидал
>пакеты ходили через INPUT и OUTPUT , а не через FORWARD.
>

С той программой, которую я привел в качестве теста, такой номер не пройдет.
По крайней мере, у меня не прошёл.



"iptables:возможно ли сделать такое?"
Отправлено po , 05-Фев-10 22:34 
повесить софтину на 0.0.0.0:2000 будет самым прямым решением задачи

"iptables:возможно ли сделать такое?"
Отправлено po , 05-Фев-10 22:36 
>повесить софтину на 0.0.0.0:2000 будет самым прямым решением задачи

а уже с помошью iptables можно ограничить соединения на эти порты