ΠΠΈΡΡΠΈΠ½Π³ 29.15. Π€ΡΠ½ΠΊΡΠΈΡ open_output, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ libnet
//udpcksum/senddnsquery-libnet.c
7 static libnet_t *l; /* Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ libnet */
8 void
9 open_output(void)
10 {
11 char errbuf[LIBNET_ERRBUF_SIZE];
12 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ libnet Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΌ ΡΠΎΠΊΠ΅ΡΠΎΠΌ IPv4 */
13 l = libnet_init(LIBNET_RAW4, NULL, errbuf);
14 if (l == NULL) {
15 err_quit("Can't initialize libnet: %s", errbuf);
16 }
17 }
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° libnet7 Π Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ libnet ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π΅ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΠΉ ΡΠΈΠΏ libnet_t. Π€ΡΠ½ΠΊΡΠΈΡ libnet_init Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠΎΡ ΡΠΈΠΏ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ libnet Π΄Π»Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ ΡΠΎΠΊΠ΅ΡΡ. Π ΡΡΠΎΠΌ ΡΠΌΡΡΠ»Π΅ Π΄Π°Π½Π½ΡΠΉ ΡΠΈΠΏ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°ΠΌ ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ² pcap.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ libnet12-16 ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ libnet_init, Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Ρ ΠΎΡΠΊΡΡΡΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° IPv4. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° LIBNET_RAW4. Π ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ΅ΠΊΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ΅ errbuf, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΡΠ²Π°Π΅ΠΌ.
Π€ΡΠ½ΠΊΡΠΈΡ send_dns_query Π΄Π»Ρ libnet ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.16. Π‘ΡΠ°Π²Π½ΠΈΡΠ΅ Π΅Π΅ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ send_dns_query ΠΈ udp_write Π΄Π»Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ².
ΠΠΈΡΡΠΈΠ½Π³ 29.16. Π€ΡΠ½ΠΊΡΠΈΡ send_dns_query, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ libnet
//udpcksum/senddnsquery-libnet.c
18 void
19 send_dns_query(void)
20 {
21 char qbuf[24], *ptr;
22 u_int16_t one;
23 int packet_size = LIBNET_UDP_H + LIBNET_DNSV4_H + 24;
24 static libnet_ptag_t ip_tag, udp_tag, dns_tag;
25 /* ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠ° Π²Π½ΡΡΡΠΈ UDP-ΠΏΠ°ΠΊΠ΅ΡΠ° */
26 ptr = qbuf;
27 memcpy(ptr, "\001a\014root-servers\003net\000", 20);
28 ptr += 20;
29 one = htons(1);
30 memcpy(ptr, &one, 2); /* ΡΠΈΠΏ Π·Π°ΠΏΡΠΎΡΠ° = A */
31 ptr += 2;
32 memcpy(ptr, &one, 2); /* ΠΊΠ»Π°ΡΡ Π·Π°ΠΏΡΠΎΡΠ° = 1 (IP-Π°Π΄ΡΠ΅Ρ) */
33 /* ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ° DNS */
34 dns_tag = libnet_build_dnsv4(
35 1234 /* ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ */,
36 0x0100 /* ΡΠ»Π°Π³ΠΈ: ΡΠ΅ΠΊΡΡΡΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π° */,
37 1 /* ΠΊΠΎΠ»-Π²ΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ² */, 0 /* ΠΊΠΎΠ»-Π²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² ΠΎΡΠ²Π΅ΡΠ΅ */,
38 0 /* ΠΊΠΎΠ»-Π²ΠΎ Π°Π²ΡΠΎΡΠΈΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ */, 0 /* ΠΊΠΎΠ»-Π²ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ */,
39 qbuf /* Π·Π°ΠΏΡΠΎΡ */,
40 24 /* Π΄Π»ΠΈΠ½Π° Π·Π°ΠΏΡΠΎΡΠ° */, 1, dns_tag);
41 /* ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° UDP */
42 udp_tag = libnet_build_udp(
43 ((struct sockaddr_in*)local)->
44 sin_port /* ΠΏΠΎΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ */,
45 ((struct sockaddr_in*)dest)->
46 sin_port /* ΠΏΠΎΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ */,
47 packet_size /* Π΄Π»ΠΈΠ½Π° */, 0 /* ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ ΡΡΠΌΠΌΠ° */,
48 NULL /* ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ */, 0 /* Π΄Π»ΠΈΠ½Π° ΠΏΠΎΠ»Π΅Π·Π½. Π΄Π°Π½Π½ΡΡ */, l, udp_tag);
49 /* Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΡ. ΡΡΠΌΠΌΡ ΡΠ°Π²Π½ΠΎΠΉ Π½ΡΠ»Ρ, libnet Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ */
50 /* ΡΠ°ΡΡΡΠΈΡΠ°Π΅Ρ ΠΊΠΎΠ½ΡΡ. ΡΡΠΌΠΌΡ UDP. ΠΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ. */
51 if (zerosum)
52 if (libnet_toggle_checksum(l, udp_tag, LIBNET_OFF) < 0)
53 err_quit("turning off checksums: %s\n", libnet_geterror(l));
54 /* ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ IP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° */
55 ip_tag = libnet_build_ipv4(packet_size + LIBNET_IPV4_H /* Π΄Π»ΠΈΠ½Π° */,
56 0 /* tos */, 0 /* IP ID */, 0 /* ΡΡΠ°Π³ΠΌΠ΅Π½Ρ*/,
57 TTL_OUT /* ttl */, IPPROTO_UDP /* ΠΏΡΠΎΡΠΎΠΊΠΎΠ» */,
58 0 /* ΠΊΠΎΠ½ΡΡ. ΡΡΠΌΠΌΠ° */,
59 ((struct sockaddr_in*)local)->sin_addr.s_addr /* ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ */,
60 ((struct sockaddr_in*)dest)->sin_addr.s_addr /* ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ */,
61 NULL /* ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ */, 0 /* Π΄Π»ΠΈΠ½Π° ΠΏΠΎΠ»Π΅Π·Π½. Π΄Π°Π½Π½ΡΡ */, l, ip_tag);
62 if (libnet_write(l) < 0) {
63 err_quit("libnet_write: %s\n", libnet_geterror(l));
64 }
65 if (verbose)
66 printf("sent: %d bytes of data\n", packet_size);
67 }
Π€ΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠ° DNS25-32 ΠΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° DNS, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² ΡΡΡΠΎΠΊΠ°Ρ 25β30 Π»ΠΈΡΡΠΈΠ½Π³Π° 29.8.
34-40 ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ libnet_build_dnsv4, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΠΎΠ»Ρ ΠΏΠ°ΠΊΠ΅ΡΠ° DNS Π² Π²ΠΈΠ΄Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠ°ΠΌ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π·Π½Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π·Π°ΠΏΡΠΎΡΠ°, Π° ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ° DNS Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ.
ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° UDP ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ UDP42-48 ΠΡ ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ UDP, Π²ΡΠ·ΡΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ libnet_build_udp. ΠΠΎΠ»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° UDP ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΡΠ°ΠΊΠΆΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ ΡΠ°Π²Π½ΠΎ 0, libnet Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΌΠΌΡ.
49-52 ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°ΠΏΡΠ΅ΡΠΈΠ» Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ libnet ΡΠ²Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
ΠΠ°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IP53-65 ΠΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IPv4 Π²ΡΠ·ΠΎΠ²ΠΎΠΌ libnet_build_ipv4.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° libnet Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»Π΅ ip_len Π² Π½ΡΠΆΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π±Π°ΠΉΡΠΎΠ². ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ.
ΠΡΠΏΡΠ°Π²ΠΊΠ° UDP-Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ66-70 ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ libnet_write Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Π² ΡΠ΅ΡΡ.
Π€ΡΠ½ΠΊΡΠΈΡ send_dns_query, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ libnet, ΡΠΎΡΡΠΎΠΈΡ Π²ΡΠ΅Π³ΠΎ ΠΈΠ· 67 ΡΡΡΠΎΠΊ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² Π²Π΅ΡΡΠΈΠΈ, ΡΠ°Π±ΠΎΡΠ°Π²ΡΠ΅ΠΉ Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΌΠΈ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ, ΠΎΠ±ΡΠ°Ρ Π΄Π»ΠΈΠ½Π° ΠΊΠΎΠ΄Π° ΡΠΎΡΡΠ°Π²ΠΈΠ»Π° 96 ΡΡΡΠΎΠΊ, Π² ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ»ΠΎ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ 2 ΡΡΡΠΊΠ°, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΡΡ.
29.8. Π Π΅Π·ΡΠΌΠ΅
Π‘ΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΈ ΡΡΠΈΡΡΠ²Π°ΡΡ IP-Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π΅ ΠΏΠΎΠ½ΡΡΡ ΡΠ΄ΡΠΎΠΌ, Π° Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΠ°Π½Π°Π»ΡΠ½ΠΎΠΌΡ ΡΡΠΎΠ²Π½Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΠΊΠ°Π΄ΡΡ ΠΊΠ°Π½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ Π»ΡΠ±ΡΡ ΡΠΈΠΏΠΎΠ² (Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ IP). ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° tcpdump β ΡΡΠΎ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΈΠΌΠ΅ΡΡΠ°Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΠ°Π½Π°Π»ΡΠ½ΠΎΠΌΡ ΡΡΠΎΠ²Π½Ρ.
Π ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΊΠ°Π½Π°Π»ΡΠ½ΠΎΠΌΡ ΡΡΠΎΠ²Π½Ρ. ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΡΠΈΠ»ΡΡΡ ΠΠ΅ΡΠΊΠ»ΠΈ, DLPI SVR4 ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ Linux (SOCK_PACKET). ΠΠΎ Ρ Π½Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ, Π½Π΅ Π²Π½ΠΈΠΊΠ°Ρ Π² ΡΠ°Π·Π»ΠΈΡΠΈΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡΡΡ Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π·Π°Ρ Π²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² libcap.
ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΡΠ°Π·Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΏΠΎ-ΡΠ°Π·Π½ΠΎΠΌΡ. Π‘Π²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΠΌΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° libnet ΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ°Π·Π»ΠΈΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌΠΈ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠ΅ΡΠ΅Π· ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΎΠΊΠ΅ΡΡ ΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π½Π° ΠΊΠ°Π½Π°Π»ΡΠ½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ
1. ΠΠ°ΠΊΠΎΠ²ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π°Π³Π° canjump Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.7?
2. ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ udpcksum Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΠΏΠΎΡΡΠ° ICMP (Π² ΠΏΡΠ½ΠΊΡΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ²Π΅Ρ ΠΈΠΌΠ΅Π½) ΠΈΠ»ΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΡΠ·Π»Π° ICMP. Π ΠΎΠ±ΠΎΠΈΡ ΡΠ»ΡΡΠ°ΡΡ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΆΠ΄Π°ΡΡ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ udp_read Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 29.6, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ²Π΅ΡΠΎΠΌ Π½Π° Π½Π°Ρ Π·Π°ΠΏΡΠΎΡ DNS. ΠΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠΉΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π»Π° ΡΡΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ ICMP.
ΠΠ»Π°Π²Π° 30
ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°
30.1. ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΠΎΠ΄ Unix ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ:
β ΠΠ°Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 1.5, Π±ΡΠ» ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΌ (iterative), Π½ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π², Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ ΡΡΠΎΡ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ, Π²Π΅ΡΡΠΌΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΠ°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°, Π½Π΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ² ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°.
β Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΠ΅ΡΠ²ΡΠΉ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΉ (concurrent) ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΏΠΎΡΠΎΠΆΠ΄Π°Π» Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ fork. Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ ΠΏΠΎΠ΄ Unix, ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² ΡΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ.
β Π ΡΠ°Π·Π΄Π΅Π»Π΅ 6.8 ΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π΄ΡΡΠ³ΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ° TCP, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΠΉ Π»ΡΠ±ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ select.
β Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 26.2 ΠΌΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ, ΡΠΎΠ·Π΄Π°Π² Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
Π ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄Π²Π° Π΄ΡΡΠ³ΠΈΡ ΡΠΏΠΎΡΠΎΠ±Π° ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°.
β ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² (preforking). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ fork, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ (ΠΏΡΠ») Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ, Π²Π·ΡΡΡΠΉ ΠΈΠ· ΡΡΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ°.
β ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² (prethreading). ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ (ΠΏΡΠ») ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΡΠΎΠΊ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ°.
Π Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΠΎΠΏΡΠΎΡΠΎΠ², ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ Π² ΠΏΡΠ»Π΅ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²? Π Π΅ΡΠ»ΠΈ ΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ? ΠΠ°ΠΊ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ (ΠΈΠ»ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ) ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ?