Skip to content

Commit c3cdceb

Browse files
committed
Add comprehensive DNS namespace debugging script
This script will help identify the root cause of DNS failures in CI by: - Testing /etc/netns bind mount mechanism - Checking network connectivity at each layer - Testing DNS with explicit servers - Using strace to see system calls - Checking iptables/NAT configuration - Testing with tcpdump to see if packets leave
1 parent ef97ed8 commit c3cdceb

2 files changed

Lines changed: 104 additions & 20 deletions

File tree

.github/workflows/tests.yml

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -82,27 +82,11 @@ jobs:
8282
./scripts/debug_tls_env.sh
8383
sudo ./scripts/debug_tls_env.sh
8484
85-
- name: Debug network environment (CI only)
85+
- name: Debug DNS in network namespaces
8686
run: |
87-
echo "=== Network Debug Information ==="
88-
echo "1. Network interfaces:"
89-
ip link show
90-
echo ""
91-
echo "2. Listening ports:"
92-
sudo ss -lntp
93-
echo ""
94-
echo "3. NFTables rules:"
95-
sudo nft list ruleset || echo "No nftables rules"
96-
echo ""
97-
echo "4. IPTables rules (if any):"
98-
sudo iptables -L -v -n || echo "No iptables rules"
99-
echo ""
100-
echo "5. /etc/netns directory:"
101-
sudo ls -la /etc/netns/ 2>/dev/null || echo "No /etc/netns directory"
102-
echo ""
103-
echo "6. Network namespaces:"
104-
sudo ip netns list || echo "No namespaces"
105-
echo "=== End Network Debug ==="
87+
echo "=== Running comprehensive DNS namespace debug ==="
88+
sudo bash scripts/debug_namespace_dns.sh
89+
echo "=== End DNS Debug ==="#
10690
10791
- name: Run Linux jail integration tests (root variant)
10892
if: matrix.privilege == 'root'

