macos - 如何在 macOS 中创建虚拟界面?

标签 macos vpn

我想为我无法设置 VPN 的设备编写一个简单的 VPN。在 Linux 中我可以创建一个 tun 接口(interface)来处理这个问题。但在 macOS 中,我在 /dev/ 中找不到任何 tun 接口(interface)。

我发现一些实现此功能的软件创建了utun2接口(interface),我不知道该怎么做。有什么好的例子吗?

最佳答案

关于这个问题,我找到了两个很好的链接。

OpenVPNA node packe

下面是如何在 macOS 中创建 uTun 界面:

#include <uv.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/kern_event.h>
#include <sys/socket.h>
#include <strings.h>
#include <sys/ioctl.h>
#include <sys/kern_control.h>
#include <ctype.h>
#include <fcntl.h>


#define UTUN_CONTROL_NAME "com.apple.net.utun_control"
#define UTUN_OPT_IFNAME 2

int open_tun_socket () {
  struct sockaddr_ctl addr;
  struct ctl_info info;
  char ifname[20];
  socklen_t ifname_len = sizeof(ifname);
  int fd = -1;
  int err = 0;

  fd = socket (PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
  if (fd < 0) return fd;

  bzero(&info, sizeof (info));
  strncpy(info.ctl_name, UTUN_CONTROL_NAME, MAX_KCTL_NAME);

  err = ioctl(fd, CTLIOCGINFO, &info);
  if (err != 0) goto on_error;

  addr.sc_len = sizeof(addr);
  addr.sc_family = AF_SYSTEM;
  addr.ss_sysaddr = AF_SYS_CONTROL;
  addr.sc_id = info.ctl_id;
  addr.sc_unit = 0;

  err = connect(fd, (struct sockaddr *)&addr, sizeof (addr));
  if (err != 0) goto on_error;

  // TODO: forward ifname (we just expect it to be utun0 for now...)
  err = getsockopt(fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, ifname, &ifname_len);
  if (err != 0) goto on_error;

  printf("%s",ifname);

  // There is to close the socket,But in this case I don't need it.
  //err = fcntl(fd, F_SETFL, O_NONBLOCK);
  //if (err != 0) goto on_error;

  //fcntl(fd, F_SETFD, FD_CLOEXEC);
  //if (err != 0) goto on_error;

on_error:
  if (err != 0) {
    close(fd);
    return err;
  }

  return fd;
}

int main(){
    int result = open_tun_socket();
    while( true ){
    }
    printf("%d",result);
}

关于macos - 如何在 macOS 中创建虚拟界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56003563/

相关文章:

c++ - Mac OS X 中的 ACL - 查找 GUID

macos - 如何将NSString写入NSView?

vpn - 了解 Juniper Connect VPN session 的领域是什么?

java - Java 服务器和 Arduino 客户端之间的安全通信 : need a suggestion

c++ - Xcode 中的清屏

macos - Mac OS 中类似 PropertyGrid 的控件

c - 如何正确设置sigaltstack?

installation - 无法通过 Wireguard 隧道访问 PiHole DNS 服务?

for-loop - for 循环在 CMD 提示符下工作但不在批处理文件中 - for 循环被复制粘贴

windows - 在 PowerShell 中创建 VPN 连接