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