Я пишу следующую программу (хотя я не думаю, что именно в этом проблема):
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int sock=socket(AF_INET, SOCK_STREAM, 0);
if( sock<0 ) {
perror("socket creation failed");
return 1;
}
int ip_transparent_enabled = 1;
if( setsockopt(sock, IPPROTO_IP, IP_TRANSPARENT, &ip_transparent_enabled, sizeof(ip_transparent_enabled))<0 ) {
perror("Setting IP_TRANSPARENT failed");
return 1;
}
struct sockaddr_in bind_addr = { AF_INET, htons(31337) };
inet_aton("93.184.216.34", &bind_addr.sin_addr); // example.com
if( bind(sock, (const struct sockaddr *)&bind_addr, sizeof(bind_addr))<0 ) {
perror("bind failed");
return 1;
}
struct sockaddr_in dest = { AF_INET, htons(7007) };
inet_aton("127.0.0.1", &dest.sin_addr);
if( connect(sock, (const struct sockaddr *)&dest, sizeof(dest))<0 ) {
perror("Connect failed");
return 1;
}
}
Порт 7007 работает на эхо-сервере, но это не важно, потому что программасоединение никогда не получает.
Когда я запускаю tcpdump, я вижу, что SYN отправляется с правильным (составленным) адресом источника, но SYN + ACK не выдается ни по loopback, ни по eth0:
$ sudo tcpdump -i any port 31337
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
22:22:41.475942 IP 93.184.216.34.31337 > localhost.afs3-bos: Flags [S], seq 2953286612, win 65495, options [mss 65495,sackOK,TS val 443673031 ecr 0,nop,wscale 7], length 0
22:22:42.478172 IP 93.184.216.34.31337 > localhost.afs3-bos: Flags [S], seq 2953286612, win 65495, options [mss 65495,sackOK,TS val 443674033 ecr 0,nop,wscale 7], length 0
22:22:44.494174 IP 93.184.216.34.31337 > localhost.afs3-bos: Flags [S], seq 2953286612, win 65495, options [mss 65495,sackOK,TS val 443676049 ecr 0,nop,wscale 7], length 0
22:22:48.590423 IP 93.184.216.34.31337 > localhost.afs3-bos: Flags [S], seq 2953286612, win 65495, options [mss 65495,sackOK,TS val 443680145 ecr 0,nop,wscale 7], length 0
Если я закомментирую bind
, то все работает как положено. Нет порта брандмауэра, который кажется релевантным, а * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 0 по обратной связи.
. Почему соединение не принято? Это ошибка в моем коде или эта конфигурация связана?