Был ли отправлен мой пакет, если я не вижу его в wireshark? - PullRequest
0 голосов
/ 15 апреля 2019

Моя задача - создать простой TCP-сканер, который использует необработанные сокеты.Я нашел веб-страницу, содержащую нужный мне код.Создание и запуск кода не проблема, кажется, все работает нормально.Когда я пытаюсь отследить посылку в Wireshark, ее там нет.Я просматриваю все интерфейсы, смотрю на любые, даже пробовал фильтровать результаты, но безрезультатно.Моя цель - отправить пакет из моего интерфейса без петель (147.229.206.115) на www.google.com (172.217.23.196) через порт 20, чтобы определить, открыт ли он, закрыт или отфильтрован.Код содержит пользовательский заголовок для ip, а также tcp, потому что мы должны установить вручную:

struct ipheader {
    unsigned char      iph_ihl:5, /* Little-endian */
                        iph_ver:4;
    unsigned char      iph_tos;
    unsigned short int iph_len;
    unsigned short int iph_ident;
    unsigned char      iph_flags;
    unsigned short int iph_offset;
    unsigned char      iph_ttl;
    unsigned char      iph_protocol;
    unsigned short int iph_chksum;
    unsigned int       iph_sourceip;
    unsigned int       iph_destip;
};

struct tcpheader {
unsigned short int   tcph_srcport;
unsigned short int   tcph_destport;
unsigned int             tcph_seqnum;
unsigned int             tcph_acknum;
unsigned char          tcph_reserved:4, tcph_offset:4;
unsigned int
   tcp_res1:4,      /*little-endian*/
   tcph_hlen:4,     /*length of tcp header in 32-bit words*/
   tcph_fin:1,      /*Finish flag "fin"*/
   tcph_syn:1,       /*Synchronize sequence numbers to start a connection*/
   tcph_rst:1,      /*Reset flag */
   tcph_psh:1,      /*Push, sends data to the application*/
   tcph_ack:1,      /*acknowledge*/
   tcph_urg:1,      /*urgent pointer*/
   tcph_res2:2;
unsigned short int   tcph_win;
unsigned short int   tcph_chksum;
unsigned short int   tcph_urgptr;
};

int raw_socket;

// creating the raw socket
raw_socket = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
if(raw_socket < 0){
    fprintf(stderr, "Failed to create the socket\n");
    exit(INTERNAL_ERROR);
}

// datagram to represent the packet
char datagram[4096];

// we need to map it so the datagram can represent it
struct ipheader* iph = (struct ipheader*) datagram;
struct tcpheader* tcph = (struct tcpheader*) datagram + sizeof(ipheader);
struct sockaddr_in sin;

// set the source parameters
sin.sin_family = AF_INET;
sin.sin_port = htons(order_num);    // destination port num
sin.sin_addr.s_addr = inet_addr("172.217.23.196");    // destination ip

// zero out the buffer
memset(datagram, 0, 4096);

// filling in the ip header
iph->iph_ihl = 5;
iph->iph_ver = 4;
iph->iph_tos = 0;
iph->iph_len = sizeof(struct ipheader) + sizeof(struct tcpheader);
iph->iph_ident = htonl(54321); // this dosn't matter
iph->iph_offset = 0;
iph->iph_ttl = 255;
iph->iph_protocol = 6;
iph->iph_chksum = 0;

// setting the source and destination
iph->iph_sourceip = inet_addr("147.229.206.115");
iph->iph_destip = sin.sin_addr.s_addr;

// setting the tcph header
tcph->tcph_srcport = htons(5678);
tcph->tcph_destport = htons(20);
tcph->tcph_seqnum = random();
tcph->tcph_acknum = 0;
tcph->tcph_res2 = 0;
tcph->tcph_offset = 0;
tcph->tcph_syn = TH_FIN;
tcph->tcph_win = htonl(65535);
tcph->tcph_chksum = 0;
tcph->tcph_urgptr = 0;

// calculate the checksum
iph->iph_chksum = 0;//csum((unsigned short *) datagram, iph->iph_len >> 1);

// we need to tell kernel that headers are included in the packet
int one = 1;
const int *val = &one;
if(setsockopt(raw_socket, IPPROTO_IP, IP_HDRINCL, val, sizeof(one)) < 0){
    fprintf(stderr, "Error setting IP_HDRINCL %d\n", errno);
    exit(INTERNAL_ERROR);
}


    // sending the packet
if(sendto(raw_socket, datagram, iph->iph_len, 0, (struct sockaddr *) &sin, sizeof(sin)) < 0){
    fprintf(stderr, "Error while sending %d\n", errno);
    exit(INTERNAL_ERROR);
 }

// close the raw socket
close(raw_socket);

Мой вопрос: как мне узнать, был ли послан пакет, если я не вижу его в Wireshark?Что я делаю не так?

...