【问题标题】:Can I bind a client socket to an ip not belongs to any interfaces?我可以将客户端套接字绑定到不属于任何接口的 ip 吗?
【发布时间】:2017-01-11 03:14:38
【问题描述】:

对于客户端套接字,我可以使用 bind() 将其绑定到特定的源 IP 地址以选择特定的接口。或者我可以直接使用 connect() 然后它会根据路由表选择源 ip。

我想知道我可以将客户端套接字绑定到不属于任何接口的 ip 吗?例如:我有两个接口: eth0 : ip0 eth1 : ip1

(1) 如果我将客户端套接字绑定到 ip2。这可行吗? (2) 如果 (1) 可行,假设客户端套接字通过 eth0 发送数据包。然后我在这个客户端主机中配置 iptables,将所有传入的数据包转发到 ip0(eth0)。在这种情况下,如果有从服务器端发回的数据包,其目标 IP 地址为 ip2(假设此数据包将到达我的客户端主机)。我的客户端套接字会收到数据包吗?

提前致谢。

【问题讨论】:

    标签: sockets routing ip iptables


    【解决方案1】:

    我不太明白你的问题,但这里是:

    对于客户端套接字,您通常希望操作系统及其路由表使用任何可用端口为您选择最佳接口。在这种情况下,您绑定到 INADDR_ANY (0) 和端口 0。或者根本不显式调用 bind。只需调用 connect(),它就会做正确的事情。

    如果您需要通过特定接口进行客户端连接,则将套接字绑定到特定 IP 地址。然后操作系统将尝试将该接口用于后续的连接调用和之后的所有流量。

    尝试将套接字绑定到不属于本地接口的 IP 肯定会导致错误。

    不知道你对 iptables 的意思是什么。听起来很冒险。

    【讨论】:

    • 我尝试做的是一个程序作为网络流量生成器。我有一个客户端主机和一个服务器主机以及两者之间的交换机。我想在客户端和服务器之间发送流量,这些流量应该有多个客户端 ip 服务器 ip 对(模拟我们有多个订阅者和服务器的情况)。例如。 :客户端 ips 范围从 20.0.0.0 - 20.0.0.9,服务器 ips 范围从 21.0.0.0 - 21.0.0.9 在这种情况下,我需要在客户端主机中有 10 个套接字,每个套接字应该与 20.0.0.0 的 ip 绑定 - 20.0.0.9。但是我的界面会有另一个 ips(至少它不会有所有这些 IPs)。
    • iptables是linux命令,用于在linux中设置防火墙规则。
    【解决方案2】:

    请看:

    https://www.rsyslog.com/doc/v8-stable/configuration/modules/omfwd.html#ipfreebind

    男:

    https://man7.org/linux/man-pages/man7/ip.7.html

    IP_FREEBIND(自 Linux 2.4 起) 如果启用,此布尔选项允许绑定到 IP 非本地地址或(尚)不存在的地址。这 允许监听套接字,而不需要 底层网络接口或指定的动态 IP 申请时的地址 试图绑定到它。此选项是每个套接字 相当于 ip_nonlocal_bind /proc 接口 如下所述。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2011-12-23
      • 2012-06-29
      • 2011-03-16
      相关资源
      最近更新 更多