【问题标题】:binding socket to specific interface将套接字绑定到特定接口
【发布时间】:2016-10-23 16:43:02
【问题描述】:

我正在尝试将套接字绑定到特定的(环回)接口lo,以防止外部流量干扰它:

int bind_socket(uint8_t *iface, uint8_t port) {
        int rv;
        struct sockaddr_in addr;
        rv = socket(AF_INET, SOCK_STREAM, 0);
        if (rv < 0) return -1;
        if (setsockopt(rv, SOL_SOCKET, SO_BINDTODEVICE, iface, strlen(iface)) < 0) {
                return -2;
        }
        bzero((char *) &addr, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_port = htons(port);
        if (bind(rv, (struct sockaddr *) &addr, sizeof(addr)) < 0)
                return -3;
        return rv;
}

...

int ss;
ss = bind_socket("lo", 100);

但是,如果我运行nmap localhost -e wlpXsX,我不应该得到指示套接字可通过该接口使用的输出。相反,它被报告为可用;我似乎无法推断出原因。为什么这个接口可以通过一个旨在使其对所有其他接口不可用的程序全局可用?

【问题讨论】:

  • XY 问题?如果你想要一个只用于本地通信的套接字,你为什么要使用 AF_INET 套接字呢?

标签: c sockets interface


【解决方案1】:

你写道:

我正在尝试将套接字绑定到特定(环回)接口

但你编码:

addr.sin_addr.s_addr = INADDR_ANY;

INADDR_ANY (0.0.0.0) 不是环回接口。您需要将其更改为 INADDR_LOOPBACK (127.0.0.1):

addr.sin_addr.s_addr = htons(INADDR_LOOPBACK);

【讨论】:

  • 他说是要绑定接口,而不是绑定地址。 127.0.0.2呢,也是loopback。
  • 这个答案不能解决我的问题。我仍然可以从其他接口检测到套接字。
【解决方案2】:

似乎nmap 忽略了接口开关,并通过环回接口路由其探测。将我的 LAN 地址作为目标而不是 localhost 传递,并将我的 LAN 接口作为nmap 的接口参数传递了预期的结果,即使用以下源代码在本地主机外部不可见套接字:

int bind_lo(int port) {
        int rv;
        const char iface[] = "lo";
        struct sockaddr_in addr;
        rv = socket(AF_INET, SOCK_STREAM, 0);
        if (rv < 0) return -1;
        bzero((char *) &addr, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
        addr.sin_port = htons(port);
        if (bind(rv, (struct sockaddr *) &addr, sizeof(addr)) < 0)
                return -2;
        if (setsockopt(rv, SOL_SOCKET, SO_BINDTODEVICE, iface, strlen(iface) + 1) < 0) {
                return -3;
        }
        return rv;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 2015-05-10
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多