@zh2s

Как корректно пробросить rtsp поток через iptables?

Исходный набор:
  • ip-camera (адрес в локальной сети 192.168.1.21)
  • raspberry pi (адрес в локальной сети 192.168.1.190, адрес в vpn сети 10.20.0.2)
  • VPS с настроенным wireguard
  • Малинка является wireguard-клиентом


Задача: сделать rtsp-поток ip-камеры доступным всем клиентам VPN.

Натыкался на похожий вопрос, попробовал взять решение из него. На малинке прописал:
sudo iptables -t nat -A POSTROUTING -d 192.168.1.21 -p tcp -m tcp --dport 554 -j SNAT --to-source 192.168.1.190

sudo iptables -t nat -A POSTROUTING -d 192.168.1.21 -p udp -m udp --dport 554 -j SNAT --to-source 192.168.1.190


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

Для теста использую утилиту ffmpeg. Вывод команды, запущенной на самой малинке
ffmpeg -i rtsp://user:pass@192.168.1.21:554/0
ffmpeg version 4.3.4-0+deb11u1+rpt3 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 10 (Debian 10.2.1-6)
  configuration: --prefix=/usr --extra-version=0+deb11u1+rpt3 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-mmal --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --enable-sand --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-pocketsphinx --enable-libdc1394 --enable-libdrm --enable-vout-drm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Guessed Channel Layout for Input Stream #0.1 : mono
Input #0, rtsp, from 'rtsp://admin:123456@192.168.1.21:554/0':
  Metadata:
    title           : HTMS
    comment         : 0
  Duration: N/A, start: 0.025125, bitrate: N/A
    Stream #0:0: Video: hevc (Main), yuv420p(tv), 704x576, 15 tbr, 90k tbn, 90k tbc
    Stream #0:1: Audio: pcm_mulaw, 8000 Hz, mono, s16, 64 kb/s
At least one output file must be specified


Все ок, с самой малинки до камеры могу достучаться

Теперь пробую подключиться к камере с другого компа в той же локальной сети (192.168.1.x). Утилита задумывается секунд на 15, после чего выплевывает следующее
$ ffmpeg -rtsp_transport tcp -i rtsp://user:pass@192.168.1.190:554/0
ffmpeg version 4.3.1-tessus  https://evermeet.cx/ffmpeg/  Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 11.0.0 (clang-1100.0.33.17)
  configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
[tcp @ 0x7fc391f04a80] Connection to tcp://192.168.1.190:554?timeout=0 failed: Operation timed out
rtsp://admin:123456@192.168.1.190:554/0: Operation timed out


Вывод команды iptables-save на малинке
# Generated by iptables-save v1.8.7 on Sat Aug 20 14:03:41 2022
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [287:17512]
:OUTPUT ACCEPT [0:0]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A INPUT -p tcp -m tcp --dport 554 -j ACCEPT
-A INPUT -p udp -m udp --dport 554 -j ACCEPT
-A FORWARD -d 192.168.1.21/32 -p tcp -m tcp --dport 554 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -d 192.168.1.21/32 -p udp -m udp --dport 554 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

COMMIT
# Completed on Sat Aug 20 14:03:41 2022
# Generated by iptables-save v1.8.7 on Sat Aug 20 14:03:41 2022
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -d 10.20.0.2/32 -p tcp -m tcp --dport 554 -j DNAT --to-destination 192.168.1.21:554
-A PREROUTING -d 192.168.1.190/32 -p tcp -m tcp --dport 554 -j DNAT --to-destination 192.168.1.21:554
-A PREROUTING -d 192.168.1.190/32 -p udp -m udp --dport 554 -j DNAT --to-destination 192.168.1.21:554
-A POSTROUTING -d 192.168.1.21/32 -p tcp -m tcp --dport 554 -j SNAT --to-source 192.168.1.190
-A POSTROUTING -d 192.168.1.21/32 -p udp -m udp --dport 554 -j SNAT --to-source 192.168.1.190
-A POSTROUTING -d 192.168.1.21/32 -p udp -m udp --dport 554 -j SNAT --to-source 192.168.1.190
COMMIT


Вывод команды nmap -Pn -sT 192.168.1.21 c малинки
Starting Nmap 7.80 ( https://nmap.org ) at 2022-08-20 14:06 MSK
Nmap scan report for 192.168.1.21
Host is up (0.00092s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
80/tcp   open  http
554/tcp  open  rtsp
8600/tcp open  asterix


Вывод команды nmap -Pn -sT 192.168.1.190 c другого компа в той же локальной сети
Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-20 14:06 MSK
Nmap scan report for 192.168.1.190
Host is up (0.15s latency).
Not shown: 990 closed tcp ports (conn-refused)
PORT     STATE    SERVICE
139/tcp  open     netbios-ssn
445/tcp  open     microsoft-ds
554/tcp  filtered rtsp
8000/tcp open     http-alt
8080/tcp open     http-proxy


Буду признателен за помощь!
  • Вопрос задан
  • 146 просмотров
Решения вопроса 1
@zh2s Автор вопроса
Крч, поставленную цель: сделать камеру доступной vpn-клиентам, удалось достичь. Судя по информации, на которую натыкался, rtsp использует 554 порт только для рукопожатия, после чего выбирается рандомный (тут могу ошибаться) udp порт, по которому гонится изображение. Следовательно, предугадать этот порт не предоставляется возможным.

Дальнейшие гугления привели к такой штуке как rtsp-simple-server. Эта штука умеет выступать в качестве proxy rtsp-стримов. Поднял ее на малинке, указал проксировать нужную камеру и на этом все. Теперь обращаюсь не к камере, а к малинке. А так как она находится в одной локальной сети с камерой, то все завелось сразу.

Скачал на телефон vlс-плеер, отключился от wi-fi, приконектился к vpn, ввел proxy-адрес, который указал в rtsp-simple-server, и поток пошел. Да, в таком решении приходится тратить некоторые ресурсы малинки на работу rtsp-simple-server, но в моем случае, ресурсы у малинки еще есть
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Zerg89
Может проблема в том что ffmpeg имеет разные версии на тестируемых средах
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы