kcptun
kcptun copied to clipboard
是否考虑增加网络接口绑定的共功能?
是否考虑增加网络接口绑定的共功能? 需求场景: 比如 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 创建的时候,有没有类似的 功能。
这样的好处就是,当系统中有多个 网络接入的时候,可从指定 我想使用的 网络,谢谢。
https://docs.docker.com/v17.09/engine/userguide/networking/ https://codeday.me/bug/20190402/868621.html 我建议还是通过docker调节,你看下
嗯,你说的是另一个思路,但这依赖docker,把事情搞得有点复杂。 go 在向网络写数据的时候,应该是可以指定网卡的,你参见一下这个人 发送http的需求,希望参考有帮助 https://www.jb51.cc/go/191313.html
技术上是肯定可以的,只不过我有点不想动
嗯,很多网络工具都提供类似的参数设定,如ping 命令的-s (src card) ,iperf的-B (-bind) 等。这个特性还是很有用的。谢谢,我有空也看看go 语言。
xtaci ,我大致看了kcptun的代码,要实现这个功能,是不是要改 kcp-go的代码实现?
不需要,用这个接口https://godoc.org/github.com/xtaci/kcp-go#NewConn
谢谢 改好了
@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) }