すべてのトラフィックを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
、プログラムに届くはずです。