如何使用本机代码C在Android上打开tap设备?

时间:2014-07-14 20:29:17

标签: android-ndk vpn openvpn ioctl tun

我正在尝试为基于Android的应用程序构建VPN客户端移动设备,该应用程序通过VPN隧道连接到虚拟基础架构。我有类似的Linux / Windows应用程序,我知道如何打开tun / tap设备(打开/ dev / net / tun)。我们如何使用C为Android做同样的事情?

android.net API中的类VpnService究竟做了什么?

2 个答案:

答案 0 :(得分:8)

如果您仍想在Android上打开一个隧道 - 本机C,我建议看看android本身是如何打开它的(来自文件:services/jni/com_android_server_connectivity_Vpn.cpp

static int create_interface(int mtu)
{
    int tun = open("/dev/tun", O_RDWR | O_NONBLOCK);
    ifreq ifr4;
    memset(&ifr4, 0, sizeof(ifr4));
    // Allocate interface.
    ifr4.ifr_flags = IFF_TUN | IFF_NO_PI;
    if (ioctl(tun, TUNSETIFF, &ifr4)) {
        ALOGE("Cannot allocate TUN: %s", strerror(errno));
        goto error;
    }
    // Activate interface.
    ifr4.ifr_flags = IFF_UP;
    if (ioctl(inet4, SIOCSIFFLAGS, &ifr4)) {
        ALOGE("Cannot activate %s: %s", ifr4.ifr_name, strerror(errno));
        goto error;
    }
    // Set MTU if it is specified.
    ifr4.ifr_mtu = mtu;
    if (mtu > 0 && ioctl(inet4, SIOCSIFMTU, &ifr4)) {
        ALOGE("Cannot set MTU on %s: %s", ifr4.ifr_name, strerror(errno));
        goto error;
    }
    return tun;
error:
    close(tun);
    return SYSTEM_ERROR;
}

答案 1 :(得分:6)

VpnService类完全符合您的需要。它提供对tun设备的访问。如果没有root权限,则无法直接打开/ dev / net / tun。请参阅ToyVPN示例项目或OpenVPN for Android等开源VPN项目。