Bonsoir à tous !
J’ai besoin d’un peu d’aide pour comprendre des principes réseaux qui m’étaient jusqu’il y a peu étrangers. Je vais commencer par les questions générales, puis suivre avec les questions pratico-pratiques liées à ma situation.
Questions générales
Il m’a semblé comprendre certaines notions, de façon empirique, mais j’aimerais que vous me corrigiez :
Il existe pour les paquets réseau un état
RELATED
, lequel est supposé marquer les paquets qui “dérivent” d’une connexion établie sur un autre port. Cette “relation” entre les deux connexions est détectée par Netfilter grâce à ses modulesnf_conntrack_xxx
(par exemplenf_conntrack_ftp
). Si on définit une règle iptables qui autorise les paquetsRELATED
, on laissera donc passer ces paquets alors qu’ils ne transitent pas forcément à travers un port autorisé a priori.
Ma situation, concrètement
J’ai installé sur mon réseau local une caméra IP. Celle-ci émet un flux RTSP que je peux récupérer sur un poste local sans pare-feu. Mais si j’active mon pare-feu, configuré par iptables (dont je vous colle ci-dessous la configuration), je ne peux plus récupérer le flux RTSP.
# Generated by iptables-save v1.4.21 on Tue Jan 17 18:40:14 2017
*filter
:INPUT DROP [1663:177041]
:FORWARD DROP [0:0]
:OUTPUT DROP [4367:1432376]
:fail2ban-ssh - [0:0]
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -m limit --limit 1/sec --limit-burst 1 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5000 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 123 -j ACCEPT
-A fail2ban-ssh -j RETURN
-A fail2ban-ssh -j RETURN
-A fail2ban-ssh -j RETURN
COMMIT
# Completed on Tue Jan 17 18:40:14 2017
# Generated by iptables-save v1.4.21 on Tue Jan 17 18:40:14 2017
*nat
:PREROUTING ACCEPT [2668:232813]
:INPUT ACCEPT [535:32100]
:OUTPUT ACCEPT [8333:1635209]
:POSTROUTING ACCEPT [3966:202833]
COMMIT
# Completed on Tue Jan 17 18:40:14 2017
# Generated by iptables-save v1.4.21 on Tue Jan 17 18:40:14 2017
*mangle
:PREROUTING ACCEPT [279842:127319620]
:INPUT ACCEPT [279371:127295896]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [65701:60141537]
:POSTROUTING ACCEPT [61334:58709161]
COMMIT
# Completed on Tue Jan 17 18:40:14 2017
# Generated by iptables-save v1.4.21 on Tue Jan 17 18:40:14 2017
*raw
:PREROUTING ACCEPT [279844:127319724]
:OUTPUT ACCEPT [65703:60142041]
COMMIT
# Completed on Tue Jan 17 18:40:14 2017
Le port usuellement utilisé par le protocole RTSP est le 554/tcp, et un nmap
de ma caméra confirme que ce port est ouvert. J’ai donc essayé d’autoriser les paquets à transiter à travers ce port dans ma config iptables. Mais toujours impossible de lire le flux RTSP. J’ai donc lancé une capture avec Wireshark, pare-feu désactivé, pour voir ce qui pouvait coincer. Mon poste local est le 192.168.0.2
et la caméra 192.168.0.51
.
"No." "Time" "Source" "Destination" "Protocol" "Length" "Info"
"1" "0.000000000" "192.168.0.2" "192.168.0.51" "TCP" "74" "46454 > 554 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=722718 TSecr=0 WS=128"
"2" "0.012049439" "192.168.0.51" "192.168.0.2" "TCP" "74" "554 > 46454 [SYN ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=7570777 TSecr=722718 WS=4"
"3" "0.012097737" "192.168.0.2" "192.168.0.51" "TCP" "66" "46454 > 554 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=722721 TSecr=7570777"
"4" "0.012133566" "192.168.0.2" "192.168.0.51" "RTSP" "153" "OPTIONS rtsp://192.168.0.51:554/onvif1 RTSP/1.0"
"5" "0.014436721" "192.168.0.51" "192.168.0.2" "TCP" "66" "554 > 46454 [ACK] Seq=1 Ack=88 Win=14480 Len=0 TSval=7570777 TSecr=722721"
"6" "0.073933820" "192.168.0.51" "192.168.0.2" "RTSP" "194" "Reply: RTSP/1.0 200 OK"
"7" "0.073971295" "192.168.0.2" "192.168.0.51" "TCP" "66" "46454 > 554 [ACK] Seq=88 Ack=129 Win=30336 Len=0 TSval=722736 TSecr=7570783"
"8" "0.074150859" "192.168.0.2" "192.168.0.51" "RTSP" "179" "DESCRIBE rtsp://192.168.0.51:554/onvif1 RTSP/1.0"
"9" "0.087270287" "192.168.0.51" "192.168.0.2" "TCP" "66" "554 > 46454 [ACK] Seq=129 Ack=201 Win=14480 Len=0 TSval=7570784 TSecr=722736"
"10" "0.089841514" "192.168.0.51" "192.168.0.2" "RTSP/SDP" "567" "Reply: RTSP/1.0 200 OK"
"11" "0.090347221" "192.168.0.2" "192.168.0.51" "RTSP" "214" "SETUP rtsp://192.168.0.51:554/onvif1/track1 RTSP/1.0"
"12" "0.103503863" "192.168.0.51" "192.168.0.2" "RTSP" "242" "Reply: RTSP/1.0 200 OK"
"13" "0.103920655" "192.168.0.2" "192.168.0.51" "RTSP" "233" "SETUP rtsp://192.168.0.51:554/onvif1/track2 RTSP/1.0"
"14" "0.124692047" "192.168.0.51" "192.168.0.2" "RTSP" "242" "Reply: RTSP/1.0 200 OK"
"15" "0.124991140" "192.168.0.2" "192.168.0.51" "RTP" "54" "PT=ITU-T G.711 PCMU SSRC=0x0 Seq=0 Time=0"
"16" "0.125009341" "192.168.0.2" "192.168.0.51" "RTCP" "50" "Receiver Report "
"17" "0.125020845" "192.168.0.2" "192.168.0.51" "RTP" "54" "PT=ITU-T G.711 PCMU SSRC=0x0 Seq=0 Time=0"
"18" "0.125031775" "192.168.0.2" "192.168.0.51" "RTCP" "50" "Receiver Report "
"19" "0.125048231" "192.168.0.2" "192.168.0.51" "RTSP" "188" "PLAY rtsp://192.168.0.51:554/onvif1 RTSP/1.0"
"20" "0.133527265" "192.168.0.51" "192.168.0.2" "ICMP" "78" "Destination unreachable (Port unreachable)"
"21" "0.133907151" "192.168.0.51" "192.168.0.2" "ICMP" "78" "Destination unreachable (Port unreachable)"
"22" "0.135242646" "192.168.0.51" "192.168.0.2" "RTSP" "279" "Reply: RTSP/1.0 200 OK"
"23" "0.147237839" "192.168.0.51" "192.168.0.2" "RTP" "802" "PT=DynamicRTP-Type-96 SSRC=0x3BCEF335 Seq=39921 Time=2545750094 Mark"
"24" "0.179073285" "192.168.0.2" "192.168.0.51" "TCP" "66" "46454 > 554 [ACK] Seq=638 Ack=1195 Win=34560 Len=0 TSval=722763 TSecr=7570789"
"25" "0.213560552" "192.168.0.51" "192.168.0.2" "RTP" "214" "PT=ITU-T G.711 PCMA SSRC=0x3BCEF335 Seq=1791 Time=608063688"
"26" "0.213919431" "192.168.0.51" "192.168.0.2" "RTP" "214" "PT=ITU-T G.711 PCMA SSRC=0x3BCEF335 Seq=1792 Time=608063808"
"27" "0.214541761" "192.168.0.51" "192.168.0.2" "RTP" "214" "PT=ITU-T G.711 PCMA SSRC=0x3BCEF335 Seq=1793 Time=608064008"
"28" "0.215312372" "192.168.0.51" "192.168.0.2" "RTP" "214" "PT=ITU-T G.711 PCMA SSRC=0x3BCEF335 Seq=1794 Time=608064128"
[...]
De 1 à 14, c’est bien le 554/tcp de 192.168.0.51
qui est utilisé pour échanger. En revanche, après ça se met à discuter sur quatre ports UDP différents choisis aléatoirement (j’ai fait trois captures pour vérifier).
D’où ma question : ai-je raison de penser que la connexion ne peut pas se faire à travers mon pare-feu, parce que même si la négociation initiale se fait à travers 554/tcp, la suite se fait à travers d’autres ports qui sont interdits par ma config iptables, le tout en l’absence de module nf_conntrack_rtsp
?
Merci de m’avoir lu