透過 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:發現?為什麼這會通過我的 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

正常路由是基於目的地,而不是介面(除非您配置基於策略的路由),因此您需要將所有出站流量路由到網路10.0.0.0/24

ip route del default
ip route add default via 10.0.0.254

實際上,透過哪個地址發送它並不重要10.0.0.0/24,它應該到達您的程式。

相關內容