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 

.
. La connexion initiale sur le port 554/tcp s’effectue bien grâce aux règles spécifiques de ce port (elle est marquée ESTABLISHED), mais les connexions UDP consécutives n’arrivent toujours pas à se faire (elles n’apparaissent ni dans le retour de
. Pour le moment, j’ai dû opter pour un peu restrictif :
)