Files
cunicu/test/net/nat.go
2022-08-04 00:20:43 +02:00

107 lines
2.5 KiB
Go

//go:build linux
package net
import (
"fmt"
"net"
g "github.com/stv0g/gont/pkg"
gopt "github.com/stv0g/gont/pkg/options"
"riasc.eu/wice/test/nodes"
)
func NAT(p *NetworkParams) (*Network, error) {
var (
n *g.Network
sw *g.Switch
r nodes.RelayNode
s nodes.SignalingNode
al nodes.AgentList
err error
)
if n, err = g.NewNetwork("", p.NetworkOptions...); err != nil {
return nil, fmt.Errorf("failed to create network: %w", err)
}
if sw, err = n.AddSwitch("sw1"); err != nil {
return nil, fmt.Errorf("failed to create switch: %w", err)
}
if r, err = nodes.NewCoturnNode(n, "r1"); err != nil {
return nil, fmt.Errorf("failed to start relay: %w", err)
}
if s, err = nodes.NewGrpcSignalingNode(n, "s1"); err != nil {
return nil, fmt.Errorf("fFailed to create signaling node: %w", err)
}
if al, err = nodes.NewAgents(n, p.NumAgents); err != nil {
return nil, fmt.Errorf("failed to created nodes: %w", err)
}
if err := n.AddLink(
gopt.Interface("eth0", r,
gopt.AddressIPv4(10, 0, 0, 1, 16),
gopt.AddressIP("fc::1/64")),
gopt.Interface("eth0-r", sw),
); err != nil {
return nil, fmt.Errorf("fFailed to add link: %w", err)
}
if err := n.AddLink(
gopt.Interface("eth0", s,
gopt.AddressIPv4(10, 0, 0, 2, 16),
gopt.AddressIP("fc::2/64")),
gopt.Interface("eth0-s", sw),
); err != nil {
return nil, fmt.Errorf("failed to add link: %w", err)
}
for i := 0; i < p.NumAgents; i++ {
sws, err := n.AddSwitch(fmt.Sprintf("sw1%d", i))
if err != nil {
return nil, err
}
_, err = n.AddNAT(fmt.Sprintf("nat%d", i),
gopt.Interface("eth-nb", sw,
gopt.NorthBound,
gopt.AddressIPv4(10, 0, 1, byte(i)+1, 16),
gopt.AddressIP(fmt.Sprintf("fc::1:%d/64", i))),
gopt.Interface("eth-sb", sws,
gopt.SouthBound,
gopt.AddressIPv4(10, 1, 0, 1, 24),
gopt.AddressIP(fmt.Sprintf("fc:1::%d/64", i))),
)
if err != nil {
return nil, err
}
if err := n.AddLink(
gopt.Interface("eth0", al[i].Host,
gopt.AddressIPv4(10, 1, 0, 2, 24),
gopt.AddressIP("fc:1::2/64")),
gopt.Interface(fmt.Sprintf("eth0-n%d", i), sws),
); err != nil {
return nil, fmt.Errorf("failed to add link: %w", err)
}
if err := al[i].AddDefaultRoute(net.IPv4(10, 1, 0, 1)); err != nil {
return nil, fmt.Errorf("failed to add route: %w", err)
}
if err := al[i].AddDefaultRoute(net.ParseIP("fc:1::1")); err != nil {
return nil, fmt.Errorf("failed to add route: %w", err)
}
}
return &Network{
Network: n,
Agents: al,
Switch: sw,
}, nil
}