TL; DR: Netcat का उपयोग न करें, प्रयोगों के लिए Socat का उपयोग करें । यह कुछ भी बेहतर संभालती है।
कारण यह काम नहीं कर रहा है नामांकित पाइप के बारे में नहीं है (भले ही यह अन्य समस्याओं के साथ एक बदसूरत विधि है), लेकिन netcat की एक सीमा।
एक बार Netcat को UDP कनेक्शन प्राप्त होता है, यह उसे बांधता है। तो यह अब पोर्ट 53 के लिए नहीं सुन रहा है, यह उस पोर्ट से जुड़ा है जिसने प्रारंभिक पैकेट भेजा था, ठीक उसी तरह जैसे यह टीसीपी के साथ करता है। हर बार जब आप DNS अनुरोध कर रहे होते हैं, तो टूल पोर्ट बदल देगा और Netcat को कभी अनुरोध नहीं मिलेगा। तो केवल पहला अनुरोध काम करेगा।
जब आप अपना उदाहरण सेट करते हैं, तो पहले क्वेरी से पहले इस कमांड को आज़माएँ:
netstat -aunp|grep -w 53
udp 0 0 0.0.0.0:53 0.0.0.0:* 12316/nc.openbsd
केवल (केवल कामकाजी) क्वेरी करें और फिर से नेटस्टैट करने की कोशिश करें:
# netstat -aunp|grep -w 53
udp 0 0 127.0.0.1:53 127.0.0.1:44335 ESTABLISHED 12316/nc.openbsd
जैसा कि आप देख सकते हैं netcat सिर्फ परिवर्तित मोड: एक कनेक्शन पर पाशन सुनने से। क्योंकि यह UDP है, Netcat को स्वचालित रूप से "स्थापित कनेक्शन" नहीं पता होगा।
मेरे पास अवधारणा का एक प्रमाण है (जो इसे काम करता है और दिखाता है कि समस्या इस यूडीपी मोड से संबंधित है) लेकिन इसके लिए क्लाइंट पर नेटकैट के अलावा सोसाइटी की आवश्यकता होती है। एक ही UDP स्रोत पोर्ट का उपयोग करके सभी अनुरोधों को netcat तक पहुंचाना लक्ष्य है । सर्वर की ओर से कुछ भी नहीं बदलता है, लेकिन मैं यूडीपी अनुरोध के स्रोत पोर्ट को नेटकैट के लिए मजबूर करने के लिए श्रृंखला (इसलिए अंतिम आदेश) की शुरुआत में सोसाइट डाल देता हूं।
सबसे पहले, क्लाइंट पक्ष पर, यह करें:
ssh -N -L 6667:localhost:6667 user@server
फिर, सर्वर साइड पर ऐसा करें:
mkfifo /tmp/fifo
nc -k -l 6667 < /tmp/fifo | nc -u ip_of_dns_server 53 > /tmp/fifo
अंत में, क्लाइंट की तरफ से ऐसा करें:
mkfifo /tmp/fifo
nc -k -l -u 5555 < /tmp/fifo | nc 127.0.0.1 6667 > /tmp/fifo
socat udp4-listen:53,reuseaddr,fork udp:127.0.0.1:5555,sourceport=55550,reuseaddr
अब मैं कई प्रश्न कर सकता हूं।
1 क्वेरी से पहले:
# netstat -aunp|egrep -w '53|5555'
udp 0 0 0.0.0.0:5555 0.0.0.0:* 12715/nc.openbsd
udp 0 0 0.0.0.0:53 0.0.0.0:* 12717/socat
1 के बाद:
udp 0 0 127.0.0.1:55550 127.0.0.1:5555 ESTABLISHED 12736/socat
udp 0 0 127.0.0.1:5555 127.0.0.1:55550 ESTABLISHED 12715/nc.openbsd
udp 0 0 0.0.0.0:53 0.0.0.0:* 12717/socat
दूसरी क्वेरी के बाद:
udp 0 0 127.0.0.1:55550 127.0.0.1:5555 ESTABLISHED 12750/socat
udp 0 0 127.0.0.1:5555 127.0.0.1:55550 ESTABLISHED 12715/nc.openbsd
udp 0 0 0.0.0.0:53 0.0.0.0:* 12717/socat
udp 0 0 127.0.0.1:53 127.0.0.1:53255 ESTABLISHED 12750/socat
सुकैट उसी समस्या को झेलता है लेकिन fork
विकल्प के साथ , यह फिर से सुनता है, और ऐसा प्रतीत होता है कि यह पिछले खोए हुए "कनेक्शन" का पता लगाता है; मुझे लगता है कि देरी का कारण बनता है।
आप पुराने व्यवहार (एक बार काम करता है) प्राप्त कर सकते हैं यदि आप ,sourceport=55550,reuseaddr
सोसाइट कमांड में केवल भाग निकालते हैं ।
nc
उस एकल सफल अनुरोध के बाद कोई बाहर निकलता है? यदि हां, तो किसी अन्य प्रश्न के उत्तर की जाँच करें ।