Переадресация портов для IP-камеры (HTTP, RTSP) без изменения маршрутов

Я установил две IP-камеры Dahua IPC-C15 во внутренней сети и хочу сделать их доступными через VPN.

Локальная сеть настроена следующим образом:

  • GW по умолчанию: 192.168.1.1
  • vpn-подключенная машина: 192.168.1.31
  • IP-камера: 192.168.1.4{0,1}
  • динамическая подсеть (другие машины): 192.168.1.50-90

Я по умолчанию разделяю GW и машину, подключенную к vpn, и хотел бы не смешивать их (по умолчанию GW - стандартный ADSL-маршрутизатор, vpn-клиент немного ненадежен с аппаратной точки зрения).

Я рассмотрел следующий план для выставления камер через VPN:

  1. Выделение уникальных портов для всех служб на камерах
  2. Переадресация определенных портов на компьютере, подключенном к VPN
  3. Доступ к сервисам через VPN на компьютере, подключенном к VPN

Диаграмма ниже должна сделать это очистить

[cam-0]
(1080, 5664)    \
                  --> [vpn-client]             --> (VPN)
[cam-1]              (forwards 1080, 1081)
(1081, 5665)    /    (         5664, 5665)

Камеры прекрасно работают с измененными портами, поэтому я попытался сделать их доступными через переадресацию портов. Я переправил все необходимые порты для cam-0 (был немного переусердствовал даже)

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 1080 -j DNAT --to-destination 192.168.1.40:1080
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 1554 -j DNAT --to-destination 192.168.1.40:1554
iptables -t nat -A PREROUTING -p udp -i eth0 --dport 1554 -j DNAT --to-destination 192.168.1.40:1554
iptables -t nat -A PREROUTING -p udp -i eth0 --dport 37777 -j DNAT --to-destination 192.168.1.40:37777
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 37777 -j DNAT --to-destination 192.168.1.40:37777
iptables -t nat -A PREROUTING -p udp -i eth0 --dport 37778 -j DNAT --to-destination 192.168.1.40:37778
iptables -A FORWARD -p udp -d 192.168.1.40 --dport 37778 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.40 --dport 37777 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.40 --dport 1080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.40 --dport 1554 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A POSTROUTING -j MASQUERADE

Конечным результатом является то, что HTTP-доступ работает просто отлично, а воспроизведение RTSP - нет. Я не осмелился попробовать ONVIF discovery, возможно, это беспорядок.

Ошибки RTSP с ffplay приведены ниже

$ ffplay -hide_banner 'rtsp://$USER:$PASS@192.168.1.31:1554'
[rtsp @ 0x7fa124000b80] UDP timeout, retrying with TCP   0B f=0/0   
[rtsp @ 0x7fa124000b80] method PAUSE failed: 455 Method Not Valid in This State
[rtsp @ 0x7fa124000b80] Could not find codec parameters for stream 0 (Video: h264, none): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, rtsp, from 'rtsp://admin:50076929dhA!@192.168.1.31:1554':
  Metadata:
    title           : Media Server
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264, none, 90k tbr, 90k tbn, 180k tbc
    Stream #0:1: Audio: aac, 16000 Hz, mono, fltp
[rtsp @ 0x7fa124000b80] UDP timeout, retrying with TCP   0B f=0/0   
[rtsp @ 0x7fa124000b80] method PAUSE failed: 455 Method Not Valid in This State

Если я посмотрю на статистику iptables на машине, выполняющей пересылку, то пакеты, кажется, передаются:

# iptables -L -vn

Chain INPUT (policy ACCEPT 9827 packets, 6479K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 196 packets, 17202 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1620  183K ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.40         tcp dpt:1080 state NEW,RELATED,ESTABLISHED
  107 21217 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.40         tcp dpt:1554 state NEW,RELATED,ESTABLISHED
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.1.40         udp dpt:1554 state NEW,RELATED,ESTABLISHED
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.1.40         udp dpt:37778 state NEW,RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.40         tcp dpt:37777 state NEW,RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT 857 packets, 96412 bytes)
 pkts bytes target     prot opt in     out     source               destination

# iptables -t nat -L -vn
Chain PREROUTING (policy ACCEPT 233 packets, 45610 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  128  7680 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1080 to:192.168.1.40:1080
    7   420 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1554 to:192.168.1.40:1554
    0     0 DNAT       udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            udp dpt:1554 to:192.168.1.40:1554
    0     0 DNAT       udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            udp dpt:37777 to:192.168.1.40:37777
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:37777 to:192.168.1.40:37777
    0     0 DNAT       udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            udp dpt:37778 to:192.168.1.40:37778

Chain INPUT (policy ACCEPT 233 packets, 45610 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 246 packets, 23141 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  455 38579 MASQUERADE  all  --  *      *       0.0.0.0/0            0.0.0.0/0

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

1 ответ

Решение

Очевидно, что правила пересылки работают, я просто должен был попросить ffmpeg использовать tcp, используя ffplay -rtsp_transport tcp,

Кроме того, приложение Android, которое я использую (Ovnifer), удовлетворено только переадресацией портов HTTP и RSTP, поэтому я называю это готовым.

Другие вопросы по тегам