Как включить поддержку connection tracking NAT RTSP
Wad1970
Пункты: 3734
Регистрация: 24.11.2014
Стоит Linux 3-10-17 PREEMPT RT
Для проброса видеопотока камеры с eth0 на ppp0
требуется включить поддержку connection tracking NAT RTSP?
Сотовая связь со статическим IP.
sasamy
Пункты: 83558
Регистрация: 14.08.2009
Цитата Стоит Linux 3-10-17 PREEMPT RT
Для проброса видеопотока камеры с eth0 на ppp0
я ничего не понял - откуда камера на eth0 - плата как роутер ? для проброса данных между интерфейсами для начала надо включить forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
Wad1970
Пункты: 3734
Регистрация: 24.11.2014
Камера подключена по Ethernet к интерфейсу eth0. К плате подключен сотовый модуль с интерфейсом ppp0 (статический IP). Задача: смотреть изображение камеры по rtsp через интернет.
Выполняем следующие действия:
Код sysctl -w net.ipv4.ip_forward=1
iptables -F
iptables -F -t nat
iptables -S
iptables -t nat -A PREROUTING -i ppp0 --dst $REAL_IP -p tcp -m tcp --dport 55451 -j DNAT --to-destination $IP_CAM:554
iptables -t nat -A POSTROUTING --dst $IP_CAM -p tcp --dport 554 -j SNAT --to-source $LOCAL_IP
iptables -t nat -A OUTPUT --dst $REAL_IP -p tcp --dport 55451 -j DNAT --to-destination $IP_CAM:554
Результат снифинга: протокол RTSP отрабатывает нормально, а пакеты RTP с изображением заворачиваются с ошибкой icmp "port unreachable".
sasamy
Пункты: 83558
Регистрация: 14.08.2009
Wad1970
Пункты: 3734
Регистрация: 24.11.2014
Wad1970
Пункты: 3734
Регистрация: 24.11.2014
Цитата
только в ядре такого модуля нет, в дистрибутивах собирают внешний модуль, вроде все берут отсюда
Собрали в QT:
/home/user/src/buildroot-2014.08-sk-3.10.17/package/rtsp-linux-master/nf_conntrack_rtsp.ko
/home/user/src/buildroot-2014.08-sk-3.10.17/package/rtsp-linux-master/nf_nat_rtsp.ko
А куда их теперь подсунуть?
sasamy
Пункты: 83558
Регистрация: 14.08.2009
1 Скачайте патч в корень buildroot
https://yadi.sk/d/zkjMljuHXcwSnQ
2 пропатчите
patch -p1 < ./buildroot-2014.08-sk-rtsp.patch
3 включите в конфиге ядра поддержку connection tracking
make linux-menuconfig
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) --->
Core Netfilter Configuration --->
<M> Netfilter connection tracking support
4 включите в сборку модуль для rtsp
make menuconfig
Target packages --->
Hardware handling --->
Freescale i.MX libraries --->
[*] rtsp-linux
5 соберите
make
модули будут в корневой системе где все другие модули ядра
/lib/modules/3.10.17/extra/
перед установкой правил iptables надо выполнить
modprobe nf_nat_rtsp
OMu4KA
Пункты: 1057
Регистрация: 12.11.2018
Цитата
Здравствуйте. Большое спасибо, все заработало!
Остался только один нюанс:
Если сделать проброс порта RTSP с внешнего 554 на внутренний 554, то все работает отлично. А с другим внешним портом (например, 8054 или 5541 или 55451) и внутренним 554 - служебный обмен RTCP идет, а поток данных RTP - отсутствует.
Обмен RTSP проходит все этапы, как положено:
<- OPTIONS
rtsp://REAL_IP:5541 RTSP/1.0
-> RTSP/1.0 200 OK
<- DESCRIBE
rtsp://REAL_IP:5541 RTSP/1.0
-> RTSP/1.0 200 OK
<- SETUP
rtsp://IP_CAM:554/TraficonVideo/video RTSP/1.0
-> RTSP/1.0 200 OK
<- PLAY
rtsp://IP_CAM:554/TraficonVideo/ RTSP/1.0
-> RTSP/1.0 200 OK
<- GET_PARAMETER
rtsp://IP_CAM:554/TraficonVideo/ RTSP/1.0
-> RTSP/1.0 200 OK
Далее по RTCP обмениваются обычными пакетами:
-> Sender Report (200)
<- Receiver Report (201)
А поток данных RTP - просто отсутствует.
И через несколько секунд соединение завершается пакетом:
<- TEARDOWN
rtsp://IP_CAM:554/TraficonVideo/ RTSP/1.0
Не подскажете, в чем проблема? У нас должно подключаться несколько камер к одной плате, так что использовать только один внешний порт (стандартный 554) не получится.
sasamy
Пункты: 83558
Регистрация: 14.08.2009
Цитата
Если сделать проброс порта RTSP с внешнего 554 на внутренний 554, то все работает отлично. А с другим внешним портом (например, 8054 или 5541 или 55451) и внутренним 554 - служебный обмен RTCP идет, а поток данных RTP - отсутствует.
для нестандартного порта надо наверно добавить привязку соединения к нужному conntrack helper-у, для стандартного порта это делается автоматом (в новых ядрах возможно уже и для стандартных надо привязывать). Что-то типа того
iptables -t nat -A PREROUTING -i ppp0 --dst $REAL_IP -p tcp -m tcp --dport 55451
-j CT --helper rtsp -j DNAT --to-destination $IP_CAM:554
PS Это кстати в параметре модуля при его загрузке можно указать
Цитата
* Module load syntax:
* insmod nf_conntrack_rtsp.o ports=port1,port2,...port<MAX_PORTS>
* max_outstanding=n setup_timeout=secs
*
* If no ports are specified, the default will be port 554.
https://github.com/maru-sama/rtsp-linux/blob/master/nf_conntrack_rtsp.c#L24
modprobe nf_nat_rtsp ports=554,8054,5541,55451
OMu4KA
Пункты: 1057
Регистрация: 12.11.2018
Цитата
для нестандартного порта надо наверно добавить привязку соединения к нужному conntrack helper-у, для стандартного порта это делается автоматом (в новых ядрах возможно уже и для стандартных надо привязывать). Что-то типа того
iptables -t nat -A PREROUTING -i ppp0 --dst $REAL_IP -p tcp -m tcp --dport 55451
-j CT --helper rtsp -j DNAT --to-destination $IP_CAM:554
PS Это кстати в параметре модуля при его загрузке можно указать
Цитата
* Module load syntax:
* insmod nf_conntrack_rtsp.o ports=port1,port2,...port<MAX_PORTS>
* max_outstanding=n setup_timeout=secs
*
* If no ports are specified, the default will be port 554.
modprobe nf_nat_rtsp ports=554,8054,5541,55451
Спасибо за ответ. Но что-то у нас не получается.
1. Добавили команду:
iptables -t raw -I PREROUTING -p tcp --dport 55451 -j CT --helper rtsp
Ошибка выполнения:
iptables: No chain/target/match by that name.
Добавляем "-j DNAT" - выдает ошибку "iptables v1.4.21: multiple -j flags not allowed"
Добавляем "--to-destination $IP_CAM:554" - ошибка "iptables v1.4.21: unknown option "--to-destination".
Чего-то не хватает в команде? или в ядре?
conntrack_helper включен:
# sysctl net.netfilter.nf_conntrack_helper
net.netfilter.nf_conntrack_helper = 1
2. Выполняем команды:
# modprobe nf_conntrack_rtsp ports=55451
# modprobe nf_nat_rtsp
Выполняется без ошибок, но потока по-прежнему нет. (команда "modprobe nf_nat_rtsp ports=55451" выдает ошибку "Invalid argument").