Réseau · Section 2
connect(2)
Initie une connexion sur une socket — poignée TCP, destination UDP, ou rendez-vous AF_UNIX.
Signature
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr * addr, socklen_t addrlen);- sockfd
- Descripteur socket (tout type supportant connect()).
- addr
- Pointeur vers une struct sockaddr_* décrivant la destination.
- addrlen
- Taille de la struct (sizeof(struct sockaddr_in) etc.).
Description
connect() initie une connexion sur la socket désignée par sockfd vers l'adresse addr. Pour SOCK_STREAM (TCP) cela déclenche la poignée à trois ; l'appel retourne 0 à l'établissement, ou -1/EINPROGRESS immédiatement sur socket non bloquante (résultat ultérieur via getsockopt(SO_ERROR) une fois la socket inscriptible). Pour SOCK_DGRAM, connect() ne génère pas de trafic — il mémorise l'adresse distante pour que les send()/recv() suivants (sans destination explicite) l'utilisent, et filtre les datagrammes entrants d'autres pairs. Pour AF_UNIX, connect() rendez-vous avec un pair à l'écoute sur le chemin indiqué. Les clients appellent généralement socket() → (bind optionnel pour fixer le port source) → connect() ; sauter bind laisse le noyau choisir un port source éphémère.
Numéros par architecture
| Architecture | Numéro | ABI | Point d'entrée |
|---|---|---|---|
| x86 (i386) | 362 | i386 | sys_connect |
| x64 (x86_64) | 42 | common | sys_connect |
| ARM64 (aarch64) | 203 | — | sys_connect |
Historique noyau
Introduit dans Linux 1.0.
1.0
connect() est présent dans Linux depuis 1.0 avec la sémantique BSD.
4.11
Le support TCP Fast Open client est arrivé ; avec l'option TCP_FASTOPEN_CONNECT, connect() peut porter des données applicatives dans le SYN, éliminant un RTT pour les connexions HTTPS vers un serveur ayant déjà fourni un cookie TFO.
seccomp & conteneurs
Docker default profile
Autorisé
Podman default profile
Autorisé
connect() est dans tous les profils par défaut. Le durcissement le plus utile se fait au niveau destination : BPF cgroup (BPF_CGROUP_INET4_CONNECT / INET6_CONNECT) peut refuser les connexions vers des IP / ports / ensembles précis — utilisé par Cilium et les NetworkPolicy Kubernetes pour appliquer des règles d'egress sans iptables. Le filtrage seccomp d'arguments sockaddr* est techniquement possible mais ardu car l'adresse est lue par le noyau en mémoire utilisateur ; le chemin BPF cgroup est plus propre.
libseccomp
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(connect), 0);Exemple strace
$ strace -e socket,connect curl -s https://example.com -o /dev/null
socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_TCP) = 5
connect(5, {sa_family=AF_INET6, sin6_port=htons(443), sin6_addr=…}, 28) = -1 EINPROGRESSstrace décode sockaddr complètement. EINPROGRESS est bénin sur socket non bloquante — chercher le poll/epoll_wait suivant pour le résultat réel. Un connect() qui retourne immédiatement ECONNREFUSED est la signature « hôte up, port fermé » ; un ETIMEDOUT après ~127 s est le motif filtré/perdu. Combiner avec -e network pour la conversation complète.
Sécurité & observabilité
connect() est la primitive canonique de l'exfiltration et des callouts C2. Le tracepoint eBPF sys_enter_connect avec sockaddr décodée est le bon point d'observation ; coupler à /proc/<pid>/exe pour attribuer. Les EDR conteneurs (règle Falco : 'Connexion sortante vers serveur C2') comparent l'IP de destination aux flux d'intel à ce hook. Un connect() AF_UNIX vers /var/run/docker.sock depuis un conteneur non-root est l'indicateur classique d'évasion via socket Docker. Les charges utiles reverse shell appellent typiquement socket(AF_INET) → connect() → dup2 vers stdin/stdout/stderr → execve('/bin/sh') — un connect vers une IP non-RFC1918 depuis une charge qui ne devrait parler qu'à ses sidecars est un signal fort.
Erreurs
- EACCES
- Règle iptables/nftables refusant la connexion sortante ; ou refus de permission sur chemin AF_UNIX.
- EADDRINUSE
- —
- EAFNOSUPPORT
- —
- EAGAIN
- —
- EALREADY
- Un précédent connect() non bloquant est toujours en cours.
- EBADF
- —
- ECONNREFUSED
- RST actif depuis la destination — TCP RST en réponse au SYN, ou ICMP port unreachable en UDP. L'hôte est up mais rien n'écoute (ou un pare-feu envoie des RST).
- EINPROGRESS
- Socket non bloquante et poignée en cours. Attendre POLLOUT puis vérifier SO_ERROR.
- EINTR
- —
- EISCONN
- Socket déjà connectée.
- ENETUNREACH
- Pas de route vers le réseau de destination. Problème de table de routage.
- ENOTSOCK
- —
- ETIMEDOUT
- Pas de réponse dans le timeout noyau (tcp_syn_retries — ~127 s par défaut). Hôte inaccessible ou filtré.