通过 TUN 接口路由所有流量

通过 TUN 接口路由所有流量

我希望我的所有流量都通过TUN接口。 以下是流程图

因此,如您所见,每个程序的流量都会路由到地址TUN上的 iface 10.0.0.1。然后,附加到的程序会对TUN数据包进行一些操作,然后将它们发送到我的路由器上192.168.1.1。然后它们通过互联网路由(例如,路由到我的代理服务器,但这对我的问题来说实际上并不重要)。

所以我的目标只是以那种方式路由流量:$any_program<--> tunX<--> 192.168.1.1 (the router)<-->意味着流量既进又出)。

我目前所做的:

  1. 首先,我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);
  1. 然后,我使用以下命令设置设备:
$ 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

我一直在玩iptablesip route程序,但我对它们都还算是新手。据我所知,iptables实际上并不路由数据包,而是过滤数据包(我可能错得很离谱)。那么有没有办法用路由数据包呢ip route

感谢您阅读我在这里写的所有这些新手内容。希望您能帮助我!

答案1

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

如果您将默认网关(目标 0.0.0.0)设置为 tun 接口而不是 wlp2s0,则所有流量都将通过 tun 接口。请不要使用 iptables 进行路由(这是我的一个小烦恼)。

但是,如果默认情况下所有内容都会发送到/来自我的 tun 接口,我该如何将流量发送到互联网?

所以你不想全部您的流量将通过 TUN 接口。

如果使用 tun 的程序是真正的隧道 (VPN),则可以向隧道的另一个端点添加一条附加路由(查看效果openvpn,尝试openvpn使用众多免费 VPN 之一并观察路由表。您将看到的0.0.0.0/1128.0.0.0/1是默认路由的替代品,因为这样他们就可以保留旧的默认路由)。

如果您希望 TUN 应用程序成为某种代理,并从 TUN 应用程序建立到互联网上任何地方的连接,那么您无法通过路由来实现这一点。要么使用网络命名空间(然后您可以有两个默认路由),要么您确实需要使用iptables并找出某种方法来区分来自 TUN 应用程序的数据包。

相关内容