LINUX.ORG.RU
ФорумAdmin

Внутреннее переназначение портов в iptables


0

2

Хочу сделать средствами iptables чтобы доступ к порту сервиса ssh был один, а внутри сети другой. Например: в локальной сети работал 22 порт, а снаружи прямого доступа к 22 порту не было, но при попытке коннекта на порт 888 происходил редирект на порт 22. Как только не пытался это выполнить, все ни как.

iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 888 -j REDIRECT --to-port 22

Правило которое выполняет редирект работает судя по логам, которые я отлавливал в цепочке INPUT. При обращении на порт 888 в логе видно что INPUT с внешнего:

Jul 10 17:33:25 SKY kernel: [766012.909884] IN=eth1 OUT= MAC=10:fe:ed:02:bb:5e:00:15:58:96:18:d8:08:00 SRC=111.111.111.111 DST=222.222.222.222 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=9421 DF PROTO=TCP SPT=4132 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0

Jul 10 17:33:28 SKY kernel: [766015.775166] IN=eth1 OUT= MAC=10:fe:ed:02:bb:5e:00:15:58:96:18:d8:08:00 SRC=111.111.111.111 DST=222.222.222.222 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=9437 DF PROTO=TCP SPT=4132 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0

Jul 10 17:33:34 SKY kernel: [766021.779704] IN=eth1 OUT= MAC=10:fe:ed:02:bb:5e:00:15:58:96:18:d8:08:00 SRC=111.111.111.111 DST=222.222.222.222 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=9473 DF PROTO=TCP SPT=4132 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0

OUTPUT с внешнего Jul 10 17:34:08 SKY kernel: [766056.013088] IN= OUT=eth1 SRC=222.222.222.222 DST=111.111.111.111 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=44935 DF PROTO=TCP SPT=22 DPT=4021 WINDOW=65535 RES=0x00 ACK URGP=0

Я так полагаю что обратного ответа нет. Как исправить? Не могу понять.

Еще вопрос касаемо соединения: создается соединение IP = XXX.XXX.XXX.111 SPT = 4484 ------> IP = XXX.XXX.XXX.222 DPT = 888. Внутри шлюза происходит изменение порта назначения: IP = XXX.XXX.XXX.222 SPT = 888 --(локально)--> IP = XXX.XXX.XXX.222 DPT = 22.

Клиент ожидает ответа на порт SPT = 4484, вопрос : важно ли с какого порта придет ответ например с 22 вместо 888 с которым установилось соединение.

Как правильно?

1) IP = XXX.XXX.XXX.222 SPT = 888 <------ IP = XXX.XXX.XXX.111 DPT = 4484.

2) IP = XXX.XXX.XXX.222 SPT = 22 <------ IP = XXX.XXX.XXX.111 DPT = 4484.



Последнее исправление: Kirlin (всего исправлений: 2)

Хочу сделать средствами iptables чтобы доступ к порту сервиса ssh был один, а внутри сети другой.

а почему средсва sshd не устраивают?

в /etc/ssh/sshd_config

ListenAddress 192.168.2.2:222

ListenAddress 192.168.3.3:333

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

Средствами iptables это реально сделать?

Kirlin
() автор топика

Больше света пролить на всё это поможет содержимое таблицы nf_conntrack: /proc/net/nf_conntrack

Я так подозреваю, что при использовании REDIRECT адрес назначения не переписывается, а заменяется только порт. У вас sshd на каком порту слушает? Если на 22-м порту на интерфейсе локальной сети, а вы REDIRECTите из глобальной, то, естественно, на соединение никто не отвечает, так как на $WAN_IP:22 никого нет.

Написанное выше - моё предположение, проверить негде, но кажется логичным. Для проверки можно заменить REDIRECT на DNAT с явным указанием хоста и порта назначения (естественно, надо разрешить и соотвествующий FORWARDинг).

undertaker ★★
()

Клиент ожидает ответа на порт SPT = 4484, вопрос : важно ли с какого порта придет ответ например с 22 вместо 888 с которым установилось соединение.

Естественно, при прохождении через netfilter ответного пакета в том же соединении редиректнутый порт будет заменён на исходный, иначе работать не будет (ситуацию вы, собственно, описали - отправка будет на один порт, а ответ с другого, на этом сетевой стек «подавится»). Вообще, стоит почитать про механизм определения состояний и conntrack в частности (например, тут: http://www.opennet.ru/docs/RUS/iptables/#STATEMACHINE)

undertaker ★★
()

iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 888 -j REDIRECT --to-port 22

Вот это правило, взятое отдельно, верное. Оно перенаправляет пакет на себя, меняя адрес назначения на адрес интерфейса на который пришел пакет. Проверил на чистой виртуалке — точно работает.

У тебя ssh точно на этом адресе слушает (как вариант на 0.0.0.0)? Ты наверно одновременно где-то фильтруешь и прямое обращение. Уверен, что не зацепил вместе с ним и редирект?

ival ★★
()
Последнее исправление: ival (всего исправлений: 1)

Клиент ожидает ответа на порт SPT = 4484, вопрос : важно ли с какого порта придет ответ например с 22 вместо 888 с которым установилось соединение.

Да. Конечно. Но специальных правил для этого прописывать не нужно. kernel об этом позаботится сам.

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