Вопрос простой. Можно ли до сих пор ставить ложный айпи в заголовках удп пакетов? Пропустит ли их провайдер? Мой провайдер - билайн Если кто-нибудь позволит с включенным wireshark попробовать это провернуть, то будет вообще замечательно
Первое что пришло в голову, поставить scapy и зарегать(если нет своего или не хочешь палить) бесплатный vds и запусти там netcat и долби свой vds любыми пакетами. send(IP(src="FAKE_IP", dst="127.0.0.1")/UDP(dport=123)/Raw(load="abc")) #Не тестил
источ: https://www.ibm.com/support/knowledgecenter/ru/ssw_ibm_i_71/rzaja/rzajal2tpprotocol.htm если речь про l2tp билайна проверки так каковой может и не быть, негде тестить(
Лучше называть это не фальсификацией, а IP-спуфингом или подменой IP-адреса, не когда не слышал чтоб это называли фальсификацией. На счет провайдера твоего не знаю, если нет NAT, то вполне вероятно, а с NAT - нет(точнее да, он скорее пропустит, но со своим IP, без спуфа). Сделал простую отправку UDP датаграммы чтоб прочекать у себя, можешь тоже проверить: Code: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <linux/ip.h> #include <linux/udp.h> #define PACKET_SIZE 8192 #define SOURCE_ADDR "1.2.3.4" #define SOURCE_PORT 12345 #define DST_ADDR "1.1.1.1" #define DST_PORT 12345 unsigned short csum(unsigned short *buf, int nwords) { unsigned long sum; for(sum=0; nwords>0; nwords--) { sum += *buf++; } sum = (sum >> 16) + (sum &0xffff); sum += (sum >> 16); return (unsigned short)(~sum); } int main(int argc, char *argv[]) { int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); assert(sock != -1); const int optval = 1; int ret = setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &optval, sizeof(optval)); assert(ret != -1); char packet[PACKET_SIZE] = { 0 }; struct iphdr *ip = (struct iphdr *)packet; struct udphdr *udp = (struct udphdr *)(packet + sizeof(*ip)); ip->ihl = 5; ip->version = 4; ip->tos = 16; ip->tot_len = sizeof(*ip) + sizeof(*udp); ip->id = htons(12345); ip->ttl = 64; ip->protocol = 17; ip->saddr = inet_addr(SOURCE_ADDR); ip->daddr = inet_addr(DST_ADDR); udp->source = htons(SOURCE_PORT); udp->dest = htons(DST_PORT); udp->len = htons(sizeof(*udp)); ip->check = csum((unsigned short *)packet, sizeof(*ip) + sizeof(*udp)); struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(DST_PORT); sin.sin_addr.s_addr = inet_addr(DST_ADDR); ret = sendto(sock, packet, ip->tot_len, 0, (struct sockaddr *)&sin, sizeof(sin)); assert(ret != -1); close(sock); printf("Datagram sent to %s:%d, from %s:%d", DST_ADDR, DST_PORT, SOURCE_ADDR, SOURCE_PORT); return EXIT_SUCCESS; }