@@ -45,28 +45,32 @@ func (l *LinuxJail) Setup(httpPort, httpsPort int) error {
4545 // Setup DNS configuration BEFORE creating namespace
4646 // This ensures the namespace-specific resolv.conf is available when namespace is created
4747 l .logger .Debug ("Setting up DNS configuration" )
48- if err := l .setupDNS (); err != nil {
48+ err := l .setupDNS ()
49+ if err != nil {
4950 return fmt .Errorf ("failed to setup DNS: %v" , err )
5051 }
5152 l .logger .Debug ("DNS setup completed" )
5253
5354 // Create network namespace
5455 l .logger .Debug ("Creating network namespace" , "namespace" , l .namespace )
55- if err := l .createNamespace (); err != nil {
56+ err = l .createNamespace ()
57+ if err != nil {
5658 return fmt .Errorf ("failed to create namespace: %v" , err )
5759 }
5860 l .logger .Debug ("Network namespace created" )
5961
6062 // Setup network interface in namespace
6163 l .logger .Debug ("Setting up networking" )
62- if err := l .setupNetworking (); err != nil {
64+ err = l .setupNetworking ()
65+ if err != nil {
6366 return fmt .Errorf ("failed to setup networking: %v" , err )
6467 }
6568 l .logger .Debug ("Networking setup completed" )
6669
6770 // Setup iptables rules
6871 l .logger .Debug ("Setting up iptables rules" )
69- if err := l .setupIptables (); err != nil {
72+ err = l .setupIptables ()
73+ if err != nil {
7074 return fmt .Errorf ("failed to setup iptables: %v" , err )
7175 }
7276 l .logger .Debug ("Iptables setup completed" )
@@ -175,21 +179,24 @@ func (l *LinuxJail) Cleanup() error {
175179 }
176180
177181 // Remove iptables rules
178- if err := l .removeIptables (); err != nil {
182+ err := l .removeIptables ()
183+ if err != nil {
179184 return fmt .Errorf ("failed to remove iptables rules: %v" , err )
180185 }
181186
182187 // Clean up namespace-specific DNS config directory
183188 netnsEtc := fmt .Sprintf ("/etc/netns/%s" , l .namespace )
184189 if _ , err := os .Stat (netnsEtc ); err == nil {
185- if err := os .RemoveAll (netnsEtc ); err != nil {
190+ err := os .RemoveAll (netnsEtc )
191+ if err != nil {
186192 // Don't fail cleanup for this, just log
187193 fmt .Printf ("Warning: failed to remove DNS config directory %s: %v\n " , netnsEtc , err )
188194 }
189195 }
190196
191197 // Remove network namespace
192- if err := l .removeNamespace (); err != nil {
198+ err = l .removeNamespace ()
199+ if err != nil {
193200 return fmt .Errorf ("failed to remove namespace: %v" , err )
194201 }
195202
@@ -199,7 +206,8 @@ func (l *LinuxJail) Cleanup() error {
199206// createNamespace creates a new network namespace
200207func (l * LinuxJail ) createNamespace () error {
201208 cmd := exec .Command ("ip" , "netns" , "add" , l .namespace )
202- if err := cmd .Run (); err != nil {
209+ err := cmd .Run ()
210+ if err != nil {
203211 return fmt .Errorf ("failed to create namespace: %v" , err )
204212 }
205213 return nil
@@ -214,46 +222,54 @@ func (l *LinuxJail) setupNetworking() error {
214222 vethNetJail := fmt .Sprintf ("veth_n_%s" , uniqueID ) // veth_n_1234567 = 14 chars
215223
216224 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 {
218227 return fmt .Errorf ("failed to create veth pair: %v" , err )
219228 }
220229
221230 // Move netjail end to namespace
222231 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 {
224234 return fmt .Errorf ("failed to move veth to namespace: %v" , err )
225235 }
226236
227237 // Configure host side of veth pair
228238 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 {
230241 return fmt .Errorf ("failed to configure host veth: %v" , err )
231242 }
232243
233244 cmd = exec .Command ("ip" , "link" , "set" , vethHost , "up" )
234- if err := cmd .Run (); err != nil {
245+ err = cmd .Run ()
246+ if err != nil {
235247 return fmt .Errorf ("failed to bring up host veth: %v" , err )
236248 }
237249
238250 // Configure namespace side of veth pair
239251 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 {
241254 return fmt .Errorf ("failed to configure namespace veth: %v" , err )
242255 }
243256
244257 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 {
246260 return fmt .Errorf ("failed to bring up namespace veth: %v" , err )
247261 }
248262
249263 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 {
251266 return fmt .Errorf ("failed to bring up loopback: %v" , err )
252267 }
253268
254269 // Set default route in namespace
255270 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 {
257273 return fmt .Errorf ("failed to set default route: %v" , err )
258274 }
259275
@@ -267,7 +283,8 @@ func (l *LinuxJail) setupDNS() error {
267283 // Always create namespace-specific resolv.conf with reliable public DNS servers
268284 // This avoids issues with systemd-resolved, Docker DNS, and other complex setups
269285 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 {
271288 return fmt .Errorf ("failed to create /etc/netns directory: %v" , err )
272289 }
273290
@@ -280,7 +297,8 @@ nameserver 1.1.1.1
280297nameserver 9.9.9.9
281298options timeout:2 attempts:2
282299`
283- if err := os .WriteFile (resolvConfPath , []byte (dnsConfig ), 0644 ); err != nil {
300+ err = os .WriteFile (resolvConfPath , []byte (dnsConfig ), 0644 )
301+ if err != nil {
284302 return fmt .Errorf ("failed to write namespace-specific resolv.conf: %v" , err )
285303 }
286304
@@ -296,21 +314,24 @@ func (l *LinuxJail) setupIptables() error {
296314
297315 // NAT rules for outgoing traffic
298316 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 {
300319 return fmt .Errorf ("failed to add NAT rule: %v" , err )
301320 }
302321
303322 // Redirect HTTP traffic to proxy
304323 cmd = exec .Command ("ip" , "netns" , "exec" , l .namespace , "iptables" , "-t" , "nat" , "-A" , "OUTPUT" ,
305324 "-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 {
307327 return fmt .Errorf ("failed to add HTTP redirect rule: %v" , err )
308328 }
309329
310330 // Redirect HTTPS traffic to proxy
311331 cmd = exec .Command ("ip" , "netns" , "exec" , l .namespace , "iptables" , "-t" , "nat" , "-A" , "OUTPUT" ,
312332 "-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 {
314335 return fmt .Errorf ("failed to add HTTPS redirect rule: %v" , err )
315336 }
316337
@@ -329,8 +350,9 @@ func (l *LinuxJail) removeIptables() error {
329350// removeNamespace removes the network namespace
330351func (l * LinuxJail ) removeNamespace () error {
331352 cmd := exec .Command ("ip" , "netns" , "del" , l .namespace )
332- if err := cmd .Run (); err != nil {
353+ err := cmd .Run ()
354+ if err != nil {
333355 return fmt .Errorf ("failed to remove namespace: %v" , err )
334356 }
335357 return nil
336- }
358+ }
0 commit comments