@@ -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
4747l .logger .Debug ("Setting up DNS configuration" )
48- if err := l .setupDNS (); err != nil {
48+ err := l .setupDNS ()
49+ if err != nil {
4950return fmt .Errorf ("failed to setup DNS: %v" , err )
5051}
5152l .logger .Debug ("DNS setup completed" )
5253
5354// Create network namespace
5455l .logger .Debug ("Creating network namespace" , "namespace" , l .namespace )
55- if err := l .createNamespace (); err != nil {
56+ err = l .createNamespace ()
57+ if err != nil {
5658return fmt .Errorf ("failed to create namespace: %v" , err )
5759}
5860l .logger .Debug ("Network namespace created" )
5961
6062// Setup network interface in namespace
6163l .logger .Debug ("Setting up networking" )
62- if err := l .setupNetworking (); err != nil {
64+ err = l .setupNetworking ()
65+ if err != nil {
6366return fmt .Errorf ("failed to setup networking: %v" , err )
6467}
6568l .logger .Debug ("Networking setup completed" )
6669
6770// Setup iptables rules
6871l .logger .Debug ("Setting up iptables rules" )
69- if err := l .setupIptables (); err != nil {
72+ err = l .setupIptables ()
73+ if err != nil {
7074return fmt .Errorf ("failed to setup iptables: %v" , err )
7175}
7276l .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 {
179184return fmt .Errorf ("failed to remove iptables rules: %v" , err )
180185}
181186
182187// Clean up namespace-specific DNS config directory
183188netnsEtc := fmt .Sprintf ("/etc/netns/%s" , l .namespace )
184189if _ , 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
187193fmt .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 {
193200return 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 {
201208cmd := exec .Command ("ip" , "netns" , "add" , l .namespace )
202- if err := cmd .Run (); err != nil {
209+ err := cmd .Run ()
210+ if err != nil {
203211return fmt .Errorf ("failed to create namespace: %v" , err )
204212}
205213return nil
@@ -214,46 +222,54 @@ func (l *LinuxJail) setupNetworking() error {
214222vethNetJail := fmt .Sprintf ("veth_n_%s" , uniqueID ) // veth_n_1234567 = 14 chars
215223
216224cmd := 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 {
218227return fmt .Errorf ("failed to create veth pair: %v" , err )
219228}
220229
221230// Move netjail end to namespace
222231cmd = exec .Command ("ip" , "link" , "set" , vethNetJail , "netns" , l .namespace )
223- if err := cmd .Run (); err != nil {
232+ err = cmd .Run ()
233+ if err != nil {
224234return fmt .Errorf ("failed to move veth to namespace: %v" , err )
225235}
226236
227237// Configure host side of veth pair
228238cmd = 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 {
230241return fmt .Errorf ("failed to configure host veth: %v" , err )
231242}
232243
233244cmd = exec .Command ("ip" , "link" , "set" , vethHost , "up" )
234- if err := cmd .Run (); err != nil {
245+ err = cmd .Run ()
246+ if err != nil {
235247return fmt .Errorf ("failed to bring up host veth: %v" , err )
236248}
237249
238250// Configure namespace side of veth pair
239251cmd = 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 {
241254return fmt .Errorf ("failed to configure namespace veth: %v" , err )
242255}
243256
244257cmd = 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 {
246260return fmt .Errorf ("failed to bring up namespace veth: %v" , err )
247261}
248262
249263cmd = 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 {
251266return fmt .Errorf ("failed to bring up loopback: %v" , err )
252267}
253268
254269// Set default route in namespace
255270cmd = 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 {
257273return 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
269285netnsEtc := 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 {
271288return 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 {
284302return 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
298316cmd = 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 {
300319return fmt .Errorf ("failed to add NAT rule: %v" , err )
301320}
302321
303322// Redirect HTTP traffic to proxy
304323cmd = 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 {
307327return fmt .Errorf ("failed to add HTTP redirect rule: %v" , err )
308328}
309329
310330// Redirect HTTPS traffic to proxy
311331cmd = 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 {
314335return 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 {
331352cmd := exec .Command ("ip" , "netns" , "del" , l .namespace )
332- if err := cmd .Run (); err != nil {
353+ err := cmd .Run ()
354+ if err != nil {
333355return fmt .Errorf ("failed to remove namespace: %v" , err )
334356}
335357return nil
336- }
358+ }
0 commit comments