MCPcopy Index your code
hub / github.com/coder/coder / SetupNetworking

Method SetupNetworking

tailnet/test/integration/network.go:129–200  ·  view source on GitHub ↗

SetupNetworking creates a fake internet with multiple STUN servers and sets up NAT forwarding rules. Client NATs are controlled by the switches ClientXHard, which if true, sets up hard nat.

(t *testing.T, l slog.Logger)

Source from the content-addressed store, hash-verified

127// NAT forwarding rules. Client NATs are controlled by the switches ClientXHard, which if true, sets up hard
128// nat.
129func (n NetworkingNAT) SetupNetworking(t *testing.T, l slog.Logger) TestNetworking {
130 logger := l.Named("setup-networking").Leveled(slog.LevelDebug)
131 internet := createFakeInternet(t)
132 logger.Debug(context.Background(), "preparing STUN", slog.F("stun_count", n.StunCount))
133 internet.Net.STUNs = make([]TestNetworkingSTUN, n.StunCount)
134 for i := 0; i < n.StunCount; i++ {
135 internet.Net.STUNs[i] = prepareSTUNServer(t, &internet, i)
136 }
137
138 _, err := commandInNetNS(internet.BridgeNetNS, "sysctl", []string{"-w", "net.ipv4.ip_forward=1"}).Output()
139 require.NoError(t, wrapExitErr(err), "enable IP forwarding in bridge NetNS")
140
141 // Set up iptables masquerade rules to allow each router to NAT packets.
142 leaves := []struct {
143 fakeRouterLeaf
144 peerIP string
145 clientPort int
146 natPortPeer int
147 natStartPortSTUN int
148 }{
149 {
150 fakeRouterLeaf: internet.Client1,
151 // If peerIP is empty, we do easy NAT (even for STUN)
152 peerIP: func() string {
153 if n.Client1Hard {
154 return internet.Client2.RouterIP
155 }
156 return ""
157 }(),
158 clientPort: client1Port,
159 natPortPeer: client1RouterPort,
160 natStartPortSTUN: client1RouterPortSTUN,
161 },
162 {
163 fakeRouterLeaf: internet.Client2,
164 // If peerIP is empty, we do easy NAT (even for STUN)
165 peerIP: func() string {
166 if n.Client2Hard {
167 return internet.Client1.RouterIP
168 }
169 return ""
170 }(),
171 clientPort: client2Port,
172 natPortPeer: client2RouterPort,
173 natStartPortSTUN: client2RouterPortSTUN,
174 },
175 }
176 for _, leaf := range leaves {
177 _, err := commandInNetNS(leaf.RouterNetNS, "sysctl", []string{"-w", "net.ipv4.ip_forward=1"}).Output()
178 require.NoError(t, wrapExitErr(err), "enable IP forwarding in router NetNS")
179
180 // All non-UDP traffic should use regular masquerade e.g. for HTTP.
181 iptablesMasqueradeNonUDP(t, leaf.RouterNetNS)
182
183 // NAT from this client to its peer.
184 iptablesNAT(t, leaf.RouterNetNS, leaf.ClientIP, leaf.clientPort, leaf.RouterIP, leaf.natPortPeer, leaf.peerIP)
185
186 // NAT from this client to each STUN server. Only do this if we're doing

Callers

nothing calls this directly

Calls 8

createFakeInternetFunction · 0.85
prepareSTUNServerFunction · 0.85
commandInNetNSFunction · 0.85
wrapExitErrFunction · 0.85
iptablesMasqueradeNonUDPFunction · 0.85
iptablesNATFunction · 0.85
NamedMethod · 0.80
OutputMethod · 0.65

Tested by

no test coverage detected