Xorg को TCP पर सुनने दें, लेकिन केवल लोकलहोस्ट को?


12

मेरे पास कुछ एक्स क्लाइंट प्रोग्राम हैं जिन्हें एक्स सर्वर तक पहुंचने की आवश्यकता है। यह केवल टीसीपी द्वारा एक्स सर्वर तक पहुंचने में सक्षम है, यूनिक्स डोमेन सॉकेट जैसे अन्य तरीकों से नहीं। यह सर्वर के समान होस्ट पर चलेगा, जिससे चीजें आसान हो जाएंगी।

तो, मैं TCP पोर्ट 6000 पर सुनने के लिए अपना Xorg सर्वर कैसे बना सकता हूं, लेकिन केवल लोकलहोस्ट से कनेक्शन के लिए?

मैंने पाया कि पोर्ट 6000 पर रिमोट कनेक्शन के लिए X.org कैसे बनाएं? , जो बताता है कि दूरदराज के मेजबानों के लिए एक्सेस कैसे सक्षम किया जाए, लेकिन मैं वास्तव में रिमोट एक्सेस (सुरक्षा कारणों से, मुख्य रूप से) नहीं चाहता।

मैंने किसी तरह से डिफ़ॉल्ट परिवहन को टीसीपी को अग्रेषित करने के बारे में सोचा, लेकिन मुझे वास्तव में डिफ़ॉल्ट परिवहन के बारे में जानकारी नहीं मिली।

(मैं अपने प्रदर्शन प्रबंधक के रूप में केडीएम का उपयोग यहां कर रहा हूं, लेकिन मुझे लगता है कि मैं या तो प्रदर्शन प्रबंधक के लिए समाधान स्थानांतरित कर सकता हूं, या यहां तक ​​कि प्रदर्शन प्रबंधक भी स्विच कर सकता हूं।)

कोई विचार?

यह एक मिश्रित कुबंटु-उबंटू-एक्सबुंटू इंस्टॉलेशन (मूल रूप से कुबंटु, लेकिन 11 जुबांट-डेस्कटॉप और जुबांटु-डेस्कटॉप पर जोड़ा गया है) पर 11.04 पर है। बूट पर अब इसे एक्सबंटू 11.04 कहा जा रहा है। अब मैं केडीएम से सूक्ति-क्लासिक डेस्कटॉप का उपयोग कर रहा हूं।


सभी सोच रहे हैं कि यह एक्स क्लाइंट क्या है: यह वास्तव में एक जावा एसएसएच कार्यान्वयन ( जेएसएच ) है जो एक्स को किसी अन्य होस्ट को अग्रेषित करने की कोशिश करता है। जावा वास्तव में यूनिक्स डोमेन सॉकेट्स तक नहीं पहुंच सकता है, मुझे लगता है। यही समस्या मेरी (जहाँ अब मैं किसी सॉकेट को पढ़कर / लिखकर / लिखकर, कुछ विंडोिंग लाइब्रेरी का उपयोग करके नहीं) शुद्ध एक्स में एक एक्स क्लाइंट लागू करना चाहता था, मेरी एक और (अब रुकी हुई) परियोजना पर भी लागू होगी।
पाओलो एबरमन

@ पाओलो, जावा वास्तव में यूनिक्स डोमेन सॉकेट्स का उपयोग कर सकते हैं (आप मूल पुस्तकालय लिख सकते हैं जो आवश्यक syscalls तक पहुंच प्रदान करेंगे, या बस पहले से लिखा हुआ पाएंगे)। लेकिन फिर, fwiw, आप प्रभावी रूप से जावा का मुख्य लाभ खो देते हैं: उच्च पोर्टेबिलिटी। इसलिए अगर आपको वास्तव में कड़ी मेहनत की जरूरत है, तो आप बहुत आसानी से जावा में एक्स क्लाइंट लाइब्रेरी लिख सकते हैं जो PF_LOCAL पर काम करेगा। यह भी ध्यान दें कि लूपबैक इंटरफेस पर TCP मानक यूनिक्स सॉकेट की तुलना में बहुत अधिक ओवरहेड है।
ulidtko

