Невозможно получить доступ к потоку RTSP из гостевой системы KVM с использованием NAT — переадресация iptables

Невозможно получить доступ к потоку RTSP из гостевой системы KVM с использованием NAT — переадресация iptables

Как следует iptablesнастроить хост, чтобы разрешить rtsp://трафик от KVMгостя, инициировавшего соединение через NATсетевой интерфейс?

Похоже, это не простое сопоставление. Я не знаю, какой порт использует гость, когда открывает соединение с потоком rtsp. Это может быть случайным. Например, гость kvm может использовать порт 48000, когда он пытается подключиться к потоку rtsp, запущенному на порту 30110. В следующий раз, когда соединение будет установлено, это может быть совершенно другой порт, например 33844. Однако трафик, возвращающийся с порта rtsp 30110, похоже, не достигает 48000 на этом госте или на любом другом случайном порту, который он использует. Не уверен, где именно падает трафик.

Если мне нужно разрешить входящие соединения на определенный порт, я использую /etc/libvirt/hooks/qemubash с помощью чего-то вроде:

if [ "${1}" = "name" ]; then   # Update the following variables to fit your setup
    GUEST_IP=192.168.12.55
    GUEST_PORT=55555
    HOST_PORT=55555
    if [ "${2}" = "stopped" ] || [ "${2}" = "reconnect" ]; then
        /sbin/iptables -D FORWARD -o virbr0 -d  $GUEST_IP -j ACCEPT
        /sbin/iptables -t nat -D PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
    fi
    if [ "${2}" = "start" ] || [ "${2}" = "reconnect" ]; then
        /sbin/iptables -I FORWARD -o virbr0 -d  $GUEST_IP -j ACCEPT
        /sbin/iptables -t nat -I PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
    fi
fi

И это работает, но по какой-то причине я не могу найти способ разрешить гостевой системе kvm подключаться и получать данные из потока rtsp через NAT, несмотря на то, что трафик предположительно перенаправляется интерфейсом NAT для трафика, исходящего от гостя.

Кто-нибудь знает, что нужно сделать?

ffmpeg -i rtsp://{STREAM_URL} -acodec copy -vcodec copy temp.mp4
ffmpeg version 4.1.3-0york1~16.04 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 20160609
  configuration: --prefix=/usr --extra-version='0york1~16.04' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --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-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --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-opengl --enable-sdl2 --enable-nonfree --enable-libfdk-aac --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
[rtsp @ 0x557cc99ec240] UDP timeout, retrying with TCP
[rtsp @ 0x557cc99ec240] Could not find codec parameters for stream 0 (Video: h264, none, 1920x1080): unspecified pixel format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Guessed Channel Layout for Input Stream #0.1 : mono
Input #0, rtsp, from 'rtsp://{STREAM_URL}':
  Metadata:
    title           : 10
  Duration: N/A, bitrate: 64 kb/s
    Stream #0:0: Video: h264, none, 1920x1080, 90k tbr, 90k tbn, 180k tbc
    Stream #0:1: Audio: pcm_alaw, 8000 Hz, mono, s16, 64 kb/s
File 'temp.mp4' already exists. Overwrite ? [y/N] y
[mp4 @ 0x557cc9a00000] Could not find tag for codec pcm_alaw in stream #1, codec not currently supported in container
Could not write header for output file #0 (incorrect codec parameters ?): Invalid argument

Тот же URL-адрес RTSP прекрасно работает из VLC на моем домашнем компьютере.

Связанный контент