日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TUN/TAP设备浅析(三) -- TUN/TAP设备的应用

發布時間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TUN/TAP设备浅析(三) -- TUN/TAP设备的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇文章主要講述了TUN/TAP設備的一些原理,你可能會好奇,TUN/TAP設備究竟有什么用處呢?所以這篇文章,我想用一些實際的例子來回答這個問題。

例子源自陳碩老師的博客,博文中關于TUN/TAP設備的使用非常典型,對原文感興趣的同學可以查看這里:http://blog.csdn.net/solstice/article/details/6579232

背景:在一臺 PC 機上模擬 TCP 客戶端程序發起連接請求,同時在該 PC 上創建虛擬網卡 tun0,接收連接請求

并送至 faketcp 應用程序,用于模擬 TCP 服務器端進行響應。

網絡的拓撲結構如下:

拓撲結構

具體做法是:在主機 atom 上通過打開 /dev/net/tun 設備來創建一個 tun0 虛擬網卡,然后把這個網卡的地址設為192.168.0.1/24,這樣 faketcp 程序就扮演了192.168.0.0/24 這個網段上的所有機器。atom 發給192.168.0.2 ~ 192.168.0.254的 IP 數據包都會發給 faketcp 程序,faketcp 程序可以模擬其中任何一個IPatomIP 數據包。

程序分成幾步來實現。

第一步:實現 icmp echo 協議,這樣就能 pingfaketcp 了:

faketcp.h:

#include <algorithm> // std::swap#include <assert.h> #include <stdint.h> #include <string.h> #include <arpa/inet.h> // inet_ntop #include <net/if.h>struct SocketAddr {uint32_t saddr, daddr; // 源地址和目的地址uint16_t sport, dport; // 源端口和目的端口bool operator==(const SocketAddr& rhs) const{return saddr == rhs.saddr && daddr == rhs.daddr && sport == rhs.sport && dport == rhs.dport;}bool operator<(const SocketAddr& rhs) const{return memcmp(this, &rhs, sizeof(rhs)) < 0;} };int tun_alloc(char dev[IFNAMSIZ]); uint16_t in_checksum(const void* buf, int len);void icmp_input(int fd, const void* input, const void* payload, int len);

faketcp.cc:

#include "faketcp.h"#include <fcntl.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <linux/if_tun.h> #include <netinet/in.h> #include <netinet/ip_icmp.h> #include <sys/ioctl.h>int sethostaddr(const char* dev) {struct ifreq ifr;bzero(&ifr, sizeof(ifr));strcpy(ifr.ifr_name, dev);struct sockaddr_in addr;bzero(&addr, sizeof addr);addr.sin_family = AF_INET;inet_pton(AF_INET, "192.168.0.1", &addr.sin_addr);//addr.sin_addr.s_addr = htonl(0xc0a80001);bcopy(&addr, &ifr.ifr_addr, sizeof addr);int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0)return sockfd;int err = 0;// ifconfig tun0 192.168.0.1if ((err = ioctl(sockfd, SIOCSIFADDR, (void *) &ifr)) < 0){perror("ioctl SIOCSIFADDR");goto done;}// ifup tun0 其實就是啟動tun0if ((err = ioctl(sockfd, SIOCGIFFLAGS, (void *) &ifr)) < 0){perror("ioctl SIOCGIFFLAGS");goto done;}ifr.ifr_flags |= IFF_UP;if ((err = ioctl(sockfd, SIOCSIFFLAGS, (void *) &ifr)) < 0){perror("ioctl SIOCSIFFLAGS");goto done;}// ifconfig tun0 192.168.0.1/24 # 配置子網掩碼inet_pton(AF_INET, "255.255.255.0", &addr.sin_addr);bcopy(&addr, &ifr.ifr_netmask, sizeof addr);if ((err = ioctl(sockfd, SIOCSIFNETMASK, (void *) &ifr)) < 0){perror("ioctl SIOCSIFNETMASK");goto done;} done:close(sockfd);return err; }int tun_alloc(char dev[IFNAMSIZ]) {struct ifreq ifr;int fd, err;if ((fd = open("/dev/net/tun", O_RDWR)) < 0){perror("open");return -1;}bzero(&ifr, sizeof(ifr));ifr.ifr_flags = IFF_TUN | IFF_NO_PI; // tun設備不包含以太網頭部,而tap包含,僅此而已if (*dev){strncpy(ifr.ifr_name, dev, IFNAMSIZ); }if ((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0){perror("ioctl TUNSETIFF");close(fd);return err;}strcpy(dev, ifr.ifr_name);if ((err = sethostaddr(dev)) < 0) // 設定地址等信息return err;return fd; }uint16_t in_checksum(const void* buf, int len) {assert(len % 2 == 0);const uint16_t* data = static_cast<const uint16_t*>(buf);int sum = 0;for (int i = 0; i < len; i+=2){sum += *data++;}while (sum >> 16)sum = (sum & 0xFFFF) + (sum >> 16);assert(sum <= 0xFFFF);return ~sum; }void icmp_input(int fd, const void* input, const void* payload, int len) {const struct iphdr* iphdr = static_cast<const struct iphdr*>(input); // ip頭部const struct icmphdr* icmphdr = static_cast<const struct icmphdr*>(payload); // icmp頭部// const int icmphdr_size = sizeof(*icmphdr);const int iphdr_len = iphdr->ihl*4;if (icmphdr->type == ICMP_ECHO){char source[INET_ADDRSTRLEN];char dest[INET_ADDRSTRLEN];inet_ntop(AF_INET, &iphdr->saddr, source, INET_ADDRSTRLEN);inet_ntop(AF_INET, &iphdr->daddr, dest, INET_ADDRSTRLEN);printf("%s > %s: ", source, dest);printf("ICMP echo request, id %d, seq %d, length %d\n",ntohs(icmphdr->un.echo.id),ntohs(icmphdr->un.echo.sequence),len - iphdr_len);union{unsigned char output[ETH_FRAME_LEN]; // 以太網頭部struct{struct iphdr iphdr;struct icmphdr icmphdr;} out;};memcpy(output, input, len);out.icmphdr.type = ICMP_ECHOREPLY;out.icmphdr.checksum += ICMP_ECHO; // FIXME: not portablestd::swap(out.iphdr.saddr, out.iphdr.daddr);write(fd, output, len);} }

icmpecho.cc:

#include "faketcp.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/ip.h> #include <linux/if_ether.h>int main() {char ifname[IFNAMSIZ] = "tun%d";int fd = tun_alloc(ifname); // tun_alloc函數主要用于開啟if (fd < 0){fprintf(stderr, "tunnel interface allocation failed\n");exit(1);}printf("allocted tunnel interface %s\n", ifname);sleep(1);for (;;){union{unsigned char buf[ETH_FRAME_LEN]; // 以太網頭部struct iphdr iphdr; // ip頭部};const int iphdr_size = sizeof iphdr; // ip頭部默認是20字節int nread = read(fd, buf, sizeof(buf));if (nread < 0){perror("read");close(fd);exit(1);}printf("read %d bytes from tunnel interface %s.\n", nread, ifname);const int iphdr_len = iphdr.ihl*4;if (nread >= iphdr_size&& iphdr.version == 4&& iphdr_len >= iphdr_size&& iphdr_len <= nread&& iphdr.tot_len == htons(nread)&& in_checksum(buf, iphdr_len) == 0){const void* payload = buf + iphdr_len;if (iphdr.protocol == IPPROTO_ICMP) // icmp協議{icmp_input(fd, buf, payload, nread);}}else{printf("bad packet\n");for (int i = 0; i < nread; ++i){if (i % 4 == 0) printf("\n");printf("%02x ", buf[i]);}printf("\n");}}return 0; }

