xtaci / kcptun

A Quantum-Safe Secure Tunnel based on QPP, KCP, FEC, and N:M multiplexing.
MIT License
13.9k stars 2.54k forks source link

是否考虑增加网络接口绑定的共功能? #741

Open hedahong opened 4 years ago

hedahong commented 4 years ago

是否考虑增加网络接口绑定的共功能? 需求场景: 比如 client 端,我有多个物理网络接口(如网卡,usb 4g卡 等),我希望udp 隧道 建立在我指定的 物理网卡上。

xtaci commented 4 years ago

你listen在你需要的网卡的IP上就行了啊

hedahong commented 4 years ago

我理listen 是指定 监听 "host:port",及提供服务的tcp 端口;而我想指定 udp数据包发送的网卡(假设我 当前机器有2块网卡 ,Wifi连接 + LAN以太网有线 ), kcptun 工作时,我想 指定udp client 用我指定的网络接口(某个本机ip对应的网卡)发出udp数据包。不知道我表达清楚了没有。话句话说,listen 参数后面的host ,也会用于绑定 udp client 的创建吗。

xtaci commented 4 years ago

不支持这种,你说是路由层面。 udp部分是用的默认系统路由,你可以尝试调节路由表,比如iptables配合route命令做策略路由。 当然,这比较复杂,另一个可行的办法是用docker,把nic预先bind到docker instance。

hedahong commented 4 years ago

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 创建的时候,有没有类似的 功能。

这样的好处就是,当系统中有多个 网络接入的时候,可从指定 我想使用的 网络,谢谢。

xtaci commented 4 years ago

https://docs.docker.com/v17.09/engine/userguide/networking/ https://codeday.me/bug/20190402/868621.html 我建议还是通过docker调节,你看下

hedahong commented 4 years ago

嗯,你说的是另一个思路,但这依赖docker,把事情搞得有点复杂。 go 在向网络写数据的时候,应该是可以指定网卡的,你参见一下这个人 发送http的需求,希望参考有帮助 https://www.jb51.cc/go/191313.html

xtaci commented 4 years ago

技术上是肯定可以的,只不过我有点不想动

hedahong commented 4 years ago

嗯,很多网络工具都提供类似的参数设定,如ping 命令的-s (src card) ,iperf的-B (-bind) 等。这个特性还是很有用的。谢谢,我有空也看看go 语言。

hedahong commented 4 years ago

xtaci ,我大致看了kcptun的代码,要实现这个功能,是不是要改 kcp-go的代码实现?

xtaci commented 4 years ago

不需要,用这个接口https://godoc.org/github.com/xtaci/kcp-go#NewConn

hedahong commented 4 years ago

谢谢 改好了

ghost commented 4 years ago

@hedahong Can you share your patch? Thanks!

hedahong commented 4 years ago

@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) }