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)
| 127 | // NAT forwarding rules. Client NATs are controlled by the switches ClientXHard, which if true, sets up hard |
| 128 | // nat. |
| 129 | func (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 |
nothing calls this directly
no test coverage detected