Hi!Сделал попытки реализовать следующее и закрались смутные сомнения:"А возможно ли оно?".
Задача вроде бы банальная.
Есть сервер с внешним (ххх.ххх.ххх.ххх) и внутренним (192.168.0.5) адресами.
На этом сервере запущена некая программа, которая слушает только на внутреннем интерфейсе
порт 2000.
Надо, подключившись с внешнего интерфейса, попасть на внутренний на порт 2000.
Из вне пробросить соединение на компьютер во внутренней сети не составляет проблемы.
Но в описанной выше задаче, такие способы почему-то не срабатывают.
Т.о. вариации на тему
-A PREROUTING -p tcp -d ххх.ххх.ххх.ххх --dport 2000 -j DNAT --to-destination 192.168.0.5:2000
не решили проблему.Подскажите, плиз, как реализовать желаемое?
первое что пришло в голову:
А является ли данный сервер шлюзом для данного компьютера?
А порт слушает точно tcp?
>первое что пришло в голову:
>А является ли данный сервер шлюзом для данного компьютера?
>А порт слушает точно tcp?Может я неправильно понял первый вопрос, но
никаких других компьютеров, кроме сервера нет.
Просто пакет на сервер на 2000 порт приходит на внешний интерфейс,
а надо сделать, как будто он пришел на внутренний.А порт точно tcp.
Все понял, не внимательно читал изначальнооткрыт ли 2000 порт извне?
включен ли форвардинг?дайте вывод
iptables -L -n -v
и вывод
sysctl -a|grep net.ipv4.ip_forward
>[оверквотинг удален]
>
>открыт ли 2000 порт извне?
>включен ли форвардинг?
>
>дайте вывод
>iptables -L -n -v
>
>
>и вывод
>sysctl -a|grep net.ipv4.ip_forwardChain 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/0Chain 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 INVALIDChain OUTPUT (policy ACCEPT 221 packets, 28995 bytes)
pkts bytes target prot opt in out source destinationnet.ipv4.ip_forward = 1
если я правильно понял, eth0 у вас наружка.
добавьте в цепочку forward, до последних 2-х DROP-A FORWARD -p tcp -m tcp -i eth0 -d 192.168.0.0/24 --dport 2000 -j ACCEPT
>если я правильно понял, 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, адрес у этой же машины, хоть и у другого интерфейса.
>[оверквотинг удален]
>>-j ACCEPT
>
>вроде внешний eth1 :)
>
>а первое правило в FORWARD ?
>
>скорей всего это нужно в INPUT, адрес у этой же машины, хоть
>и у другого интерфейса.
>
>http://www.opennet.me/openforum/vsluhforumID1/86766.htmlinput у вас открыт:
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
>[оверквотинг удален]
> 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не я задал вопрос, так смотрю просто :)
блин, не обратил внимания.. не путай...вообщем, эти правила на внешний интерфейс.
судя по правилам форвардинга, внешний eth0
>[оверквотинг удален]
>
>Chain OUTPUT (policy ACCEPT 221 packets, 28995 bytes)
> pkts bytes target prot opt in
> out source
>
> destination
>
>
>
>net.ipv4.ip_forward = 1Поробуте разрешить tcp пакеты со статусом NEW.
Было, как то подобное, вот только не помню помогло или нет..
Спасибо за ответы, но не работает.
Для чистоты эксперимента поступил следующим образом.
Набросал следующую программу:#!/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 добиться ответа программы
теперь подключившись с других сетевых интерфейсов?
>[оверквотинг удален]
> Listen=>5,
> Proto=>'tcp',
> Reuse=>1,
> Timeout=>3600);
>
>Теперь к реакции программы приводит только
>telnet 127.0.0.1 5000
>
>Так вот вопрос, возможно ли с помощью iptables добиться ответа программы
>теперь подключившись с других сетевых интерфейсов?сильно сомневаюсь, что на этот вопрос кто-то кроме разработчиков точно сможет ответитью :)
но можно экспериментировать, но для этого нужен инструмент который выловит хотя-бы один пакет после того как он пройдет через iptables.
а в целом наверно задачу можно решить с помощью VPN , если с iptables не получится.
во всяком случае с ssh подобное у меня было.
>а в целом наверно задачу можно решить с помощью VPN , если
>с iptables не получится.
>во всяком случае с ssh подобное у меня было.Спасибо!
Я тоже так думаю, что VPN должен помочь.
Но и про iptables я тоже так думал до недавнего времени. :)
указал squid-у слушать на внешнем интерфейсе шлюза. в браузере внутри сети, адресом прокси, указал ip внутреннего интерфейса шлюза и на шлюзе соответственно сделал проброс с внутреннего на внешний. все замечательно отработало и как ожидал пакеты ходили через INPUT и OUTPUT , а не через FORWARD.
>указал squid-у слушать на внешнем интерфейсе шлюза. в браузере внутри сети, адресом
>прокси, указал ip внутреннего интерфейса шлюза и на шлюзе соответственно сделал
>проброс с внутреннего на внешний. все замечательно отработало и как ожидал
>пакеты ходили через INPUT и OUTPUT , а не через FORWARD.
>С той программой, которую я привел в качестве теста, такой номер не пройдет.
По крайней мере, у меня не прошёл.
повесить софтину на 0.0.0.0:2000 будет самым прямым решением задачи
>повесить софтину на 0.0.0.0:2000 будет самым прямым решением задачиа уже с помошью iptables можно ограничить соединения на эти порты