是否考虑增加网络接口绑定的共功能?
需求场景:
比如 client 端,我有多个物理网络接口(如网卡,usb 4g卡 等),我希望udp 隧道 建立在我指定的 物理网卡上。
你listen在你需要的网卡的IP上就行了啊
我理listen 是指定 监听 "host:port",及提供服务的tcp 端口;而我想指定 udp数据包发送的网卡(假设我 当前机器有2块网卡 ,Wifi连接 + LAN以太网有线 ), kcptun 工作时,我想 指定udp client 用我指定的网络接口(某个本机ip对应的网卡)发出udp数据包。不知道我表达清楚了没有。话句话说,listen 参数后面的host ,也会用于绑定 udp client 的创建吗。
不支持这种,你说是路由层面。
udp部分是用的默认系统路由,你可以尝试调节路由表,比如iptables配合route命令做策略路由。
当然,这比较复杂,另一个可行的办法是用docker,把nic预先bind到docker instance。
xtaci,你理解我的意思太好了。大多数编程语言操做 socket client 的时候都能 指定网络接口地址的,我对go不熟悉,所以不知道go 写udp client的时候 是否有办法。java netty 大概像下面这样就可以了:
Bootstrap b = new Bootstrap();
b.group(group).channel(NioDatagramChannel.class).handler(clientHandler);
。。。
Channel ch = b.bind(“192.168.1.100”, 0).sync().channel();//绑定特定的本地网卡地址
这样 ch 写数据时,数据只会从192.168.1.100 网卡发出。
你方便的时候看看go 的udp client 创建的时候,有没有类似的 功能。
这样的好处就是,当系统中有多个 网络接入的时候,可从指定 我想使用的 网络,谢谢。
嗯,你说的是另一个思路,但这依赖docker,把事情搞得有点复杂。
go 在向网络写数据的时候,应该是可以指定网卡的,你参见一下这个人 发送http的需求,希望参考有帮助
https://www.jb51.cc/go/191313.html
技术上是肯定可以的,只不过我有点不想动
嗯,很多网络工具都提供类似的参数设定,如ping 命令的-s (src card) ,iperf的-B (-bind) 等。这个特性还是很有用的。谢谢,我有空也看看go 语言。
xtaci ,我大致看了kcptun的代码,要实现这个功能,是不是要改 kcp-go的代码实现?
谢谢 改好了
@hedahong Can you share your patch? Thanks!
@hedahong Can you share your patch? Thanks!
func dialAndBindUdp(config Config, block kcp.BlockCrypt) (kcp.UDPSession, error) {
udpaddr, err := net.ResolveUDPAddr("udp", config.BindUDP)
if err != nil {
return nil, errors.WithStack(err)
}
network := "udp4"
if udpaddr.IP.To4() == nil {
network = "udp"
}
conn, err := net.ListenUDP(network, udpaddr)
if err != nil {
return nil, errors.WithStack(err)
}
return kcp.NewConn(config.RemoteAddr, block, config.DataShard, config.ParityShard, conn)
}
Most helpful comment
你listen在你需要的网卡的IP上就行了啊