運行方法,打開3個命令行窗口:

  • 在第1個窗口運行sudo ./icmpecho,程序顯示:
  • allocted tunnel interface tun0
  • 在第2個窗口運行:
  • $ sudo ifconfig tun0 192.168.0.1/24 # 設定ip地址$ sudo tcpdump -i tun0 # 用tcpdump抓取通過接口tun0的數據包
  • 在第3個窗口運行:
  • $ ping 192.168.0.2$ ping 192.168.0.3$ ping 192.168.0.234

    發現每個192.168.0.X 的IP 都能 ping 通。

    第二步:實現拒接 TCP 連接的功能,即在收到SYN TCP segment的時候發送RST segment

    rejectall.cc:

    #include "faketcp.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <linux/if_ether.h>void tcp_input(int fd, const void* input, const void* payload, int tot_len) {const struct iphdr* iphdr = static_cast<const struct iphdr*>(input); // ip頭部const struct tcphdr* tcphdr = static_cast<const struct tcphdr*>(payload); // tcp頭部const int iphdr_len = iphdr->ihl*4; // ip頭部的大小const int tcp_seg_len = tot_len - iphdr_len; // tcp報文的大小const int tcphdr_size = sizeof(*tcphdr);if (tcp_seg_len >= tcphdr_size&& tcp_seg_len >= tcphdr->doff*4){const int tcphdr_len = tcphdr->doff*4;if (tcphdr->syn) // 收到了SYN分節{char source[INET_ADDRSTRLEN];char dest[INET_ADDRSTRLEN];inet_ntop(AF_INET, &iphdr->saddr, source, INET_ADDRSTRLEN); // 將ip轉化為可讀的字符串inet_ntop(AF_INET, &iphdr->daddr, dest, INET_ADDRSTRLEN);printf("IP %s.%d > %s.%d: ",source, ntohs(tcphdr->source), dest, ntohs(tcphdr->dest));printf("Flags [S], seq %u, win %d, length %d\n",ntohl(tcphdr->seq), // 序列號ntohs(tcphdr->window), // 窗口大小tot_len - iphdr_len - tcphdr_len);union{unsigned char output[ETH_FRAME_LEN];struct{struct iphdr iphdr;struct tcphdr tcphdr;} out;};assert(sizeof(out) == sizeof(struct iphdr) + sizeof(struct tcphdr));int output_len = sizeof(out);bzero(&out, output_len + 4);memcpy(output, input, sizeof(struct iphdr));out.iphdr.tot_len = htons(output_len);std::swap(out.iphdr.saddr, out.iphdr.daddr);out.iphdr.check = 0;out.iphdr.check = in_checksum(output, sizeof(struct iphdr));out.tcphdr.source = tcphdr->dest; // 源地址和目的地址對調out.tcphdr.dest = tcphdr->source;out.tcphdr.seq = 0;out.tcphdr.ack_seq = htonl(ntohl(tcphdr->seq)+1); // 確認序列號out.tcphdr.doff = sizeof(struct tcphdr) / 4;out.tcphdr.ack = 1;out.tcphdr.rst = 1; // 注意這里的RST分節out.tcphdr.window = 0;unsigned char* pseudo = output + output_len;pseudo[0] = 0;pseudo[1] = IPPROTO_TCP;pseudo[2] = 0;pseudo[3] = sizeof(struct tcphdr);out.tcphdr.check = in_checksum(&out.iphdr.saddr, sizeof(struct tcphdr)+12);write(fd, output, output_len);}} }int main() {char ifname[IFNAMSIZ] = "tun%d";int fd = tun_alloc(ifname);if (fd < 0){fprintf(stderr, "tunnel interface allocation failed\n");exit(1);}printf("allocted tunnel interface %s\n", ifname);sleep(1);for (;;){union{unsigned char buf[ETH_FRAME_LEN];struct iphdr iphdr;};const int iphdr_size = sizeof iphdr;int nread = read(fd, buf, sizeof(buf));if (nread < 0){perror("read");close(fd);exit(1);}printf("read %d bytes from tunnel interface %s.\n", nread, ifname);const int iphdr_len = iphdr.ihl*4;if (nread >= iphdr_size&& iphdr.version == 4&& iphdr_len >= iphdr_size&& iphdr_len <= nread&& iphdr.tot_len == htons(nread)&& in_checksum(buf, iphdr_len) == 0){const void* payload = buf + iphdr_len;if (iphdr.protocol == IPPROTO_ICMP){icmp_input(fd, buf, payload, nread);}else if (iphdr.protocol == IPPROTO_TCP){tcp_input(fd, buf, payload, nread);}}else{printf("bad packet\n");for (int i = 0; i < nread; ++i){if (i % 4 == 0) printf("\n");printf("%02x ", buf[i]);}printf("\n");}}return 0; }

    運行方法,打開3個命令行窗口,頭兩個窗口的操作與前面相同,運行的faketcp 程序是 ./rejectall。

  • 在第3個窗口運行
  • $ nc 192.168.0.2 2000$ nc 192.168.0.2 3333$ nc 192.168.0.7 5555

    發現向其中任意一個 IP 發起的 TCP 連接都被拒接了。

    第三步:實現接受 TCP 連接的功能,即在接收到SYN TCP segment的時候發回 SYN + ACK。這個程序同時處理了連接斷開的情況,即在收到FIN segment的時候發回 FIN + ACK。

    acceptall.cc:

    #include "faketcp.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <linux/if_ether.h>void tcp_input(int fd, const void* input, const void* payload, int tot_len) {const struct iphdr* iphdr = static_cast<const struct iphdr*>(input);const struct tcphdr* tcphdr = static_cast<const struct tcphdr*>(payload);const int iphdr_len = iphdr->ihl*4;const int tcp_seg_len = tot_len - iphdr_len;const int tcphdr_size = sizeof(*tcphdr);if (tcp_seg_len >= tcphdr_size&& tcp_seg_len >= tcphdr->doff*4){const int tcphdr_len = tcphdr->doff*4;char source[INET_ADDRSTRLEN];char dest[INET_ADDRSTRLEN];inet_ntop(AF_INET, &iphdr->saddr, source, INET_ADDRSTRLEN);inet_ntop(AF_INET, &iphdr->daddr, dest, INET_ADDRSTRLEN);printf("IP %s.%d > %s.%d: ",source, ntohs(tcphdr->source), dest, ntohs(tcphdr->dest));printf("Flags [%c], seq %u, win %d, length %d\n",tcphdr->syn ? 'S' : (tcphdr->fin ? 'F' : '.'),ntohl(tcphdr->seq),ntohs(tcphdr->window),tot_len - iphdr_len - tcphdr_len);union{unsigned char output[ETH_FRAME_LEN];struct{struct iphdr iphdr;struct tcphdr tcphdr;} out;};assert(sizeof(out) == sizeof(struct iphdr) + sizeof(struct tcphdr));int output_len = sizeof(out);bzero(&out, output_len + 4);memcpy(output, input, sizeof(struct iphdr));out.iphdr.tot_len = htons(output_len);std::swap(out.iphdr.saddr, out.iphdr.daddr);out.iphdr.check = 0;out.iphdr.check = in_checksum(output, sizeof(struct iphdr));out.tcphdr.source = tcphdr->dest;out.tcphdr.dest = tcphdr->source;out.tcphdr.ack_seq = htonl(ntohl(tcphdr->seq)+1);out.tcphdr.doff = sizeof(struct tcphdr) / 4;out.tcphdr.window = htons(5000);bool response = false;if (tcphdr->syn){out.tcphdr.seq = htonl(123456); // 序列號隨機產生out.tcphdr.syn = 1; // SYNout.tcphdr.ack = 1; // ACKresponse = true;}else if (tcphdr->fin) // 對于對方發送的FIN也需要接收是吧!{out.tcphdr.seq = htonl(123457);out.tcphdr.fin = 1;out.tcphdr.ack = 1;response = true;}unsigned char* pseudo = output + output_len;pseudo[0] = 0;pseudo[1] = IPPROTO_TCP;pseudo[2] = 0;pseudo[3] = sizeof(struct tcphdr);out.tcphdr.check = in_checksum(&out.iphdr.saddr, sizeof(struct tcphdr)+12);if (response){write(fd, output, output_len);}} }int main() {char ifname[IFNAMSIZ] = "tun%d";int fd = tun_alloc(ifname);if (fd < 0){fprintf(stderr, "tunnel interface allocation failed\n");exit(1);}printf("allocted tunnel interface %s\n", ifname);sleep(1);for (;;){union{unsigned char buf[ETH_FRAME_LEN];struct iphdr iphdr;};const int iphdr_size = sizeof iphdr;int nread = read(fd, buf, sizeof(buf));if (nread < 0){perror("read");close(fd);exit(1);}printf("read %d bytes from tunnel interface %s.\n", nread, ifname);const int iphdr_len = iphdr.ihl*4;if (nread >= iphdr_size&& iphdr.version == 4&& iphdr_len >= iphdr_size&& iphdr_len <= nread&& iphdr.tot_len == htons(nread)&& in_checksum(buf, iphdr_len) == 0){const void* payload = buf + iphdr_len;if (iphdr.protocol == IPPROTO_ICMP){icmp_input(fd, buf, payload, nread);}else if (iphdr.protocol == IPPROTO_TCP){tcp_input(fd, buf, payload, nread);}}else{printf("bad packet\n");for (int i = 0; i < nread; ++i){if (i % 4 == 0) printf("\n");printf("%02x ", buf[i]);}printf("\n");}}return 0; }

    運行方法,打開3個命令行窗口,步驟與前面相同,運行的 faketcp 程序是 ./acceptall。

    這次會發現 nc 能和192.168.0.X中的每一個 IP 每一個 PORT 都能連通。還可以在第4個窗口中運行 netstat -tpn,以確認連接確實建立起來了。

    如果在 nc 中輸入數據,數據會堆積在操作系統中,表現為netstat 顯示的發送隊列 (Send-Q)的長度增加。

    第四步:在第三步接受TCP連接的基礎上,實現接收數據,即在收到包含 payload 數據的 TCP segment時發回ACK

    discardall.cc:

    #include "faketcp.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <linux/if_ether.h>void tcp_input(int fd, const void* input, const void* payload, int tot_len) {const struct iphdr* iphdr = static_cast<const struct iphdr*>(input);const struct tcphdr* tcphdr = static_cast<const struct tcphdr*>(payload);const int iphdr_len = iphdr->ihl*4;const int tcp_seg_len = tot_len - iphdr_len;const int tcphdr_size = sizeof(*tcphdr);if (tcp_seg_len >= tcphdr_size&& tcp_seg_len >= tcphdr->doff*4){const int tcphdr_len = tcphdr->doff*4;const int payload_len = tot_len - iphdr_len - tcphdr_len;char source[INET_ADDRSTRLEN];char dest[INET_ADDRSTRLEN];inet_ntop(AF_INET, &iphdr->saddr, source, INET_ADDRSTRLEN); // 將ip地址變得可讀inet_ntop(AF_INET, &iphdr->daddr, dest, INET_ADDRSTRLEN);printf("IP %s.%d > %s.%d: ",source, ntohs(tcphdr->source), dest, ntohs(tcphdr->dest));printf("Flags [%c], seq %u, win %d, length %d\n",tcphdr->syn ? 'S' : (tcphdr->fin ? 'F' : '.'),ntohl(tcphdr->seq),ntohs(tcphdr->window),payload_len);union{unsigned char output[ETH_FRAME_LEN];struct{struct iphdr iphdr;struct tcphdr tcphdr;} out;};assert(sizeof(out) == sizeof(struct iphdr) + sizeof(struct tcphdr));int output_len = sizeof(out);bzero(&out, output_len + 4);memcpy(output, input, sizeof(struct iphdr));out.iphdr.tot_len = htons(output_len);std::swap(out.iphdr.saddr, out.iphdr.daddr);out.iphdr.check = 0;out.iphdr.check = in_checksum(output, sizeof(struct iphdr));out.tcphdr.source = tcphdr->dest; // 目的地址和源地址倒換out.tcphdr.dest = tcphdr->source;out.tcphdr.doff = sizeof(struct tcphdr) / 4;out.tcphdr.window = htons(5000);bool response = false;if (tcphdr->syn){out.tcphdr.seq = htonl(123456);out.tcphdr.ack_seq = htonl(ntohl(tcphdr->seq)+1);out.tcphdr.syn = 1;out.tcphdr.ack = 1;response = true;}else if (tcphdr->fin){out.tcphdr.seq = htonl(123457);out.tcphdr.ack_seq = htonl(ntohl(tcphdr->seq)+1);out.tcphdr.fin = 1;out.tcphdr.ack = 1;response = true;}else if (payload_len > 0){out.tcphdr.seq = htonl(123457);out.tcphdr.ack_seq = htonl(ntohl(tcphdr->seq)+payload_len); // 確認的序列號out.tcphdr.ack = 1; // ack,不發送數據,僅發送確認號response = true;}unsigned char* pseudo = output + output_len;pseudo[0] = 0;pseudo[1] = IPPROTO_TCP;pseudo[2] = 0;pseudo[3] = sizeof(struct tcphdr);out.tcphdr.check = in_checksum(&out.iphdr.saddr, sizeof(struct tcphdr)+12);if (response){write(fd, output, output_len);}} }int main() {char ifname[IFNAMSIZ] = "tun%d";int fd = tun_alloc(ifname);if (fd < 0){fprintf(stderr, "tunnel interface allocation failed\n");exit(1);}printf("allocted tunnel interface %s\n", ifname);sleep(1);for (;;){union{unsigned char buf[ETH_FRAME_LEN];struct iphdr iphdr;};const int iphdr_size = sizeof iphdr;int nread = read(fd, buf, sizeof(buf));if (nread < 0){perror("read");close(fd);exit(1);}printf("read %d bytes from tunnel interface %s.\n", nread, ifname);const int iphdr_len = iphdr.ihl*4;if (nread >= iphdr_size&& iphdr.version == 4&& iphdr_len >= iphdr_size&& iphdr_len <= nread&& iphdr.tot_len == htons(nread)&& in_checksum(buf, iphdr_len) == 0){const void* payload = buf + iphdr_len;if (iphdr.protocol == IPPROTO_ICMP){icmp_input(fd, buf, payload, nread);}else if (iphdr.protocol == IPPROTO_TCP){tcp_input(fd, buf, payload, nread);}}else{printf("bad packet\n");for (int i = 0; i < nread; ++i){if (i % 4 == 0) printf("\n");printf("%02x ", buf[i]);}printf("\n");}}return 0; }

    運行方法,打開3個命令行窗口,步驟與前面相同,運行的faketcp程序是./acceptall。

    這次會發現 nc 能和192.168.0.X中的每一個IP 每一個PORT 都能連通,數據也能發出去。還可以在第4個窗口中運行netstat -tpn,以確認連接確實建立起來了,并且發送隊列的長度為0;

    這一步已經解決了前面的問題2,扮演任意 TCP 服務端。

    第五步:解決前面的問題1,扮演客戶端向atom 發起任意多的連接。

    connectmany.cc:

    #include "faketcp.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <linux/if_ether.h>void tcp_input(int fd, const void* input, const void* payload, int tot_len, bool passive) {const struct iphdr* iphdr = static_cast<const struct iphdr*>(input);const struct tcphdr* tcphdr = static_cast<const struct tcphdr*>(payload);const int iphdr_len = iphdr->ihl*4;const int tcp_seg_len = tot_len - iphdr_len;const int tcphdr_size = sizeof(*tcphdr);if (tcp_seg_len >= tcphdr_size&& tcp_seg_len >= tcphdr->doff*4){const int tcphdr_len = tcphdr->doff*4;const int payload_len = tot_len - iphdr_len - tcphdr_len;char source[INET_ADDRSTRLEN];char dest[INET_ADDRSTRLEN];inet_ntop(AF_INET, &iphdr->saddr, source, INET_ADDRSTRLEN);inet_ntop(AF_INET, &iphdr->daddr, dest, INET_ADDRSTRLEN);printf("IP %s.%d > %s.%d: ",source, ntohs(tcphdr->source), dest, ntohs(tcphdr->dest));printf("Flags [%c], seq %u, win %d, length %d\n",tcphdr->syn ? 'S' : (tcphdr->fin ? 'F' : '.'),ntohl(tcphdr->seq),ntohs(tcphdr->window),payload_len);union{unsigned char output[ETH_FRAME_LEN];struct{struct iphdr iphdr;struct tcphdr tcphdr;} out;};assert(sizeof(out) == sizeof(struct iphdr) + sizeof(struct tcphdr));int output_len = sizeof(out);bzero(&out, output_len + 4);memcpy(output, input, sizeof(struct iphdr));out.iphdr.tot_len = htons(output_len);std::swap(out.iphdr.saddr, out.iphdr.daddr);out.iphdr.check = 0;out.iphdr.check = in_checksum(output, sizeof(struct iphdr));out.tcphdr.source = tcphdr->dest;out.tcphdr.dest = tcphdr->source;out.tcphdr.doff = sizeof(struct tcphdr) / 4;out.tcphdr.window = htons(5000);bool response = false;if (tcphdr->syn) // 對方發起連接,或者對方發送了確認的syn和ack{out.tcphdr.seq = htonl(passive ? 123456 : 123457);out.tcphdr.ack_seq = htonl(ntohl(tcphdr->seq)+1);if (passive) // passive==true表示被動接收連接,表示對方連過來{out.tcphdr.syn = 1;}// 否則的話,表示自己主動發送的連接,接收到了對方的syn和ack,我們只需要發送一個ack即可out.tcphdr.ack = 1; response = true;}else if (tcphdr->fin) // 對方關閉連接{out.tcphdr.seq = htonl(123457);out.tcphdr.ack_seq = htonl(ntohl(tcphdr->seq)+1);out.tcphdr.fin = 1;out.tcphdr.ack = 1;response = true;}else if (payload_len > 0){out.tcphdr.seq = htonl(123457);out.tcphdr.ack_seq = htonl(ntohl(tcphdr->seq)+payload_len);out.tcphdr.ack = 1;response = true;}unsigned char* pseudo = output + output_len;pseudo[0] = 0;pseudo[1] = IPPROTO_TCP;pseudo[2] = 0;pseudo[3] = sizeof(struct tcphdr);out.tcphdr.check = in_checksum(&out.iphdr.saddr, sizeof(struct tcphdr)+12);if (response){write(fd, output, output_len);}} }// connect_one 發起一個tcp連接? bool connect_one(int fd, uint32_t daddr, int dport, uint32_t saddr, int sport) {{union{unsigned char output[ETH_FRAME_LEN];struct{struct iphdr iphdr;struct tcphdr tcphdr;} out;};bzero(&out, (sizeof out)+4);out.iphdr.version = IPVERSION;out.iphdr.ihl = sizeof(out.iphdr)/4;out.iphdr.tos = 0;out.iphdr.tot_len = htons(sizeof(out));out.iphdr.id = 55564;out.iphdr.frag_off |= htons(IP_DF);out.iphdr.ttl = IPDEFTTL;out.iphdr.protocol = IPPROTO_TCP;out.iphdr.saddr = saddr;out.iphdr.daddr = daddr;out.iphdr.check = in_checksum(output, sizeof(struct iphdr));out.tcphdr.source = sport; // 端口號out.tcphdr.dest = dport;out.tcphdr.seq = htonl(123456);out.tcphdr.ack_seq = 0;out.tcphdr.doff = sizeof(out.tcphdr)/4;out.tcphdr.syn = 1; // 主動發起連接out.tcphdr.window = htons(4096);unsigned char* pseudo = output + sizeof out;pseudo[0] = 0;pseudo[1] = IPPROTO_TCP;pseudo[2] = 0;pseudo[3] = sizeof(struct tcphdr);out.tcphdr.check = in_checksum(&out.iphdr.saddr, sizeof(struct tcphdr)+12);write(fd, output, sizeof out); // 發送連接}union{unsigned char buf[ETH_FRAME_LEN];struct iphdr iphdr;};const int iphdr_size = sizeof iphdr;int nread = read(fd, buf, sizeof(buf)); // 接收到回復之后if (nread < 0){perror("read");close(fd);exit(1);}// printf("read %d bytes from tunnel interface %s.\n", nread, ifname);if (nread >= iphdr_size&& iphdr.version == 4&& iphdr.ihl*4 >= iphdr_size&& iphdr.ihl*4 <= nread&& iphdr.tot_len == htons(nread)&& in_checksum(buf, iphdr.ihl*4) == 0){const void* payload = buf + iphdr.ihl*4;if (iphdr.protocol == IPPROTO_ICMP){icmp_input(fd, buf, payload, nread);}else if (iphdr.protocol == IPPROTO_TCP) // tcp 報文{tcp_input(fd, buf, payload, nread, false); // 注意到這里的false,表示是自己主動發起連接}}return true; }void connect_many(int fd, const char* ipstr, int port, int count) {uint32_t destip;inet_pton(AF_INET, ipstr, &destip); // 連接到目的ipuint32_t srcip = ntohl(destip)+1;int srcport = 1024; // 端口從1024開始for (int i = 0; i < count; ++i){connect_one(fd, destip, htons(port), htonl(srcip), htons(srcport));srcport++; // 源端口在不斷加1if (srcport > 0xFFFF){srcport = 1024;srcip++;}} }void usage() { }int main(int argc, char* argv[]) {if (argc < 4){usage();return 0;}char ifname[IFNAMSIZ] = "tun%d";int fd = tun_alloc(ifname);if (fd < 0){fprintf(stderr, "tunnel interface allocation failed\n");exit(1);}const char* ip = argv[1]; // ipint port = atoi(argv[2]); // 端口int count = atoi(argv[3]); // 數量printf("allocted tunnel interface %s\n", ifname);printf("press enter key to start connecting %s:%d\n", ip, port);getchar();connect_many(fd, ip, port, count); // 發起連接for (;;){union{unsigned char buf[ETH_FRAME_LEN];struct iphdr iphdr;};const int iphdr_size = sizeof iphdr;int nread = read(fd, buf, sizeof(buf));if (nread < 0){perror("read");close(fd);exit(1);}printf("read %d bytes from tunnel interface %s.\n", nread, ifname);const int iphdr_len = iphdr.ihl*4;if (nread >= iphdr_size&& iphdr.version == 4&& iphdr_len >= iphdr_size&& iphdr_len <= nread&& iphdr.tot_len == htons(nread)&& in_checksum(buf, iphdr_len) == 0){const void* payload = buf + iphdr_len;if (iphdr.protocol == IPPROTO_ICMP){icmp_input(fd, buf, payload, nread);}else if (iphdr.protocol == IPPROTO_TCP){tcp_input(fd, buf, payload, nread, true); // 注意到這里的true,表示是被動接收連接}}else{printf("bad packet\n");for (int i = 0; i < nread; ++i){if (i % 4 == 0) printf("\n");printf("%02x ", buf[i]);}printf("\n");}}return 0; }

    這一步的運行方法與前面不同,打開4個命令行窗口。

  • 在第1個窗口運行sudo ./connectmany 192.168.0.1 2007 1000,表示將向192.168.0.1:2007 發起1000個并發連接。程序顯示:
  • allocated tunnel interface tun0 press enter key to start connecting 192.168.0.1 2007
  • 在第二個窗口運行
  • $ sudo ifconfig tun0 192.168.0.1/24$ sudo tcpdump -i tun0
  • 在第3個窗口運行一個能接收并發TCP 連接的服務程序,可以是httpd, 也可以是muduoechodiscard 示例,程序應listen 2007端口。
  • 回到第1個窗口敲回車,然后在第4個窗口中用netstat -tpn來觀察并發連接。
  • 文中代碼目錄連接:https://github.com/chenshuo/recipes/tree/master/faketcp



    作者:Yihulee
    鏈接:https://www.jianshu.com/p/14f9340d940d
    來源:簡書
    著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

    總結

    以上是生活随笔為你收集整理的TUN/TAP设备浅析(三) -- TUN/TAP设备的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日韩一区二区三区高清免费看看 | 免费观看黄 | 美女网站视频一区 | 国产精品久久久久久久妇 | 色天天久久 | 免费观看不卡av | 高清不卡免费视频 | 91久久久久久久一区二区 | 免费一区在线 | 97超碰人人澡 | 精品国产免费一区二区三区五区 | 九九免费在线观看视频 | 亚洲免费在线观看视频 | 色综合久久88色综合天天6 | 一区二区视频在线观看免费 | 91亚洲狠狠婷婷综合久久久 | 午夜体验区 | 免费观看日韩 | 不卡中文字幕在线 | 成人黄色av免费在线观看 | 亚洲精品免费在线视频 | 亚洲日本中文字幕在线观看 | adc在线观看| 欧美在线资源 | 九九热在线免费观看 | 成人宗合网 | 91精品国产99久久久久久红楼 | 免费91麻豆精品国产自产在线观看 | 国产精品免费久久久久影院仙踪林 | 日日夜夜精品视频天天综合网 | www.狠狠 | 欧美午夜精品久久久久久孕妇 | 狠狠狠色丁香婷婷综合激情 | 中文字幕国产精品一区二区 | 日本视频久久久 | 免费视频成人 | 午夜在线看片 | 欧美一级片免费播放 | 亚洲黄色在线观看 | 三级av中文字幕 | av.com在线 | 国产一级在线免费观看 | 国产精品久久久久永久免费观看 | 欧美精品一区二区三区一线天视频 | 免费看国产一级片 | 日韩视频免费观看高清 | 欧美精品二区 | 97视频在线观看视频免费视频 | 久久精品99久久久久久2456 | 国产一区视频导航 | 成年人在线免费看视频 | 97色国产 | 色欧美成人精品a∨在线观看 | 日日干天天爽 | 亚洲有 在线| 午夜精品久久久久久久久久久久久久 | 亚洲高清久久久 | 在线视频久 | 亚洲精品久久久久久久不卡四虎 | 国产免费又黄又爽 | 日韩在线视频线视频免费网站 | 黄色大片免费播放 | 欧美大片第1页 | 一级国产视频 | 久久精品二区 | 免费看一及片 | 欧美一二在线 | 尤物一区二区三区 | 久久久91精品国产 | 久青草视频在线观看 | 国内精品久久久久影院男同志 | av亚洲产国偷v产偷v自拍小说 | 久久久久久久亚洲精品 | 狠狠干婷婷 | 日韩亚洲精品电影 | 中文字幕第一页在线 | 色综合天天狠天天透天天伊人 | 国产亚洲无 | 天天操天天摸天天爽 | 婷婷丁香国产 | 日日干日日色 | 久久人人爽人人 | 天天操夜夜操夜夜操 | 亚洲一级二级三级 | 久久99久久99精品免观看粉嫩 | 精品国产一区二区三区四区vr | 五月花激情 | 一本一本久久a久久精品牛牛影视 | 在线日韩av | 在线观看视频免费大全 | 色综合久久精品 | 黄色官网在线观看 | 9在线观看免费高清完整版在线观看明 | 亚洲视频在线观看 | 午夜少妇一区二区三区 | 婷婷激情五月综合 | 在线观看91视频 | 五月婷在线观看 | 开心丁香婷婷深爱五月 | 国产亚洲视频系列 | 99 视频 高清 | 欧美a免费 | 日本xxxx.com| 91豆麻精品91久久久久久 | 国产一区成人在线 | 伊人天天色 | 久久综合精品国产一区二区三区 | 久久99免费视频 | 国产精品激情在线观看 | 91大神免费视频 | 国产精品久久一 | 国产黄免费在线观看 | 色丁香久久 | 91 | 色婷婷骚婷婷 | 免费视频 三区 | 九九热精品视频在线播放 | 亚洲专区欧美专区 | 日韩久久激情 | 综合久久2023 | 深夜成人av| 手机av片 | 999免费视频 | 久久久一本精品99久久精品66 | 开心激情五月网 | 国产99在线播放 | 国产精品第72页 | 精品久久美女 | 91成人免费看 | 中文字幕在线视频一区 | 欧美电影在线观看 | 奇米网777| 国产精品免费在线视频 | 精品国产乱码久久久久久1区二区 | 六月丁香社区 | 日韩在线色视频 | 久久视频一区二区 | 超碰97国产精品人人cao | 91av亚洲| 人人澡人人澡人人 | 成人欧美一区二区三区黑人麻豆 | 蜜桃麻豆www久久囤产精品 | 国产一级免费观看 | 婷婷丁香国产 | 成人影视片 | adn—256中文在线观看 | 日韩欧美一区二区三区视频 | 久久国产精品小视频 | 久久视频一区 | 男女视频国产 | 日韩久久精品一区二区 | 久久超级碰视频 | 超碰在线最新地址 | 中文字幕资源网在线观看 | 欧美成人影音 | 成人蜜桃网 | 久久九九久久精品 | 超碰在97| 国产精品精品久久久 | 免费h视频| 狠狠插天天干 | 五月天综合网站 | 色综合中文字幕 | 午夜成人免费电影 | 九月婷婷色| 色综合久久88色综合天天人守婷 | 人人爽人人做 | 国产精品成人av电影 | 成人av免费网站 | 精品久久在线 | 色综合久久88 | 日韩精选在线观看 | 色播五月婷婷 | 国产日本亚洲 | 五月丁色 | www.国产高清 | 免费韩国av | 国产小视频在线观看免费 | 午夜黄色一级片 | 日韩免费播放 | 日韩欧美高清一区二区 | 国产在线精品播放 | 视频成人| 日韩精品不卡 | 国产在线一线 | 久久av网址 | 久久老司机精品视频 | 亚洲精品在线观看视频 | 99在线视频精品 | 亚洲人视频在线 | 亚洲精品美女在线 | 欧美日韩有码 | 中文字幕超清在线免费 | 免费高清无人区完整版 | 欧美一二三视频 | 亚洲电影免费 | 久热色超碰| 国产伦精品一区二区三区无广告 | 毛片无卡免费无播放器 | 中文字幕av免费观看 | 成人免费观看网站 | 亚洲国产黄色片 | 日韩精品在线免费播放 | 国产精品成人久久久久 | 天天天天天天干 | 黄污在线看 | 欧美视频日韩 | 国产在线久久久 | 99精品在线观看 | 久久兔费看a级 | 免费69视频| 91精品国产综合久久福利不卡 | 久久人人精品 | 日日干夜夜干 | 午夜精品中文字幕 | 国产中文字幕在线免费观看 | 色老板在线视频 | 久久区二区 | 国产精品亚 | 91av短视频 | 免费观看www小视频的软件 | 日韩三级精品 | 成年人在线免费看视频 | 国产精品正在播放 | a级国产乱理论片在线观看 特级毛片在线观看 | 四虎影视成人永久免费观看亚洲欧美 | 人人插人人澡 | 黄色特一级片 | a久久免费视频 | 久久精品伊人 | av三区在线 | 国产美女精彩久久 | 国内精品国产三级国产aⅴ久 | 久久成人毛片 | 色狠狠综合 | 五月婷久 | 91爱在线| 96av视频| 国产欧美日韩一区 | 国内视频一区二区 | 成人在线免费看 | 久久综合九色综合97_ 久久久 | 在线免费观看黄色大片 | 最近中文字幕完整视频高清1 | 人人看人人草 | 免费在线视频一区二区 | 欧美性大战 | 日韩精品视频在线免费观看 | 亚洲永久精品在线 | 色噜噜在线观看视频 | 日韩动态视频 | 91精品久久久久 | 国产福利91精品张津瑜 | 99久久婷婷国产精品综合 | 天堂网av 在线 | 久久精品www人人爽人人 | 三级免费黄 | 国产精品欧美久久久久三级 | 久久精品视频在线播放 | 亚洲精品综合欧美二区变态 | 一区三区视频在线观看 | 久久免费国产视频 | 国产高清视频在线播放一区 | 国产高清av在线播放 | 激情丁香在线 | 狠狠干天天 | 久久精品国产成人精品 | 精品国产电影一区 | 久久综合九色综合久久久精品综合 | 久久久久久久网站 | 欧美日韩xx| 18pao国产成视频永久免费 | 成人a视频在线观看 | 亚洲欧美在线观看视频 | 欧美日韩国产伦理 | 婷婷丁香花五月天 | 久草电影免费在线观看 | 中文字幕中文字幕中文字幕 | 日韩三区在线 | 色爽网站| 国产精品色婷婷 | 亚洲婷婷综合色高清在线 | 欧美一级久久 | 久久99久久99精品免费看小说 | 日韩精品1区2区 | 福利视频一区二区 | 欧美激情第八页 | 日韩av免费一区二区 | 天天操天天摸天天爽 | 国产高清一区二区 | 黄色h在线观看 | 成人黄色毛片视频 | 亚洲少妇影院 | 日韩乱码中文字幕 | 国产最顶级的黄色片在线免费观看 | 国产精品视频线看 | 91麻豆看国产在线紧急地址 | 91九色视频网站 | 欧美成人日韩 | 国产黄色大片免费看 | 91成年人网站 | 日韩欧美一区二区三区视频 | 99精品一级欧美片免费播放 | 精品久久久久_ | 成人午夜在线观看 | 91在线成人 | 久久网站av | 91探花国产综合在线精品 | 日韩网站中文字幕 | 亚洲综合激情小说 | 久久免费视频播放 | 久草免费在线 | 一级黄色片在线播放 | www.97色.com| 美女精品在线 | 国产精品日韩欧美 | 国产做aⅴ在线视频播放 | 日韩在线国产 | 久久免费公开视频 | 免费人成在线观看网站 | 欧美日韩久久一区 | 天天插一插 | 天天色天天干天天色 | 鲁一鲁影院 | 色婷婷视频在线 | 亚洲成av人影片在线观看 | 99这里有精品 | 二区视频在线 | 一级黄色毛片 | 三级黄色a| 丁香狠狠| 91免费在线播放 | 99久久精品国产网站 | 亚洲最快最全在线视频 | 国产精品久久久久久妇 | 久久久久高清毛片一级 | 成年人电影毛片 | 亚洲第二色 | 蜜臀av夜夜澡人人爽人人 | 五月天com| 中文字幕乱码在线播放 | 中文字幕欧美三区 | 国产麻豆精品在线观看 | www.黄色在线 | 亚洲激情在线观看 | 久久久久亚洲国产精品 | 久久精品欧美一区 | 二区三区av | 一本一本久久a久久精品综合妖精 | 中文字幕在线日亚洲9 | 99精品影视| 黄色一级大片在线免费看产 | 国产尤物在线视频 | 中文字幕在线观看视频网站 | 国产最顶级的黄色片在线免费观看 | 日操干| 中文字幕黄色 | 激情婷婷在线观看 | 五月婷婷深开心 | 美女黄频网站 | 欧美激情片在线观看 | 午夜视频在线观看一区二区三区 | 欧美一区视频 | 精品久久久久久综合日本 | 黄色三级免费观看 | 国产日韩精品一区二区 | 色播五月激情五月 | 亚洲视屏一区 | 亚洲精品国久久99热 | 奇米777777 | 久久精品在线免费观看 | 欧美国产一区二区 | www日| 国产成人香蕉 | 国内精品久久久久久久久久清纯 | av中文字幕亚洲 | 国产亚洲视频在线免费观看 | 婷婷久草| 国产黄色免费看 | 91手机在线看片 | 国产精品福利久久久 | 久久久久99999| 蜜臀av在线一区二区三区 | 成人在线观看影院 | 中文字幕国产 | 精品黄色片 | 日本大尺码专区mv | 天天干天天摸 | 五月婷av | 午夜久久久精品 | 国产精品一区二区三区电影 | 97综合视频| 亚洲国产精品一区二区尤物区 | 亚洲精品国精品久久99热一 | 久久99国产精品视频 | 国产精品久久久精品 | 伊人超碰在线 | 久久伊人热 | 女人魂免费观看 | 伊人久久国产 | 日韩精品欧美一区 | 91最新网址在线观看 | 91九色视频导航 | 亚洲成人av在线 | 91porny九色91啦中文 | 天天曰天天 | 免费黄色a网站 | 国产免费一区二区三区网站免费 | 丁香六月激情婷婷 | 日日成人网 | 伊人亚洲精品 | 午夜性生活| 天天干亚洲 | 国产综合婷婷 | 在线一二三四区 | 91精品推荐 | 亚洲精品在线免费播放 | 狠狠狠狠狠干 | 在线小视频你懂的 | 日韩在线观看你懂的 | 亚洲精品国产免费 | 国产精品免费麻豆入口 | 久久久国产精品视频 | 99精品国产福利在线观看免费 | 91片黄在线观 | 日本中文字幕在线电影 | 欧美日比视频 | 欧美日韩一区二区三区免费视频 | aaa日本高清在线播放免费观看 | 亚洲精品18p | 国产精品女人久久久久久 | 亚洲婷婷丁香 | 免费看成年人 | 91成人午夜 | 96久久精品 | 91色在线观看视频 | 国产高清av| 国产亚洲免费的视频看 | 一区二区三区在线免费观看 | 久久精品视频一 | 亚在线播放中文视频 | 中文在线免费视频 | 国产一区二区久久精品 | 久久免费播放视频 | 人人爽人人爽人人爽学生一级 | 亚洲aⅴ一区二区三区 | 午夜久久久久久久久久久 | 精品黄色在线观看 | 97超碰福利久久精品 | 精品国产91亚洲一区二区三区www | av电影中文 | 黄av免费在线观看 | 久久久国产高清 | 欧美一区二区三区不卡 | 亚洲午夜精品久久久 | 91污污 | 亚洲激情小视频 | 日韩三级中文字幕 | 国产激情免费 | 国产福利网站 | 国产91综合一区在线观看 | 亚洲一区二区三区四区精品 | 玖玖精品在线 | 婷婷伊人五月 | 91香蕉视频污在线 | 91在线免费看片 | 日韩 在线a | 精品久久五月天 | 黄色片视频在线观看 | 91禁在线观看 | 成人久久综合 | 丰满少妇麻豆av | 成人黄色大片 | 在线观看福利网站 | 激情五月婷婷丁香 | 黄色网免费 | 国产精品 日韩 | 久草在线免 | 亚洲天堂网站视频 | 中文字幕视频观看 | 久久少妇 | 日韩精品免费一区二区 | 午夜男人影院 | av片在线观看免费 | 久久精品激情 | 国产黄色精品视频 | 国产涩涩网站 | 欧美在线一 | 在线导航av | 成人视屏免费看 | 亚洲国产视频a | 99人成在线观看视频 | 精品夜夜嗨av一区二区三区 | 黄色资源在线观看 | 国产大片免费久久 | 婷婷av资源| 99久久久久久久 | 网站在线观看你们懂的 | 日韩av中文字幕在线免费观看 | 成人在线电影观看 | 久久国产精品一二三区 | 美州a亚洲一视本频v色道 | 国产精品久久网 | 亚洲少妇久久 | 偷拍精偷拍精品欧洲亚洲网站 | 午夜视频在线观看网站 | 9在线观看免费高清完整版 玖玖爱免费视频 | 岛国大片免费视频 | 二区中文字幕 | 成人一级黄色片 | 国产一区影院 | 免费看的黄网站 | 九九免费精品 | 久久久久亚洲国产精品 | 俺要去色综合狠狠 | 九色精品免费永久在线 | a电影免费看 | 激情综合五月天 | 夜夜操天天干 | 最新日韩视频 | 日日干网址 | 黄色免费网战 | 91视频久久久 | 在线观看免费黄视频 | 最近日韩中文字幕中文 | 日韩欧美视频一区二区 | 成av人电影 | 国产精品成人久久久久久久 | 亚洲欧美国产精品18p | 久久理论影院 | av一级片网站| 国产在线p | 99视频免费 | 国产精品无av码在线观看 | 97视频在线 | 成人免费看电影 | 欧美午夜精品久久久久久浪潮 | 超碰在线成人 | 精品不卡视频 | 色婷婷国产在线 | 日韩中文免费视频 | 中国一级特黄毛片大片久久 | 日韩电影中文字幕在线观看 | 国产一二三区av | 在线观看精品一区 | www免费在线观看 | 四虎永久免费在线观看 | 色先锋资源网 | 亚洲日韩中文字幕在线播放 | 久久狠狠婷婷 | 青草视频免费观看 | 日韩激情一二三区 | 国产日本在线观看 | 欧美成人久久 | 国产福利91精品一区 | 中文字幕在线看 | 亚洲最大激情中文字幕 | 亚洲一级黄色片 | 国产精品第一 | 99久久精品久久久久久清纯 | 在线成人国产 | 亚洲一区免费在线 | 中文字幕在线视频国产 | 午夜精品一区二区三区在线视频 | 久久激情五月婷婷 | 国产一区二区久久久久 | 国产伦理精品一区二区 | 国产99久久久国产精品成人免费 | 9免费视频 | 免费成人在线电影 | 日韩中文在线电影 | 成人资源在线播放 | 国产专区一 | 97成人在线视频 | 欧洲亚洲国产视频 | 91免费观看视频网站 | 日韩欧美在线影院 | 五月天丁香亚洲 | 99r在线精品 | 三级午夜片 | 精品人妖videos欧美人妖 | 久久一精品| 亚洲一区二区三区四区在线视频 | av片一区二区 | 超碰在线人人草 | 高清av网站 | 免费久久99精品国产婷婷六月 | 日韩系列| 96视频在线| 99热最新 | 国产亚洲情侣一区二区无 | 91在线视频播放 | 日韩欧美视频免费在线观看 | 97国产精品久久 | 色综合久久中文字幕综合网 | 中文字幕在线观看免费高清完整版 | 亚洲欧美日韩国产一区二区三区 | 欧美一级小视频 | 精品国产精品久久 | 三级av在线免费观看 | 伊人天天狠天天添日日拍 | 日韩精品欧美专区 | 日韩电影在线观看一区二区三区 | 亚洲韩国一区二区三区 | 亚洲视频在线播放 | 男女视频国产 | 久久九九久久九九 | 成人丁香花| 操操操日日日干干干 | av一级网站 | 最近中文字幕免费大全 | 日韩中字在线观看 | 国产专区在线看 | 日韩精品一区二区三区不卡 | 国产蜜臀av | 国产高清在线免费 | 东方av在线免费观看 | 亚洲成av片人久久久 | 日韩av片无码一区二区不卡电影 | 国产亚洲欧洲 | 成人动漫一区二区三区 | av电影免费看 | 免费一级黄色 | 日日射av | 久久99国产精品免费网站 | 久草视频免费在线播放 | 久久综合狠狠综合久久综合88 | 中文字幕在线字幕中文 | 91九色蝌蚪国产 | av观看免费在线 | 波多野结依在线观看 | 五月婷婷.com | 亚洲干视频在线观看 | 日日干天天射 | 国产成视频在线观看 | 国产精彩视频一区二区 | 偷拍视频一区 | 五月婷婷在线综合 | 麻豆精品传媒视频 | 国产精品免费观看视频 | av在线之家电影网站 | 手机av观看 | 午夜久久美女 | 免费精品视频在线观看 | 丁香花在线视频观看免费 | 99欧美视频 | 日本久久综合视频 | 97干com | 日本丶国产丶欧美色综合 | 国产在线视频导航 | 97在线观看免费高清完整版在线观看 | 亚洲综合在线观看视频 | 激情综合网婷婷 | 91夫妻视频 | 国产一区av在线 | 亚洲五月 | 91精品国产福利在线观看 | 国产片免费在线观看视频 | 国产99久久久久久免费看 | 黄色免费看片网站 | 五月婷婷开心 | 91久久黄色 | 在线观看中文字幕2021 | 中文国产成人精品久久一 | 色偷偷88欧美精品久久久 | 在线精品一区二区 | 开心激情婷婷 | 狠狠网站 | 91尤物国产尤物福利在线播放 | 亚洲福利精品 | 久草在线视频网 | 成人福利在线播放 | 国产精品专区h在线观看 | 天天色天天射天天操 | 国产高清在线观看 | 五月婷婷中文字幕 | 高潮久久久久久久久 | 日日操夜夜操狠狠操 | 国产视频高清 | 久久久久久久久久久久电影 | 日韩av一区二区三区在线观看 | 亚洲国产一区二区精品专区 | 成人黄色国产 | 久久国产精品第一页 | 中文一区在线 | 91秒拍国产福利一区 | 夜夜爽88888免费视频4848 | 伊人久久国产 | 一区二区三区精品在线 | av九九| 91麻豆精品国产91久久久无限制版 | 黄色大片日本免费大片 | 在线看岛国av | 超碰在97 | 久久视频这里有久久精品视频11 | 日韩成年视频 | 五月婷婷免费 | 久久久久久久久久久网站 | 国产免费观看av | 午夜精品99久久免费 | 天天综合91| 亚洲精品乱码久久久久久9色 | sm免费xx网站| 91精品综合在线观看 | 美女激情影院 | 久久久99国产精品免费 | 亚洲天堂网在线观看视频 | 夜夜嗨av色一区二区不卡 | 欧美一区二区在线免费观看 | 成人在线小视频 | 精品国内自产拍在线观看视频 | 久久国产手机看片 | 日韩网站中文字幕 | 色婷婷福利视频 | 国产视频在线免费观看 | 国产精品爽爽爽 | 亚洲电影一区二区 | 国产.精品.日韩.另类.中文.在线.播放 | 亚洲精品玖玖玖av在线看 | 日韩在线视频一区 | 国产一区二区精品 | 99精品国产免费久久 | 国产亚洲视频在线免费观看 | 狂野欧美激情性xxxx欧美 | 欧美福利片在线观看 | 69av网| 国产 日韩 欧美 在线 | 欧美一级性生活片 | 中文字幕视频一区二区 | 久久香蕉影视 | 福利视频一区二区 | 成人在线视频论坛 | 亚洲精品乱码久久久久久高潮 | 国产精品毛片一区二区 | 亚洲国产理论片 | 亚洲精品玖玖玖av在线看 | 亚洲一区天堂 | 在线免费高清视频 | 亚洲最新av网站 | 色.www| 一区免费视频 | 99热最新| 1000部国产精品成人观看 | 色在线高清 | 天天操夜夜操国产精品 | 国产电影黄色av | 香蕉视频免费在线播放 | 成年人精品 | 九精品| 亚洲国产激情 | 亚洲第一av在线播放 | 黄色精品一区 | 欧美在线一 | 中文字幕永久免费 | 天天干天天做天天爱 | 中文字幕欧美三区 | 韩日在线一区 | 在线观看涩涩 | 中文字幕免费观看视频 | 亚洲成人精品在线观看 | 中文字幕资源站 | 久久电影日韩 | 色综合激情久久 | 97视频在线观看免费 | 亚洲精品美女在线观看播放 | 天天操天天干天天干 | 欧美日韩精品网站 | 中文字幕在线播放第一页 | 深夜福利视频在线观看 | 999成人国产 | 亚洲成人网在线 | 国产精品一区二区美女视频免费看 | 久热电影 | 国产精品成人一区 | 国产精品女同一区二区三区久久夜 | 欧美在线视频精品 | 日韩欧美一区二区在线播放 | 久久这里有精品 | 久久久久一区 | 丝袜av网站 | www视频在线观看 | 丁香婷婷综合色啪 | 亚洲精品在 | 麻豆国产露脸在线观看 | 精品国产免费观看 | 91精品久久久久久粉嫩 | 成年美女黄网站色大片免费看 | 中文字幕亚洲在线观看 | 国产精品久久久久久高潮 | 久久久久99精品成人片三人毛片 | 天天干天天拍 | 日本久久成人中文字幕电影 | 日韩网站中文字幕 | 伊人亚洲精品 | 麻豆精品传媒视频 | 天天射天天操天天色 | 亚洲免费av一区二区 | 一区二区三区国 | 亚洲激情电影在线 | 国产精品亚 | 色综合咪咪久久网 | 国产精品成人免费 | 欧美日韩综合在线 | 日韩精品在线免费观看 | 一级黄色大片在线观看 | 91精品视频在线 | 97高清视频| 欧美极品一区二区三区 | 日韩av成人在线观看 | 西西444www| 日本成人a | 亚洲人成人在线 | www.夜夜操.com| 久草在线免费在线观看 | 亚洲精品免费视频 | 国产精品成人一区二区 | 天天干天天玩天天操 | 91成年人在线观看 | 久久久久久久久久毛片 | 国产精品一区免费在线观看 | 天天干天天操天天爱 | 91福利视频在线 | 国产精品久久久久久久久大全 | 日韩中文字幕免费视频 | 午夜国产福利在线观看 | 久久久久免费视频 | 久久视频99 | 欧美a在线免费观看 | 精品久久一区二区 | 国产亚洲精品电影 | 国产成人一区二区三区在线观看 | 最新中文字幕在线播放 | 欧美日韩精品免费观看 | 日本在线观看黄色 | 亚洲欧洲日韩在线观看 | 在线成人欧美 | 国产剧情在线一区 | 国产1区在线 | 日韩69av| 99久精品 | 日日操操操 | 高潮久久久久久久久 | a视频免费在线观看 | 久久综合免费 | 久久人人看| 午夜精品一区二区三区在线视频 | 日韩精品一区二区三区免费观看视频 | 五月天久久狠狠 | 四虎永久网站 | 国产精品久久久久影视 | 亚洲天堂在线观看完整版 | 香蕉视频在线观看免费 | 综合激情网... | 国产亚洲精品日韩在线tv黄 | 国产精品久久久久三级 | 狠狠干夜夜爱 | 国产免费高清视频 | 香蕉视频18 | 欧美精品小视频 | 成人免费看电影 | 人人玩人人添人人澡97 | 色综合天天做天天爱 | 伊人激情网 | 五月综合婷 | 在线观看日韩国产 | 成人免费色| 99视频国产精品 | 色偷偷888欧美精品久久久 | 中文视频在线 | 欧美一级性 | 精品久久久久久综合日本 | 天天操伊人 | 免费能看的av | 婷婷伊人综合亚洲综合网 | 精品国产观看 | 99亚洲视频| 韩国av在线 | 国产精品中文久久久久久久 | 五月婷婷电影网 | 五月天激情视频在线观看 | 久久久麻豆 | 日韩3区| 91九色蝌蚪国产 | 日韩大片在线免费观看 | 九九欧美 | 美女在线免费观看视频 | 亚洲色综合 | 日韩一级片观看 | 日本激情动作片免费看 | 婷婷综合成人 | 国产精品一区在线观看 | 性色av一区二区三区在线观看 | 五月激情婷婷丁香 | 韩国av免费观看 | 福利视频| 午夜精品久久久久久久99 | 久久久免费看视频 | 国产人成在线观看 | 丁香五月亚洲综合在线 | 亚洲天堂精品视频在线观看 | 美女视频网 | 六月婷色 | 国产亚洲久久 | 成人黄在线观看 | 在线观看免费黄视频 | 日韩理论在线播放 | 伊人电影天堂 | 久久久亚洲国产精品麻豆综合天堂 | 国产福利久久 | 九九九九九九精品任你躁 | 国产成人区 | 五月婷婷在线播放 | 日本狠狠干 | 在线观看黄污 | 五月天开心 | 色狠狠综合天天综合综合 | 亚洲综合色激情五月 | 99九九99九九九视频精品 | 91九色国产在线 | 欧美日韩一区二区在线观看 | 久久久性 | 色噜噜狠狠狠狠色综合 | 极品久久久久久久 | 亚洲综合激情小说 | 日韩毛片精品 | 韩国精品在线 | av大片免费在线观看 | 欧美在线一级片 | 国产黄色一级片 | av大全在线| 国产乱对白刺激视频不卡 | 成人精品国产免费网站 | 97在线观看免费 | 欧美日本在线观看视频 | 久久一区二区三区超碰国产精品 | 99精品免费网 | 日韩xxxbbb | 国产日韩中文字幕在线 | 久久国产电影 | 久草视频国产 | 成人免费中文字幕 | 中文字幕资源在线 | 丁香六月婷婷 | 国产精品一区二区在线免费观看 | 91久久久久久久一区二区 | 00av视频| 成人av资源网站 | 日本不卡123区 | 毛片888| 毛片网站在线看 | 久久精品国产一区二区三区 | 国产原创在线观看 | 天天综合在线观看 | 偷拍福利视频一区二区三区 | 中文字幕 在线看 | 欧洲精品亚洲精品 | 综合国产在线观看 | 激情影音| 亚洲日韩欧美一区二区在线 | 91香蕉国产 | 久久精品五月 | 日日爽 | 97精品国自产拍在线观看 | 五月天综合激情 | 97精品国产97久久久久久粉红 | 91亚洲精品在线 | 亚洲午夜精品久久久久久久久久久久 | 亚洲欧洲国产视频 | 婷婷六月天天 | 麻豆91精品视频 | 国产成人久久av | 久久久人| 国产剧情一区在线 | 日韩午夜在线观看 | 一本到视频在线观看 | 91视频免费看片 | 日韩中文字幕免费看 | 久久 精品一区 | 午夜精品久久久久久久99水蜜桃 | 97色综合 | 五月婷婷六月综合 | 97电影手机 | 美女视频又黄又免费 | 99欧美 | 国内精品在线一区 | 五月婷婷丁香在线观看 | 97超碰人人网 | 国产成人久久精品一区二区三区 | 91热视频| 丁香一区二区 | 成年美女黄网站色大片免费看 | 亚洲永久精品视频 | 天堂在线一区二区 | 天天综合精品 | 日韩精品资源 | 黄色一区二区在线观看 | 不卡的av电影 | 99精品久久久久久久 |