This commit is contained in:
Max Headroom 2022-10-08 11:40:30 +02:00
parent d1d4651ed7
commit 16e4664899
3 changed files with 81 additions and 5 deletions

View file

@ -187,6 +187,49 @@ sudo hyprspace down hs1
WireGuard is a registered trademark of Jason A. Donenfeld.
## Routes
### Prepare each route node:
```
# sysctl -n net.ipv4.ip_forward
0
# sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s <YOUR_TUN_NET>/24 -o eth0 -j MASQUERADE
iptables -A FORWARD 1 -i <HS_TUN> -o <DEV_GATEWAY> -j ACCEPT
iptables -A FORWARD 1 -i <DEV_GATEWAY> -o <HS_TUN> -j ACCEPT
```
Determine gateway router:
```
# curl ifconfg.me
<GATEWAY_ROUTER>
```
### Configure client:
Config hyprspace yaml configuration file:
```
interface:
...
peers:
ID: ...
...
routes:
192.168.3.0/24:
ip: 10.0.0.3
0.0.0.0/0:
ip: 10.0.0.1
```
Prepare routes
```
One for each route:
# ip route add <GATEWAY_ROUTER> via <YOUR_GATEWAY>
And all traffic for hyprspace tun
# ip route add default dev <HS_TUN> metric 1
```
## License
Copyright 2021-2022 Alec Scott <hi@alecbcs.com>

View file

@ -180,6 +180,10 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {
// Initialize active streams map and packet byte array.
activeStreams = make(map[string]network.Stream)
var packet = make([]byte, 1420)
ip, _, err := net.ParseCIDR(cfg.Interface.Address)
if err != nil {
checkErr(errors.New("unable to parse address"))
}
for {
// Read in a packet from the tun device.
plen, err := tunDev.Iface.Read(packet)
@ -188,8 +192,21 @@ func UpRun(r *cmd.Root, c *cmd.Sub) {
continue
}
// Decode the packet's destination address
dst := net.IPv4(packet[16], packet[17], packet[18], packet[19]).String()
dstIP := net.IPv4(packet[16], packet[17], packet[18], packet[19])
dst := dstIP.String()
// Check route table for destination address.
for route, _ := range cfg.Routes {
_, network, _ := net.ParseCIDR(route)
if network.Contains(dstIP) {
src := net.IPv4(packet[12], packet[13], packet[14], packet[15])
_, ok := peerTable[dst]
// Only rewrite if initiator is us or receiver is not a known peer
if src.Equal(ip) && !ok {
dst = cfg.Routes[route].IP
}
}
}
// Check if we already have an open connection to the destination peer.
stream, ok := activeStreams[dst]

View file

@ -10,9 +10,10 @@ import (
// Config is the main Configuration Struct for Hyprspace.
type Config struct {
Path string `yaml:"path,omitempty"`
Interface Interface `yaml:"interface"`
Peers map[string]Peer `yaml:"peers"`
Path string `yaml:"path,omitempty"`
Interface Interface `yaml:"interface"`
Peers map[string]Peer `yaml:"peers"`
Routes map[string]Route `yaml:"routes"`
}
// Interface defines all of the fields that a local node needs to know about itself!
@ -29,6 +30,10 @@ type Peer struct {
ID string `yaml:"id"`
}
type Route struct {
IP string `yaml:"ip"`
}
// Read initializes a config from a file.
func Read(path string) (*Config, error) {
in, err := os.ReadFile(path)
@ -55,6 +60,17 @@ func Read(path string) (*Config, error) {
for ip := range result.Peers {
if net.ParseIP(ip).String() == "<nil>" {
return nil, fmt.Errorf("%s is not a valid ip address", ip)
} else {
fmt.Printf("[+] Assign this ip: %s to node: %s.\n", ip, result.Peers[ip].ID)
}
}
for route := range result.Routes {
_, _, err := net.ParseCIDR(route)
if err != nil {
return nil, fmt.Errorf("%s is not a valid route", route)
} else {
fmt.Printf("[+] Assign route %s via %s.\n", route, result.Routes[route].IP)
}
}