Initial commit of utilities
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
84
cmd/ircmirror/net.go
Normal file
84
cmd/ircmirror/net.go
Normal file
@@ -0,0 +1,84 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0
|
||||
*
|
||||
* Copyright (C) 2021 Jason A. Donenfeld. All Rights Reserved.
|
||||
*/
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
|
||||
"golang.zx2c4.com/wireguard/conn"
|
||||
"golang.zx2c4.com/wireguard/device"
|
||||
"golang.zx2c4.com/wireguard/tun/netstack"
|
||||
)
|
||||
|
||||
func makeNet(conf *vpnConf, endpoint vpnEndpoint) (*device.Device, *netstack.Net, error) {
|
||||
var localAddresses, dnsServers []net.IP
|
||||
for _, ip := range conf.ips {
|
||||
localAddresses = append(localAddresses, ip.IPAddr().IP)
|
||||
}
|
||||
for _, ip := range conf.dnses {
|
||||
dnsServers = append(dnsServers, ip.IPAddr().IP)
|
||||
}
|
||||
tun, stack, err := netstack.CreateNetTUN(localAddresses, dnsServers, 1420)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
logf := func(format string, args ...interface{}) {
|
||||
log.Printf("[NET %s] "+format, append([]interface{}{endpoint.name}, args...)...)
|
||||
}
|
||||
dev := device.NewDevice(tun, conn.NewStdNetBind(), &device.Logger{logf, logf})
|
||||
err = dev.IpcSet(fmt.Sprintf("private_key=%s\npublic_key=%s\nendpoint=%s\nallowed_ip=0.0.0.0/0\nallowed_ip=::/0\n",
|
||||
hex.EncodeToString(conf.privateKey), hex.EncodeToString(endpoint.publicKey), endpoint.endpoint.String()))
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
err = dev.Up()
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
return dev, stack, nil
|
||||
}
|
||||
|
||||
type dialer struct {
|
||||
name string
|
||||
dial func(network, address string) (net.Conn, error)
|
||||
}
|
||||
|
||||
func makeDialers(conf *vpnConf, endpoints []vpnEndpoint) (dialers []dialer, err error) {
|
||||
var devs []*device.Device
|
||||
defer func() {
|
||||
if err != nil {
|
||||
for _, dev := range devs {
|
||||
dev.Close()
|
||||
}
|
||||
}
|
||||
}()
|
||||
for _, endpoint := range endpoints {
|
||||
dev, stack, err := makeNet(conf, endpoint)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
devs = append(devs, dev)
|
||||
dialers = append(dialers, dialer{endpoint.name, stack.Dial})
|
||||
}
|
||||
return dialers, nil
|
||||
}
|
||||
|
||||
func (d *dialer) splitByAf() (v4, v6 func(network, address string) (net.Conn, error)) {
|
||||
return func(network, address string) (net.Conn, error) {
|
||||
if len(network) == 3 {
|
||||
network += "4"
|
||||
}
|
||||
return d.dial(network, address)
|
||||
}, func(network, address string) (net.Conn, error) {
|
||||
if len(network) == 3 {
|
||||
network += "6"
|
||||
}
|
||||
return d.dial(network, address)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user