हां, मुझे कुछ लाइब्रेरी मिलीं, लेकिन इससे मुझे तब तक मदद नहीं मिलेगी, जब तक मुझे वास्तविक यूडीएस-पता नहीं है। क्या यह कहीं दस्तावेज है?
पाओलो एबरमन

1
@ पाओलो, यूनिक्स डोमेन सॉकेट्स आमतौर पर फाइल सिस्टम के नेमस्पेस का उपयोग करते हैं। उनके पते फाइलनाम हैं । संबंधित फ़ाइल नोड्स "विशेष सॉकेट फाइलें" हैं। मेरे सिस्टम पर मेरे कई कनेक्शन हैं /tmp/.X11-unix/X0- यह AF_UNIX एड्रेस ( अपने खुद के देखने के लिए उपयोग ) का एक उदाहरण है netstat -x। X11 प्रोटोकॉल विनिर्देश को कनेक्ट करने के लिए सटीक पते निर्धारित करने चाहिए। और अगर आप उस प्रोटोकॉल के लिए क्लाइंट लाइब्रेरी लिख रहे हैं, तो आपको वास्तव में इसे पढ़ना होगा।
ulidtko

1
/tmp/.X11-unix/X0यहाँ एक सॉकेट के रूप में मौजूद है (OpenSUSE), भी, मैं घर पर (प्रश्न में नामित उबंटू प्रणाली पर) फिर से जाँच करूँगा। अब मुझे केवल देखना है कि 6000 पर टीसीपी सॉकेट के लिए इसे कैसे आगे बढ़ाया जाए।
पाओलो एबरमन

जवाबों:


8

लगता है कि वर्कअराउंड का उपयोग होगा socat। यहां एक कमांड लाइन है, जो काम करती है, अगर एक्स सर्वर पहले से ही टीसीपी पर नहीं चलता है:

socat -d -d TCP-LISTEN:6000,fork,bind=localhost UNIX-CONNECT:/tmp/.X11-unix/X0

तब मैं कर सकता हूं

xlogo -display localhost:0

अजीब बात है, यह काम नहीं करता है अगर मैं इसे 6001 पर सुनने देता हूं और फिर localhost:1इसके बजाय प्रदर्शन को निर्दिष्ट करता localhost:0हूं - मुझे मिलता है No protocol specified। लगता है कि मुझे एक्स प्रोटोकॉल को फिर से पढ़ना होगा। (और जेएसच पर यह फिर से साथ आता है Invalid MIT-MAGIC-COOKIE-1 key, लेकिन यह एक और समस्या है।)


हाँ!! मैं बनाने के लिए एक रास्ता तलाश कर दिया गया था xserver-allow-tcp=true के बाद एक्स पहले से ही के साथ शुरू किया गया था -nolisten tcp में /etc/X11/xinit/xserverrcपुन: प्रारंभ करने के बिना। केवल मेरे मामले में, bind=0.0.0.0मेरे बाहरी मेजबानों को अनुमति देने के लिए।
मार्कोस

5

Xorg कोड के पास वर्तमान में नियंत्रित करने के लिए कोई विकल्प नहीं है, जिस पर सुनने के लिए इंटरफेस है। इसे जोड़ना मुश्किल नहीं होना चाहिए, लेकिन अन्य मशीनों से 6000 को पोर्ट करने के लिए आने वाले कनेक्शन को ब्लॉक करने के लिए बस अपने फ़ायरवॉल को कॉन्फ़िगर करना आसान होना चाहिए।


2

बस कुछ और विचार ...

  1. इसे अनुमति दें लेकिन xhost के साथ ब्लॉक करें (और / या नेटवर्क फ़िल्टरिंग)

