@@ -45,28 +45,32 @@ func (l *LinuxJail) Setup(httpPort, httpsPort int) error {
45
45
// Setup DNS configuration BEFORE creating namespace
46
46
// This ensures the namespace-specific resolv.conf is available when namespace is created
47
47
l .logger .Debug ("Setting up DNS configuration" )
48
- if err := l .setupDNS (); err != nil {
48
+ err := l .setupDNS ()
49
+ if err != nil {
49
50
return fmt .Errorf ("failed to setup DNS: %v" , err )
50
51
}
51
52
l .logger .Debug ("DNS setup completed" )
52
53
53
54
// Create network namespace
54
55
l .logger .Debug ("Creating network namespace" , "namespace" , l .namespace )
55
- if err := l .createNamespace (); err != nil {
56
+ err = l .createNamespace ()
57
+ if err != nil {
56
58
return fmt .Errorf ("failed to create namespace: %v" , err )
57
59
}
58
60
l .logger .Debug ("Network namespace created" )
59
61
60
62
// Setup network interface in namespace
61
63
l .logger .Debug ("Setting up networking" )
62
- if err := l .setupNetworking (); err != nil {
64
+ err = l .setupNetworking ()
65
+ if err != nil {
63
66
return fmt .Errorf ("failed to setup networking: %v" , err )
64
67
}
65
68
l .logger .Debug ("Networking setup completed" )
66
69
67
70
// Setup iptables rules
68
71
l .logger .Debug ("Setting up iptables rules" )
69
- if err := l .setupIptables (); err != nil {
72
+ err = l .setupIptables ()
73
+ if err != nil {
70
74
return fmt .Errorf ("failed to setup iptables: %v" , err )
71
75
}
72
76
l .logger .Debug ("Iptables setup completed" )
@@ -175,21 +179,24 @@ func (l *LinuxJail) Cleanup() error {
175
179
}
176
180
177
181
// Remove iptables rules
178
- if err := l .removeIptables (); err != nil {
182
+ err := l .removeIptables ()
183
+ if err != nil {
179
184
return fmt .Errorf ("failed to remove iptables rules: %v" , err )
180
185
}
181
186
182
187
// Clean up namespace-specific DNS config directory
183
188
netnsEtc := fmt .Sprintf ("/etc/netns/%s" , l .namespace )
184
189
if _ , err := os .Stat (netnsEtc ); err == nil {
185
- if err := os .RemoveAll (netnsEtc ); err != nil {
190
+ err := os .RemoveAll (netnsEtc )
191
+ if err != nil {
186
192
// Don't fail cleanup for this, just log
187
193
fmt .Printf ("Warning: failed to remove DNS config directory %s: %v\n " , netnsEtc , err )
188
194
}
189
195
}
190
196
191
197
// Remove network namespace
192
- if err := l .removeNamespace (); err != nil {
198
+ err = l .removeNamespace ()
199
+ if err != nil {
193
200
return fmt .Errorf ("failed to remove namespace: %v" , err )
194
201
}
195
202
@@ -199,7 +206,8 @@ func (l *LinuxJail) Cleanup() error {
199
206
// createNamespace creates a new network namespace
200
207
func (l * LinuxJail ) createNamespace () error {
201
208
cmd := exec .Command ("ip" , "netns" , "add" , l .namespace )
202
- if err := cmd .Run (); err != nil {
209
+ err := cmd .Run ()
210
+ if err != nil {
203
211
return fmt .Errorf ("failed to create namespace: %v" , err )
204
212
}
205
213
return nil
@@ -214,46 +222,54 @@ func (l *LinuxJail) setupNetworking() error {
214
222
vethNetJail := fmt .Sprintf ("veth_n_%s" , uniqueID ) // veth_n_1234567 = 14 chars
215
223
216
224
cmd := exec .Command ("ip" , "link" , "add" , vethHost , "type" , "veth" , "peer" , "name" , vethNetJail )
217
- if err := cmd .Run (); err != nil {
225
+ err := cmd .Run ()
226
+ if err != nil {
218
227
return fmt .Errorf ("failed to create veth pair: %v" , err )
219
228
}
220
229
221
230
// Move netjail end to namespace
222
231
cmd = exec .Command ("ip" , "link" , "set" , vethNetJail , "netns" , l .namespace )
223
- if err := cmd .Run (); err != nil {
232
+ err = cmd .Run ()
233
+ if err != nil {
224
234
return fmt .Errorf ("failed to move veth to namespace: %v" , err )
225
235
}
226
236
227
237
// Configure host side of veth pair
228
238
cmd = exec .Command ("ip" , "addr" , "add" , "192.168.100.1/24" , "dev" , vethHost )
229
- if err := cmd .Run (); err != nil {
239
+ err = cmd .Run ()
240
+ if err != nil {
230
241
return fmt .Errorf ("failed to configure host veth: %v" , err )
231
242
}
232
243
233
244
cmd = exec .Command ("ip" , "link" , "set" , vethHost , "up" )
234
- if err := cmd .Run (); err != nil {
245
+ err = cmd .Run ()
246
+ if err != nil {
235
247
return fmt .Errorf ("failed to bring up host veth: %v" , err )
236
248
}
237
249
238
250
// Configure namespace side of veth pair
239
251
cmd = exec .Command ("ip" , "netns" , "exec" , l .namespace , "ip" , "addr" , "add" , "192.168.100.2/24" , "dev" , vethNetJail )
240
- if err := cmd .Run (); err != nil {
252
+ err = cmd .Run ()
253
+ if err != nil {
241
254
return fmt .Errorf ("failed to configure namespace veth: %v" , err )
242
255
}
243
256
244
257
cmd = exec .Command ("ip" , "netns" , "exec" , l .namespace , "ip" , "link" , "set" , vethNetJail , "up" )
245
- if err := cmd .Run (); err != nil {
258
+ err = cmd .Run ()
259
+ if err != nil {
246
260
return fmt .Errorf ("failed to bring up namespace veth: %v" , err )
247
261
}
248
262
249
263
cmd = exec .Command ("ip" , "netns" , "exec" , l .namespace , "ip" , "link" , "set" , "lo" , "up" )
250
- if err := cmd .Run (); err != nil {
264
+ err = cmd .Run ()
265
+ if err != nil {
251
266
return fmt .Errorf ("failed to bring up loopback: %v" , err )
252
267
}
253
268
254
269
// Set default route in namespace
255
270
cmd = exec .Command ("ip" , "netns" , "exec" , l .namespace , "ip" , "route" , "add" , "default" , "via" , "192.168.100.1" )
256
- if err := cmd .Run (); err != nil {
271
+ err = cmd .Run ()
272
+ if err != nil {
257
273
return fmt .Errorf ("failed to set default route: %v" , err )
258
274
}
259
275
@@ -267,7 +283,8 @@ func (l *LinuxJail) setupDNS() error {
267
283
// Always create namespace-specific resolv.conf with reliable public DNS servers
268
284
// This avoids issues with systemd-resolved, Docker DNS, and other complex setups
269
285
netnsEtc := fmt .Sprintf ("/etc/netns/%s" , l .namespace )
270
- if err := os .MkdirAll (netnsEtc , 0755 ); err != nil {
286
+ err := os .MkdirAll (netnsEtc , 0755 )
287
+ if err != nil {
271
288
return fmt .Errorf ("failed to create /etc/netns directory: %v" , err )
272
289
}
273
290
@@ -280,7 +297,8 @@ nameserver 1.1.1.1
280
297
nameserver 9.9.9.9
281
298
options timeout:2 attempts:2
282
299
`
283
- if err := os .WriteFile (resolvConfPath , []byte (dnsConfig ), 0644 ); err != nil {
300
+ err = os .WriteFile (resolvConfPath , []byte (dnsConfig ), 0644 )
301
+ if err != nil {
284
302
return fmt .Errorf ("failed to write namespace-specific resolv.conf: %v" , err )
285
303
}
286
304
@@ -296,21 +314,24 @@ func (l *LinuxJail) setupIptables() error {
296
314
297
315
// NAT rules for outgoing traffic
298
316
cmd = exec .Command ("iptables" , "-t" , "nat" , "-A" , "POSTROUTING" , "-s" , "192.168.100.0/24" , "-j" , "MASQUERADE" )
299
- if err := cmd .Run (); err != nil {
317
+ err := cmd .Run ()
318
+ if err != nil {
300
319
return fmt .Errorf ("failed to add NAT rule: %v" , err )
301
320
}
302
321
303
322
// Redirect HTTP traffic to proxy
304
323
cmd = exec .Command ("ip" , "netns" , "exec" , l .namespace , "iptables" , "-t" , "nat" , "-A" , "OUTPUT" ,
305
324
"-p" , "tcp" , "--dport" , "80" , "-j" , "DNAT" , "--to-destination" , fmt .Sprintf ("192.168.100.1:%d" , l .config .HTTPPort ))
306
- if err := cmd .Run (); err != nil {
325
+ err = cmd .Run ()
326
+ if err != nil {
307
327
return fmt .Errorf ("failed to add HTTP redirect rule: %v" , err )
308
328
}
309
329
310
330
// Redirect HTTPS traffic to proxy
311
331
cmd = exec .Command ("ip" , "netns" , "exec" , l .namespace , "iptables" , "-t" , "nat" , "-A" , "OUTPUT" ,
312
332
"-p" , "tcp" , "--dport" , "443" , "-j" , "DNAT" , "--to-destination" , fmt .Sprintf ("192.168.100.1:%d" , l .config .HTTPSPort ))
313
- if err := cmd .Run (); err != nil {
333
+ err = cmd .Run ()
334
+ if err != nil {
314
335
return fmt .Errorf ("failed to add HTTPS redirect rule: %v" , err )
315
336
}
316
337
@@ -329,8 +350,9 @@ func (l *LinuxJail) removeIptables() error {
329
350
// removeNamespace removes the network namespace
330
351
func (l * LinuxJail ) removeNamespace () error {
331
352
cmd := exec .Command ("ip" , "netns" , "del" , l .namespace )
332
- if err := cmd .Run (); err != nil {
353
+ err := cmd .Run ()
354
+ if err != nil {
333
355
return fmt .Errorf ("failed to remove namespace: %v" , err )
334
356
}
335
357
return nil
336
- }
358
+ }
0 commit comments