Skip to content
Snippets Groups Projects
Verified Commit fd68d581 authored by Sam Whited's avatar Sam Whited
Browse files

pkg/vpn: support OBFS4 over KCP


Signed-off-by: default avatarSam Whited <sam@samwhited.com>
parent ebd23e55
Branches obfs4_over_kcp
No related tags found
No related merge requests found
......@@ -88,7 +88,6 @@ ThemedPage {
// we need to fallback to "auto" selection if such location does not
// offer bridges
useBridges(checked)
useUDP.enabled = !checked
}
}
......@@ -166,7 +165,6 @@ ThemedPage {
}
onClicked: {
doUseUDP(checked)
useBridgesCheckBox.enabled = areBridgesAvailable()
}
}
}
......@@ -225,8 +223,7 @@ ThemedPage {
function areBridgesAvailable() {
// FIXME check if provider offers it
let providerSupport = true
return providerSupport && !useUDP.checked
return true
}
function useBridges(value) {
......
......@@ -31,6 +31,8 @@ import (
"0xacab.org/leap/bitmask-vpn/pkg/config"
"0xacab.org/leap/obfsvpn"
"github.com/xtaci/kcp-go/v5"
)
const (
......@@ -64,7 +66,7 @@ func (b *Bitmask) CanStartVPN() bool {
return !b.bonafide.NeedsCredentials()
}
func (b *Bitmask) startTransport(host string) (proxy string, err error) {
func (b *Bitmask) startTransport(host string, udp bool) (proxy string, err error) {
// TODO configure port if not available
proxy = "127.0.0.1:4430"
if b.listener != nil {
......@@ -104,21 +106,31 @@ func (b *Bitmask) startTransport(host string) (proxy string, err error) {
continue
}
dialer.IATMode = obfsvpn.IATMode(iatMode)
go clientHandler(b.listener, dialer, target)
go clientHandler(b.listener, dialer, target, udp)
log.Println("Connected via obfs4 to", gw.IPAddress, "(", gw.Host, ")")
return proxy, nil
}
return "", fmt.Errorf("No working gateway for transport %s: %v", b.transport, err)
}
func clientHandler(ln net.Listener, dialer *obfsvpn.Dialer, target string) {
func clientHandler(ln net.Listener, dialer *obfsvpn.Dialer, target string, udp bool) {
for {
localConn, err := ln.Accept()
if err != nil {
log.Printf("error accepting connection: %v", err)
return
}
remoteConn, err := dialer.Dial(context.TODO(), "tcp", target)
var remoteConn net.Conn
if udp {
innerConn, err := kcp.Dial(target)
if err != nil {
log.Printf("error dialing gateway via kcp: %v", err)
return
}
remoteConn, err = dialer.Wrap(context.TODO(), innerConn)
} else {
remoteConn, err = dialer.Dial(context.TODO(), "tcp", target)
}
if err != nil {
log.Printf("error dialing gateway: %v", err)
return
......@@ -156,7 +168,7 @@ func (b *Bitmask) startOpenVPN() error {
}
gw := gateways[0]
proxy, err := b.startTransport(gw.Host)
proxy, err := b.startTransport(gw.Host, b.udp)
if err != nil {
return err
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment