LINUX.ORG.RU
ФорумAdmin

Как сделать сквозное прокидывание портов

 , ,


0

2

Всем привет! Требуется сделать так, чтобы сервер выступал в качестве ретранслятора. То есть на него с одного клиента по одному порту льется трафик, а выдаваться он должен с этого сервера по другому порту, при этом сам сервер должен уметь время от времени перехватывать трафик. Сейчас конфигурация системы такая:

Вход:

Источник потока <--> Инет <--> роутер <--> сервер (192.168.1.10)

Выход:

Сервер (192.168.1.10) <--> роутер <--> Инет <--> Клиент

# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       udp  --  anywhere             anywhere             udp dpt:40001 to:192.168.1.10:40002

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       udp  --  anywhere             anywhere             udp spt:40002 to:0.0.0.0:40003

То есть предполагается, что по 40001 я принимаю поток, перенаправляю его локально в 40002, а потом из 40002 выкидываю напрямую в 40003.

Как сделать эту схему рабочей?

★★

Ответ на: комментарий от mos

эмм.. а уровнем ниже никак это не сделать? Это ж простое с виду перенаправление и особого смысла грузить проц тут я не вижу. Было б можно, я б вообще это на роутере делал, да он не позволяет.

aido ★★ ()

Я правильно понял задачу? Клиент должен соединиться с «Источник потока» при этом ip он будет указывать внешний ip роутера перед 192.168.1.10 который(роутер) зарулит его на 192.168.1.10 и 192.168.1.10 должен перекинуть его уже на ip «Источник потока» ?
Если все так, то пара ошибок, в DNAT надо указать --to-destination ip-Источник потока:порт-Источник потока а в SNAT --to-source 192.168.1.10:нужный-порт
И не забывайте что при варианте когда указали в SNAT порт, он будет в conntrack закэширован и если прервете соединение от клиента то может возникнуть ситуация что прийдется подождать или ручками таблицу очистить.

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

Не совсем. Пока что я не знаю IP источника, так как ему IP выдается по DHCP. Я понимаю, что это дикая дыра в безопасности (так как любой человек может мне кидать в этот порт все, что угодно и будет ддос на ровном месте), но залатаю чуть позже, когда расшарю наружу Источник потока. Если можно, то с примерами команд.

aido ★★ ()
iptables -A PREROUTING -t nat -i ${IFACE} -p udp --dport ${PORT} -j DNAT --to ${DST_IP}:${DST_PORT}

Оно?

при этом сам сервер должен уметь время от времени перехватывать трафик

iptables для этого не нужен

ssh ${ROUTER} tcpdump -i ${IFACE} -U -s0 -w - "not host ${YOU_IP}" | wireshark-gtk -k -i  -
Deleted ()
Ответ на: комментарий от Deleted

я делал вот так:

iptables -t nat -A PREROUTING -i eth0 -p udp -m udp --dport 40001 -j DNAT --to-destination 192.168.1.1:40002
Таблица счас такая:
iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       udp  --  anywhere             anywhere             udp dpt:40001 to:192.168.1.1:40002

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
роутер имеет стандартный адрес 192.168.1.1, поэтому я подумал, что на него стоит заворачивать этот трафик. Но не сработало=( Я вижу прямо с сервера, что пакеты приходят на 40001, но не перенаправляются наружу. Хочется снаружи подцепляться к серверу в такой схеме, скажем, при помощи vlc <external_router_IP>:<port> и смотреть видео. Не сработало.

aido ★★ ()
Последнее исправление: aido (всего исправлений: 1)
Ответ на: комментарий от aido

Пока что я не знаю IP источника, так как ему IP выдается по DHCP

А как к нему подсоединяетесь что-то типа ddns? В качестве костыля можно его-же прописать в правиле и по крону рестартовать, только опять не забыть про conntrack и все из-за одного порта.
Может задачу чуть полнее опишите, зачем вам исходящий порт привязанный?

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

Вообще, хотелось сделать недоскайп: чтобы через свой сервер весь видео-трафик шел. Высылается видео с первой машины при помощи ffmpeg (и доходит до сервера), но у меня не получается завернуть трафик наружу, чтобы смотреть на другой машине... Хотя бы по одному порту.

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

Все равно не понял. Ну есть видео сервак он висит допустим на 4001 порту (проброшенном на роутере) есть клиент который без разницы откуда туда соединяется, в чем проблема? Зачем промежуточные звенья в виде 192.168.1.10 и тем более замена порта клиента?
И

Вообще, хотелось сделать недоскайп

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

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

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

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

А я вас не могу понять :)
Источник потока <- Инет <- роутер <- сервер (192.168.1.10) <-роутер <- Инет <- Клиент
Так правильно?

anc ★★★★★ ()
Ответ на: комментарий от aido

Тогда все как я написал в самом начале, только исправьте правила SNAT и DNAT.
ЗЫ И вы так и не ответили зачем нужна замена порта клиента?

anc ★★★★★ ()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

А можно полную команду?

Ну или как более безопасная альтернатива iptables (чтобы не голый поток наружу направлять, а добавить какую-никакую аутентификацию) - можно ли как-то сделать socket-файл (в баше/питоне/пхп/перле/...), проассоциированный с конкретным портом? Чтобы другие приложения могли из него просто читать фреймы и выдавать их наружу. Я нашел только реализации на голом С, что несколько не устраивает.

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

А можно полную команду?

iptables -t nat -A PREROUTING -p udp --dport 40001 -j DNAT --to-destination $ip-Источник потока:порт-Источник потока
iptables -t nat -A POSTROUTING -p udp --dport порт-Источник потока -j SNAT --to-source 192.168.1.10:нужный-порт


Ну или как более безопасная альтернатива iptables (чтобы не голый поток наружу направлять, а добавить какую-никакую аутентификацию) - можно ли как-то сделать socket-файл (в баше/питоне/пхп/перле/...), проассоциированный с конкретным портом? Чтобы другие приложения могли из него просто читать фреймы и выдавать их наружу. Я нашел только реализации на голом С, что несколько не устраивает.

Толи вы чего-то не понимаете, то ли я вас не понимаю. Что вы подразумеваете под «аутентификацию»? Каким образом вы планируете это делать? Логин/пароль, сертификаты, просто ограничение по ip ?

anc ★★★★★ ()
Ответ на: комментарий от aido

Такого не может быть, не знаю куда, не знаю чего.... вобщем «на деревню дедушке» (с)
Про ip выше писал, если по имени обращаетесь(dns), то также описал как можно костыль сделать, а вот с портом это из фантастики, так не бывает.

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

Окей, вернемся к основам. Как посмотреть, откуда мне на сервер льется инфа по тому или иному порту, то есть информацию о клиенте? Опять же командой.

aido ★★ ()
Последнее исправление: aido (всего исправлений: 1)
Ответ на: комментарий от aido

Это выходит за рамки данной темы, слишком много нюансов.

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