move to ipv6

This commit is contained in:
2026-07-22 10:37:46 +02:00
parent 0ed69fbc70
commit e58731bd34
2 changed files with 30 additions and 20 deletions

View File

@@ -118,7 +118,7 @@ func setupInterface() {
panic(err) panic(err)
} }
if err := exec.Command("ip", "addr", "add", internalIP.String()+"/24", "dev", IFACE_NAME).Run(); err != nil { if err := exec.Command("ip", "addr", "add", internalIP.String()+"/32", "dev", IFACE_NAME).Run(); err != nil {
panic(err) panic(err)
} }
if err := exec.Command("ip", "link", "set", "dev", IFACE_NAME, "up").Run(); err != nil { if err := exec.Command("ip", "link", "set", "dev", IFACE_NAME, "up").Run(); err != nil {

View File

@@ -1,11 +1,13 @@
// TODO: slice bounds checking // TODO: slice bounds checking
// TODO: authentication // TODO: authentication
// TODO: encryption // TODO: encryption
// TODO: somehow persist IPs
// TODO: handle multiple peers behind one NAT
package main package main
import ( import (
"crypto/rand"
"encoding/binary" "encoding/binary"
"fmt"
"log" "log"
"net" "net"
"os" "os"
@@ -22,7 +24,6 @@ type Peer struct {
var ( var (
peers = map[string]*Peer{} peers = map[string]*Peer{}
peersMutex sync.Mutex peersMutex sync.Mutex
nextIP = 3
conn *net.UDPConn conn *net.UDPConn
) )
@@ -83,8 +84,7 @@ func receivePacket(pkt []byte, addr *net.UDPAddr) {
peersMutex.Lock() peersMutex.Lock()
defer peersMutex.Unlock() defer peersMutex.Unlock()
// TODO internalIP := randomIP().String()
internalIP := fmt.Sprintf("10.1.0.%d", nextIP)
if destPeer, ok := peers[addr.IP.String()]; ok { if destPeer, ok := peers[addr.IP.String()]; ok {
internalIP = destPeer.InternalIP internalIP = destPeer.InternalIP
@@ -93,10 +93,9 @@ func receivePacket(pkt []byte, addr *net.UDPAddr) {
RealAddr: addr, RealAddr: addr,
InternalIP: internalIP, InternalIP: internalIP,
} }
nextIP++
} }
resp := shared.BuildPkt(shared.RESP_REGISTER, net.ParseIP(internalIP).To4()) resp := shared.BuildPkt(shared.RESP_REGISTER, net.ParseIP(internalIP))
sendTo(addr, resp) sendTo(addr, resp)
case shared.REQ_DATA: case shared.REQ_DATA:
frame := pkt[4:] frame := pkt[4:]
@@ -104,22 +103,20 @@ func receivePacket(pkt []byte, addr *net.UDPAddr) {
payload := frame[14:] payload := frame[14:]
switch etherType { switch etherType {
case 0x0800: // IPv4 case 0x86dd: // IPv6
destIP := net.IP(payload[16:20]).String() rawDestIP := payload[24:40]
if destPeer := getPeerByInternalIP(destIP); destPeer != nil { destIP := net.IP(rawDestIP).String()
resp := shared.BuildPkt(shared.RESP_DATA, frame)
if rawDestIP[0] == 0xff { // multicast
log.Println(peer.InternalIP + " -> " + destIP + " (*)")
broadcast(resp, peer.InternalIP)
} else if destPeer := getPeerByInternalIP(destIP); destPeer != nil {
log.Println(peer.InternalIP + " -> " + destIP) log.Println(peer.InternalIP + " -> " + destIP)
resp := shared.BuildPkt(shared.RESP_DATA, frame) sendTo(destPeer.RealAddr, resp)
sendTo(peer.RealAddr, resp)
} else { } else {
log.Println(peer.InternalIP + " -/> " + destIP + " (unrecognized IP)") log.Println(peer.InternalIP + " -/> " + destIP + " (unrecognized IP)")
} }
case 0x0806: // ARP
log.Println(peer.InternalIP + " -> *")
resp := shared.BuildPkt(shared.RESP_DATA, frame)
broadcast(resp, peer.InternalIP)
case 0x86dd: // IPv6
destIP := net.IP(payload[24:40]).String()
log.Println(peer.InternalIP + " -/> " + destIP + " (IPv6)") // TODO
default: default:
log.Printf("unhandled EtherType: 0x%x\n", etherType) log.Printf("unhandled EtherType: 0x%x\n", etherType)
} }
@@ -132,7 +129,7 @@ func broadcast(pkt []byte, except string) {
peersMutex.Lock() peersMutex.Lock()
defer peersMutex.Unlock() defer peersMutex.Unlock()
for _, p := range peers { for _, p := range peers {
if p.RealAddr.IP.String() == except { if p.InternalIP == except {
continue continue
} }
sendTo(p.RealAddr, pkt) sendTo(p.RealAddr, pkt)
@@ -155,3 +152,16 @@ func getPeerByInternalIP(internalIP string) *Peer {
} }
return nil return nil
} }
// fd00:baa1::/32
func randomIP() net.IP {
ip := make(net.IP, 16)
ip[0] = 0xfd
ip[1] = 0x00
ip[2] = 0xba
ip[3] = 0xa1
if _, err := rand.Read(ip[4:]); err != nil {
panic(err)
}
return ip
}