scripts/debug_namespace_dns.sh

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#!/bin/bash
2+
# Comprehensive DNS debugging in network namespaces
3+
4+
NAMESPACE="httpjail_test_$$"
5+
6+
echo "=== Creating test namespace: $NAMESPACE ==="
7+
sudo ip netns add $NAMESPACE
8+
9+
echo -e "\n=== 1. Check resolv.conf in host ==="
10+
echo "Host /etc/resolv.conf:"
11+
cat /etc/resolv.conf
12+
echo "Is it a symlink?"
13+
ls -la /etc/resolv.conf
14+
15+
echo -e "\n=== 2. Check resolv.conf in namespace (default) ==="
16+
sudo ip netns exec $NAMESPACE cat /etc/resolv.conf 2>&1 || echo "FAILED to read"
17+
18+
echo -e "\n=== 3. Check if /etc/netns mechanism works ==="
19+
sudo mkdir -p /etc/netns/$NAMESPACE
20+
echo "nameserver 8.8.8.8" | sudo tee /etc/netns/$NAMESPACE/resolv.conf
21+
echo "Created /etc/netns/$NAMESPACE/resolv.conf"
22+
# Delete and recreate namespace to test bind mount
23+
sudo ip netns del $NAMESPACE
24+
sudo ip netns add $NAMESPACE
25+
echo "After recreating namespace with /etc/netns:"
26+
sudo ip netns exec $NAMESPACE cat /etc/resolv.conf 2>&1
27+
28+
echo -e "\n=== 4. Network interfaces in namespace ==="
29+
sudo ip netns exec $NAMESPACE ip link show
30+
31+
echo -e "\n=== 5. Try to ping 8.8.8.8 (no DNS needed) ==="
32+
sudo ip netns exec $NAMESPACE ping -c 1 -W 2 8.8.8.8 2>&1 || echo "FAILED"
33+
34+
echo -e "\n=== 6. Setup veth pair for connectivity ==="
35+
sudo ip link add veth0 type veth peer name veth1
36+
sudo ip link set veth1 netns $NAMESPACE
37+
sudo ip addr add 10.99.0.1/30 dev veth0
38+
sudo ip link set veth0 up
39+
sudo ip netns exec $NAMESPACE ip addr add 10.99.0.2/30 dev veth1
40+
sudo ip netns exec $NAMESPACE ip link set veth1 up
41+
sudo ip netns exec $NAMESPACE ip link set lo up
42+
sudo ip netns exec $NAMESPACE ip route add default via 10.99.0.1
43+
44+
echo -e "\n=== 7. Test connectivity with veth ==="
45+
echo "Ping gateway from namespace:"
46+
sudo ip netns exec $NAMESPACE ping -c 1 -W 2 10.99.0.1 2>&1 || echo "FAILED"
47+
echo "Ping 8.8.8.8 from namespace:"
48+
sudo ip netns exec $NAMESPACE ping -c 1 -W 2 8.8.8.8 2>&1 || echo "FAILED"
49+
50+
echo -e "\n=== 8. Check iptables/NAT on host ==="
51+
sudo iptables -t nat -L POSTROUTING -n -v | grep -E "MASQUERADE|10.99" || echo "No NAT rules found"
52+
53+
echo -e "\n=== 9. Add NAT for namespace ==="
54+
sudo iptables -t nat -A POSTROUTING -s 10.99.0.0/30 -j MASQUERADE
55+
sudo sysctl -w net.ipv4.ip_forward=1 > /dev/null
56+
echo "After adding NAT:"
57+
sudo ip netns exec $NAMESPACE ping -c 1 -W 2 8.8.8.8 2>&1 || echo "FAILED"
58+
59+
echo -e "\n=== 10. Test DNS resolution ==="
60+
echo "Using nslookup:"
61+
sudo ip netns exec $NAMESPACE nslookup google.com 8.8.8.8 2>&1 || echo "nslookup FAILED"
62+
echo "Using dig:"
63+
sudo ip netns exec $NAMESPACE dig +short google.com @8.8.8.8 2>&1 || echo "dig FAILED"
64+
echo "Using host:"
65+
sudo ip netns exec $NAMESPACE host google.com 8.8.8.8 2>&1 || echo "host FAILED"
66+
67+
echo -e "\n=== 11. Test raw DNS query with nc ==="
68+
echo "Check if we can reach 8.8.8.8:53:"
69+
sudo ip netns exec $NAMESPACE nc -zv -w2 8.8.8.8 53 2>&1 || echo "Cannot reach DNS port"
70+
71+
echo -e "\n=== 12. Check for DNS traffic with tcpdump ==="
72+
sudo timeout 3 ip netns exec $NAMESPACE tcpdump -i veth1 -n 'port 53' 2>/dev/null &
73+
TCPDUMP_PID=$!
74+
sleep 1
75+
sudo ip netns exec $NAMESPACE nslookup google.com 8.8.8.8 2>&1 > /dev/null
76+
wait $TCPDUMP_PID 2>/dev/null || true
77+
78+
echo -e "\n=== 13. strace DNS resolution ==="
79+
echo "Tracing nslookup:"
80+
sudo ip netns exec $NAMESPACE strace -e network nslookup google.com 8.8.8.8 2>&1 | grep -E "socket|connect|send|recv" | head -10
81+
82+
echo -e "\n=== 14. Check systemd-resolved status ==="
83+
systemctl is-active systemd-resolved || echo "systemd-resolved not active"
84+
resolvectl status 2>/dev/null | head -20 || echo "resolvectl not available"
85+
86+
echo -e "\n=== 15. Test with different resolv.conf ==="
87+
echo "nameserver 8.8.8.8" | sudo tee /tmp/test-resolv.conf > /dev/null
88+
sudo ip netns exec $NAMESPACE mount --bind /tmp/test-resolv.conf /etc/resolv.conf 2>&1 || echo "Mount failed"
89+
echo "After bind mount:"
90+
sudo ip netns exec $NAMESPACE cat /etc/resolv.conf
91+
sudo ip netns exec $NAMESPACE nslookup google.com 2>&1 || echo "Still FAILED"
92+
93+
echo -e "\n=== Cleanup ==="
94+
sudo ip netns del $NAMESPACE
95+
sudo ip link del veth0 2>/dev/null || true
96+
sudo iptables -t nat -D POSTROUTING -s 10.99.0.0/30 -j MASQUERADE 2>/dev/null || true
97+
sudo rm -f /tmp/test-resolv.conf
98+
sudo rm -rf /etc/netns/$NAMESPACE
99+
100+
echo "=== Done ==="

0 commit comments

Comments
 (0)