Показать полную графическую версию : iptables - создание туннеля (PortTunnel)
....така задача появилась:
на машине 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 ...таж фигня..
Еже кто разумел проблему, то будте добры, растолкуйте что да как/куда..
....заранее спасиБо!..
Зачем это нужно, можно узнать?
....долго сказывать, но оч нужно, поверьте на слово
Тогда ответ - никак.
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
Подскажите пожалуйста, что же я делаю не так?
ИМХО, примерно вот так (при 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:
....на самом то деле нифига не решено :-)
....чо мне с PortTunnelle`м то делать? :-):-):-)
zelo, упс, прошу прощения :)
....на самом то деле нифига не решено :-)
....чо мне с PortTunnelle`м то делать? :-):-):-) »
Если Вы не опишете зачем это нужно - то вам никто и не ответит.
В общем случае - я уже сказал выше.
Что-то не совсем понял из поста :(
Есть в сети ПК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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.