Как следует iptables
настроить хост, чтобы разрешить rtsp://
трафик от KVM
гостя, инициировавшего соединение через NAT
сетевой интерфейс?
Похоже, это не простое сопоставление. Я не знаю, какой порт использует гость, когда открывает соединение с потоком rtsp. Это может быть случайным. Например, гость kvm может использовать порт 48000, когда он пытается подключиться к потоку rtsp, запущенному на порту 30110. В следующий раз, когда соединение будет установлено, это может быть совершенно другой порт, например 33844. Однако трафик, возвращающийся с порта rtsp 30110, похоже, не достигает 48000 на этом госте или на любом другом случайном порту, который он использует. Не уверен, где именно падает трафик.
Если мне нужно разрешить входящие соединения на определенный порт, я использую /etc/libvirt/hooks/qemu
bash с помощью чего-то вроде:
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 на моем домашнем компьютере.