我希望我所有的流量都通过TUN接口。

因此,正如您所看到的,流量从每个程序被路由到TUN地址的10.0.0.1地址。然后,附加到TUN上的程序处理数据包,然后将它们发送到192.168.1.1上的路由器。然后,它们被路由到Internet上(例如,我的代理服务器,但实际上对我的问题并没有多大影响)。
因此,我的目标就是以这种方式路由流量:$any_program <-> tunX <-> 192.168.1.1 (the router) (<--> thing意味着输入和输出的流量)。
到目前为止我所做的:
tunX设备:int tun_open(char *device)
{
struct ifreq ifr;
int fd, err;
fd = open("/dev/net/tun", O_RDWR);
if (fd == -1)
{
perror("opening /dev/net/tun");
exit(1);
}
memset(&ifr, 0, sizeof (ifr));
ifr.ifr_flags = IFF_TUN;
strncpy(ifr.ifr_ifrn.ifrn_name, device, IFNAMSIZ);
err = ioctl(fd, TUNSETIFF, (void *) &ifr);
if (err == -1)
{
perror("ioctl TUNSETIFF");
close(fd);
exit(1);
}
return fd;
}然后:
tunfd = tun_open("tun6");另外,我启用了TUNSETPERSIST:
ioctl(tunfd, TUNSETPERSIST, 1) < 0);$ sudo ip addr add 10.0.0.1/24 dev tun6
$ sudo ip link set tun6 up 程序从tunfd中读取并输出内容。到目前为止,它唯一读到的内容如下:
:B\{k
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 1
ST: urn:dial-multiscreen-org:service:dial:1
USER-AGENT: Google Chrome/86.0.4240.198 Linux
% N%*.%K%M%P%M%M%M%HP%,%M%*K%(aP%>O%M%LqP%@K%`P%P%Ҵ u@=U繤湤}=UoK%0=U发现?为什么这个要通过我的tun界面?
route -n的输出:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 600 0 0 wlp2s0
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun6
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp2s0
192.168.1.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp2s0我一直在玩iptables和ip route程序,但在所有这些方面我都是新手。据我所知,iptables实际上并不是路由数据包,而是过滤它们(我可能大错特错)。那么,有办法用ip route路由数据包吗?
发布于 2021-01-10 23:06:38
正常路由基于目的地,而不是接口(除非配置基于策略的路由),因此需要将所有出站流量路由到10.0.0.0/24网络:
ip route del default
ip route add default via 10.0.0.254实际上,在10.0.0.0/24中通过哪个地址发送它并不重要,它应该到达您的程序。
https://serverfault.com/questions/1048393
复制相似问题