Цитата:
Сообщение от Seoul
Seoul said:
↑
Вопрос простой. Можно ли до сих пор ставить ложный айпи в заголовках удп пакетов? Пропустит ли их провайдер?
Мой провайдер - билайн
Если кто-нибудь позволит с включенным wireshark попробовать это провернуть, то будет вообще замечательно
|
Лучше называть это не фальсификацией, а IP-спуфингом или подменой IP-адреса, не когда не слышал чтоб это называли фальсификацией.
На счет провайдера твоего не знаю, если нет NAT, то вполне вероятно, а с NAT - нет(точнее да, он скорее пропустит, но со своим IP, без спуфа).
Сделал простую отправку UDP датаграммы чтоб прочекать у себя, можешь тоже проверить:
Код:
Code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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;
}
|