【发布时间】:2021-07-11 08:49:20
【问题描述】:
如何将读取的数据包从 tun 发送到服务器?我通过 Wireshark 检查了数据包,它们都是 DNS 请求,并将我系统的默认网关更改为我的 VM 的 IP,所有数据包都在那里。 tun 运行良好,我可以打印有关数据包的所有内容,但问题是我不知道如何将它们转发到目标服务器。 (我知道套接字编程)
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <netdb.h>
#include <fcntl.h>
#include <signal.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#include <linux/ip.h>
#include <arpa/inet.h>
#include <netinet/in.h>
struct sockaddr_in Packet, dest;
#define Tun_Device "tun0"
static int max(int a, int b){
return a > b ? a : b;
}
int read_tun(char *name, int type){
struct ifreq ifr;
int tun_fd;
tun_fd = open("/dev/net/tun", O_RDWR)
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = type;
strncpy(ifr.ifr_name, name, IFNAMSIZ);
ioctl(tun_fd, TUNSETIFF, (void *)&ifr);
return tun_fd;
}
int main(){
int tun_fd, packet_length, tcpfd;
struct sockaddr_in cliaddr, servaddr;
char buffer[2048];
char destination[16];
int i = 0;
struct iphdr *iph = (struct iphdr*) buffer;
tun_fd = read_tun(Tun_Device, IFF_TUN | IFF_NO_PI);
while (1) {
fd_set readset;
FD_ZERO(&readset);
FD_SET(tun_fd, &readset);
FD_SET( , &readset);
int max_fd = max(tun_fd, udp_fd) + 1;
select(max_fd, &readset, NULL, NULL, NULL)
if (FD_ISSET( , &readset)) {
}
if (FD_ISSET( , &readset)) {
}
}
}
【问题讨论】:
-
无论如何,我想澄清一下,“将它们转发到目标服务器”到底是什么意思?您已成功从 TUN 设备读取数据包,但您想通过套接字将其发送到服务器?或者您希望服务器转发数据包,以便您的客户端可以通过服务器 IP 地址进行互联网连接,例如 VPN?
标签: c linux sockets networking tun