ऐसा करने का पारंपरिक तरीका एक्स सर्वर के लिए टीसीपी सॉकेट पर सुनने के लिए है और यह निर्धारित करने के लिए कि कौन से मेजबानों को कनेक्ट करने की अनुमति है xhost का उपयोग करें। Xhost (1) के लिए मैन पेज देखें। (इसके अतिरिक्त, निश्चित रूप से, आईपी पता और पोर्ट फ़िल्टरिंग यहां भी मदद करेगा, जैसा कि पिछले सुझावों ने नोट किया है।)

  1. केवल स्थानीय इंटरफ़ेस पर सुनें

ऊपर दिए गए टिप्पणी के अनुसार, अब वहाँ कोई कोड नहीं है, लेकिन लगभग!

याद रखें कि (लगभग) सभी मेजबानों में कम से कम दो इंटरफेस हैं, लूपबैक इंटरफ़ेस लो0 (हमेशा 127.0.0.1) और सामान्य ईथरनेट एथ0 (या wlan0 या जो भी हो, जो कहते हैं कि 192.168.0.128 है) और कई और अधिक हैं। आमतौर पर टीसीपी / आईपी सर्वर (यानी, एक्स सर्वर) उनके किसी भी इंटरफेस पर उनके किसी भी आईपी पते पर आने वाले कनेक्शन की अनुमति देगा, लेकिन अधिकांश सॉफ्टवेयर आपको एक आईपी पता निर्दिष्ट करने देगा यदि आप चाहें। वास्तविक कार्य बाइंड (2) द्वारा किया जाता है, जो कि INADDR_ANY (0.0.0.0) या वास्तविक आईपी एड्रेस लेता है।

Xorg सर्वर, स्थानीय-पता लागू करता है, लेकिन दुर्भाग्य से यह केवल XDMCP के लिए है (फ़ाइल os / xdmcp.c देखें जो इसे सही तरीके से लागू करता है जहाँ तक मुझे पता है।) एक्स प्रोटोकॉल के लिए वास्तविक कनेक्शन, मेरा मानना ​​है, सॉकेटिनैटक्रिएटलीस्टनर द्वारा किया जाता है। फ़ाइल में /usr/include/X11/Xtrans/Xtranssock.c, जो INADDR_ANY को पता सेट करता है और फिर आगे की प्रक्रिया के बिना इसे बांधता है। क्या जरूरत होगी -from ध्वज (जो os / xdmcp.c द्वारा FromAddress के रूप में निपटाया जाता है) को किसी तरह से Xtransransck.c में SocketCreateListener () से पहले चर 'sockname' के माध्यम से कनेक्ट करने के लिए। बेशक, समस्या यह है कि सभी परिवहन चीजें वास्तव में एक परिवहन-तटस्थ तरीके से की जाती हैं, इसलिए जानकारी को Xtranssock.c में प्राप्त करना थोड़ा मुश्किल है।

फ़ाइल पथ और इतने पर भिन्न हो सकते हैं, Ubuntu 10.04 LTS के साथ देखा गया था, और ध्यान दें कि Xtranssock.c में फ़ंक्शन नाम मैक्रो ट्रांस द्वारा बदल दिया गया है। http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

आशा है कि कुछ उपयोग की है।

सधन्यवाद

जोनाथन।


अभी के लिए, मैं जादू कुकी प्रमाणीकरण का उपयोग कर रहा हूं, इस प्रकार एक ही मेजबान से भी कनेक्शन की अनुमति नहीं दी जाएगी। xhostपहुंच को चौड़ा करेगा, इसे नीचे नहीं सिकोड़ेगा।
19lo में पाओलो एबरमन

और मुझे नहीं लगता कि मैं अपने एक्स सर्वर में हैक कर लूंगा, लेकिन ऐसा करने के लिए सुझाव के लिए धन्यवाद।
पाओलो एबरमन

9 साल बाद और यह नहीं बदला है। gitlab.freedesktop.org/xorg/lib/libxtrans/blob/master/…
daveloyall
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.