私はCMU用の月探査船を開発する学生であり、月探査船の2つのデバイス間のTUNインターフェース通信を使用する必要があります。 TUNインターフェイスを作成できますが、CはそのIPアドレスを割り当てることはできません。
TUNデバイスの製造後の現在の状態は次のとおりです。
41: tun11: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 500
link/none
希望の状態は次のとおりです。
14: tun71: <POINTOPOINT,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 500
link/none
inet 192.168.0.29 peer 192.168.0.23/32 scope global tun71
valid_lft forever preferred_lft forever
ifreqにdstaddrを設定しようとしましたが、役に立ちません。
int fd;
int dst_fd;
struct ifreq ifr;
struct sockaddr_in* addr;
struct sockaddr_in* dst_addr;
fd = socket(AF_INET, SOCK_DGRAM, 0);
dst_fd = socket(AF_INET, SOCK_DGRAM, 0);
ifr.ifr_addr.sa_family = AF_INET;
memcpy(ifr.ifr_name, "tun11", IFNAMSIZ - 1);
addr = (struct sockaddr_in*)&ifr.ifr_addr;
dst_addr = (struct sockaddr_in*)&ifr.ifr_dstaddr;
inet_pton(AF_INET, ip_address, &addr->sin_addr);
inet_pton(AF_INET, ip_address, &dst_addr->sin_addr);
int err;
if ( (err = ioctl(fd, SIOCSIFADDR, &ifr)) == -1 ) {
perror("ioctl SIOCSIFFLAGS");close(fd);exit(1);
}
私は何をすべきかわかりません。コマンドを発行した後、IPをデバッグしようとしていますが、不明です。
答え1
まだしなかったら、テストチューニングの作成:
# ip tuntap add mode tun dev tun0
# ip address show dev tun0
5: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 500
link/none
これは質問の内容と非常に似ているようです。今到着どのコードが必要かを確認してください...
// uptun.c - set an IP address and UP a tun
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h> /* offsetof */
#include <net/if.h>
#include <net/if.h>
#include <linux/sockios.h>
#include <netinet/in.h>
#if __GLIBC__ >=2 && __GLIBC_MINOR >= 1
#include <netpacket/packet.h>
#include <net/ethernet.h>
#else
#include <asm/types.h>
#include <linux/if_ether.h>
#endif
// TWEAK
#define IFNAME "tun0"
#define HOST "192.168.0.29"
#define ifreq_offsetof(x) offsetof(struct ifreq, x)
int main(int argc, char **argv) {
struct ifreq ifr;
struct sockaddr_in sai;
int sockfd; /* socket fd we use to manipulate stuff with */
int selector;
unsigned char mask;
char *p;
/* Create a channel to the NET kernel. */
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
/* get interface name */
strncpy(ifr.ifr_name, IFNAME, IFNAMSIZ);
memset(&sai, 0, sizeof(struct sockaddr));
sai.sin_family = AF_INET;
sai.sin_port = 0;
sai.sin_addr.s_addr = inet_addr(HOST);
p = (char *) &sai;
memcpy((((char *) &ifr + ifreq_offsetof(ifr_addr))), p,
sizeof(struct sockaddr));
ioctl(sockfd, SIOCSIFADDR, &ifr);
ioctl(sockfd, SIOCGIFFLAGS, &ifr);
ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
// ifr.ifr_flags &= ~selector; // unset something
ioctl(sockfd, SIOCSIFFLAGS, &ifr);
close(sockfd);
return 0;
}
これは私たちに以下を提供します。
# make uptun
cc uptun.c -o uptun
# ./uptun
# ip address show dev tun0
5: tun0: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 500
link/none
inet 192.168.0.29/32 scope global tun0
valid_lft forever preferred_lft forever
ピアアドレスのみがありません。一部のaltagoobingleduckgoingは、tunにSIOCSIFDSTADDR
(設定された宛先、duh)が追加されていることを示しますSIOCSIFADDR
。この行の後にスクリプトに入れてみましょう
SIOCGIFFLAGS
...
// KLUGE copypasta in the destination address
sai.sin_addr.s_addr = inet_addr("192.168.0.23");
p = (char *) &sai;
memcpy((((char *) &ifr + ifreq_offsetof(ifr_addr))), p,
sizeof(struct sockaddr));
ioctl(sockfd, SIOCSIFDSTADDR, &ifr);
コンパイルして再実行すると、次の結果uptun
が表示されます。
# ip address show dev tun0
5: tun0: <NO-CARRIER,POINTOPOINT,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 500
link/none
inet 192.168.0.29 peer 192.168.0.23/32 scope global tun0
valid_lft forever preferred_lft forever