Networking 使用特定地址/接口拨号?戈兰尼
我的计算机上有两个网络接口(eth0和eth1),我正在尝试使用一个特定的接口(eth1)拨号连接。假设Go是一种系统语言,我也这么认为,但在当前的标准库中真的有可能吗 到目前为止,我必须按名称获取接口(Networking 使用特定地址/接口拨号?戈兰尼,networking,go,network-programming,Networking,Go,Network Programming,我的计算机上有两个网络接口(eth0和eth1),我正在尝试使用一个特定的接口(eth1)拨号连接。假设Go是一种系统语言,我也这么认为,但在当前的标准库中真的有可能吗 到目前为止,我必须按名称获取接口(eth1),然后我对该方法进行范围分析,并提取第一个地址[0],它似乎是eth1接口的源地址(例如xxx.xxx.xxx/24);另一个是ipv6地址。 我已经创建了一个新的和已提取地址的集合。然而,我得到了这个错误不匹配的本地地址类型,它似乎与来自的dialSingle函数有关 编辑 一些代码
eth1
),然后我对该方法进行范围分析,并提取第一个地址[0],它似乎是eth1接口的源地址(例如xxx.xxx.xxx/24);另一个是ipv6地址。我已经创建了一个新的和已提取地址的集合。然而,我得到了这个错误
不匹配的本地地址类型
,它似乎与来自的dialSingle函数有关
编辑
一些代码:
package main
import (
"net"
"log"
)
func main(){
ief, err := net.InterfaceByName("eth1")
if err !=nil{
log.Fatal(err)
}
addrs, err := ief.Addrs()
if err !=nil{
log.Fatal(err)
}
d := net.Dialer{LocalAddr: addrs[0]}
_, err = d.Dial("tcp", "google.com:80")
if err != nil {
log.Fatal(err)
}
}
输出:
2014/12/10 17:11:48拨号tcp 216.58.208.32:80:不匹配的本地地址类型ip+net
当您从接口中提取地址时,它的类型是*net.IPnet
封装在net.Addr
接口中,该接口包含地址和网络掩码而不是地址和端口。您可以使用IP地址,但是,在将其断言为*net.IPnet
ief, err := net.InterfaceByName("eth1")
if err !=nil{
log.Fatal(err)
}
addrs, err := ief.Addrs()
if err !=nil{
log.Fatal(err)
}
tcpAddr := &net.TCPAddr{
IP: addrs[0].(*net.IPNet).IP,
}
我很难复制这个——你能举个例子说明你是如何获得地址和创建拨号程序的吗?@JimB谢谢你的关注。我发布了一些代码。似乎不管我使用的地址/接口是什么,我都会收到错误,因此我只能假设我在
拨号程序中提供的地址。LocalAddr
不是它编译时所期望的格式。我已经调查过了,Go分配的默认类型似乎有相同的IP地址(接口的src),但也有一个端口号。我不确定为什么需要该端口以及如何获取/分配它。使用端口:0,它可能是规范的一部分,因为某些协议可能需要特定的源端口,因此它们需要某种方式让您指定:0是短暂的“随机”(未使用)port@DavidBudworth谢谢仍然Addr[似乎是一个接口。我应该调用String()方法,用端口号替换子网(/24)并将其转换/实现为接口吗?下面是一个示例。结果表明,您需要*net.IPNet,然后获取那个家伙的IP。(这将获取我的mac wifi卡的Addr,将en0更改为eth1)非常感谢!我不知道为什么我没有看到你早些时候的答案…不知怎么的,我最终也得到了一个TCPAddr。但是问题是,除非使用的接口是默认接口,否则拨号器无法工作。知道这是一个Go错误还是内核问题吗?默认我指的是在运行ip route sho时,通过开发人员作为默认提供的一个w
别担心,这似乎是一个驱动程序问题。在某些机器上工作(即在我的mac上),在其他机器上不工作(即在我的服务器上)。请记住,地址顺序不受保证,因此您需要检查是否使用IPv4或IPv6。此外,请注意,绑定到IP不会将您绑定到特定设备。传出设备在路由时确定,由于网络不匹配或存在反向路径检查等限制,流量可能会被阻止。谢谢你的建议。我已经考虑到订单没有保证。关于设备投标,我想这就是为什么它在某些机器(例如mac)上有效,而在其他机器(例如ubuntu)上无效的原因。你知道我如何在没有外部路由(例如iptables/ip路由)的情况下绑定到特定的设备/nic吗?有一些像wget这样的程序(--bind address
)和cURL(--interface
)这可以做到这一点,但我不确定它们在内部是如何工作的。最初的问题是如何使用特定的网络接口拨号。在Linux上,您可以使用syscall.BindToDevice
,但这是一种特权呼叫,通常不是正确的解决方案。如果curl可用,这可能就是curl所做的。首先找出它在网络上失败的原因级别(您的名称解析是否失败?)。如果问题只是目标与另一个接口的默认网关匹配,则需要添加路由来修复它。相关: