Войти

Показать полную графическую версию : iptables - создание туннеля (PortTunnel)


zelo
19-09-2007, 11:47
....така задача появилась:
на машине c адресом в сети 192.168.33.3 нужно все подключения на порт 334 тунеллировать на порт 333, так чтобы подключения на порт 333 приходили (создавались) с адресом источника 192.168.33.3
Знаю, под Вынь есть, реализующая всё это, программа - PortTunnel. Подскажите эт всё как под Линь учинить.
Делал так:
#iptables –A PREROUTING –t nat –p tcp –dport 334 -j REDIRECT –to-port 333 ...но входящие соединения на порт 333 шли с адресом источника, а не с адресом 192.168.33.3, вот!..
Ещё пробовал эдак:
#iptables –t nat –A PREROUTING –p tcp –d 192.168.33.3 –dport 334 -j NAT –to-destination 192.168.33.3:333 ...таж фигня..

Еже кто разумел проблему, то будте добры, растолкуйте что да как/куда..

....заранее спасиБо!..

Dm1try
19-09-2007, 14:18
Зачем это нужно, можно узнать?

zelo
19-09-2007, 14:37
....долго сказывать, но оч нужно, поверьте на слово

Dm1try
19-09-2007, 14:40
Тогда ответ - никак.
SNAT - по хорошему, делается только в цепочке OUTPUT.

alive_corpse
20-09-2007, 06:01
У меня как раз проблема подобного рода, но порт надо прокидывать из одной подсети (192.168.1.0/24) в другую (192.168.0.0/24).

Почитал вот это: http://www.opennet.ru/base/net/dnat_linux.txt.html
И решил написать простенький скриптик для удобства:
#!/bin/sh

#IP внутренней сети, передаётся первым параметром
INT_IP=$1

#IP внешней сети
EXT_IP="192.168.0.1"

INT_PORT=$2
EXT_PORT=$3

#интерфейс, который смотрит во внутреннюю подсеть
INT_IF="br0"

#Это может пригодиться потом
#EXT_IF="vlan1"

iptables -t nat -A PREROUTING -p tcp -d $EXT_IP --dport $EXT_PORT -j DNAT --to-destination $INT_IP:$INT_PORT
iptables -A FORWARD -i $INT_IF -d $INT_IP -p tcp --dport $INT_PORT -j ACCEPT

Теперь по идее, запустив этот скрипт с параметрами, скажем
./portout 192.168.1.4 80 80
мы должны обращаясь на 192.168.0.1:80 получить доступ на 80-й порт машины 192.168.1.4, но этого почему-то не происходит.

[admin@router scripts]$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

[admin@router scripts]$ iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
VSERVER all -- anywhere 192.168.0.1

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain VSERVER (1 references)
target prot opt source destination

[admin@router scripts]$ cat /etc/hosts | grep book
192.168.1.4 book

[admin@router scripts]$ ./portout.sh 192.168.1.4 80 80

[admin@router scripts]$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere book tcp dpt:www

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

[admin@router scripts]$ iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
VSERVER all -- anywhere 192.168.0.1
DNAT tcp -- anywhere 192.168.0.1 tcp dpt:www to:192.168.1.4:80

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain VSERVER (1 references)
target prot opt source destination

Подскажите пожалуйста, что же я делаю не так?

Dm1try
20-09-2007, 10:23
ИМХО, примерно вот так (при default политиках DROP):
iptables -A PREROUTING -t nat -p tcp -d $EXT_IP --dport $EXT_PORT -j DNAT --to-destination $INT_IP:$INT_PORT
iptables -A FORWARD -t filter -p all -i $EXT_IF -o $INT_IF -j ext-to-int
iptables -A FORWARD -t filter -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -N ext-to-int
iptables -A ext-to-int -p tcp -d $INT_IP --dport INT_PORT -j ACCEPT
iptables -A ext-to-int -p all -d $INT_IP -m state --state ESTABLISHED,RELATED -j ACCEPT


В Вашем случае, опять таки ИМХО, будет достаточно просто:
iptables -A PREROUTING -t nat -p tcp -d $EXT_IP --dport $EXT_PORT -j DNAT --to-destination $INT_IP:$INT_PORT

Далеше пакет пойдет в FORWARD и получит по умолчанию ACCEPT, далее в POSTROUTING - ACCEPT и т.д.

alive_corpse
21-09-2007, 11:30
Я знаю, форвард в дальнейшем будет DROP, поэтому скрипт пишется сразу так.

Я сглупил. Одну машину пересадил из одной подсети в другую, но пытался зайти на 192.168.0.1 с машины из 192.168.1.0/24, ибо с квм свитчем перепутал машины. Сорри, всё работает... :tomato2:

zelo
21-09-2007, 14:13
....на самом то деле нифига не решено :-)
....чо мне с PortTunnelle`м то делать? :-):-):-)

[mzd]
21-09-2007, 14:19
zelo, упс, прошу прощения :)

Dm1try
24-09-2007, 08:54
....на самом то деле нифига не решено :-)
....чо мне с PortTunnelle`м то делать? :-):-):-) »

Если Вы не опишете зачем это нужно - то вам никто и не ответит.

В общем случае - я уже сказал выше.

1Space
24-09-2007, 16:19
Что-то не совсем понял из поста :(

Есть в сети ПК1 с адресом 192.168.33.3, а также ПК2 с адресом ххх.ххх.ххх.ххх. ПК2 подключается к ПК1 к порту 334, и необходимо это соединение на ПК1 перевести на порт 333 и заменить адрес источника на 192.168.33.3, так ?
Тогда врядли получится подменить адрес источника. Потому что такая подмена делается в таблице nat в цепочке postrouting с помощью -j SNAT, в данном случае пакеты в эту цепочку не попадают.

P.S. Не ругайте сильно, если не то написал ;)




© OSzone.net 2001-2012