我希望我的所有流量都通过TUN
接口。
因此,如您所见,每个程序的流量都会路由到地址TUN
上的 iface 10.0.0.1
。然后,附加到的程序会对TUN
数据包进行一些操作,然后将它们发送到我的路由器上192.168.1.1
。然后它们通过互联网路由(例如,路由到我的代理服务器,但这对我的问题来说实际上并不重要)。
所以我的目标只是以那种方式路由流量:$any_program
<--> tunX
<--> 192.168.1.1 (the router)
(<-->
意味着流量既进又出)。
我目前所做的:
- 首先,我
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
ssdp:discover?为什么这会通过我的 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
?
答案1
正常路由基于目的地,而不是接口(除非您配置基于策略的路由),因此您需要将所有出站流量路由到网络10.0.0.0/24
:
ip route del default
ip route add default via 10.0.0.254
实际上,您通过哪个地址发送它并不重要10.0.0.0/24
,它都应该到达您的程序。