11

मैंने Google क्लाउड प्लेटफ़ॉर्म पर Using Protocol Forwarding के निर्देशों का पालन किया है। इसलिए मैं अब कुछ इस तरह है:Google क्लाउड फॉरवर्डिंग नियम आईपी पता से कैसे बाध्य और भेजें?

$ gcloud compute forwarding-rules list 
NAME REGION IP_ADDRESS  IP_PROTOCOL TARGET 
x-fr-1 us-west1 104.198.?.?? TCP   us-west1-a/targetInstances/x-target-instance 
x-fr-2 us-west1 104.198.?.?? TCP   us-west1-a/targetInstances/x-target-instance 
x-fr-3 us-west1 104.198.??.??? TCP   us-west1-a/targetInstances/x-target-instance 
x-fr-4 us-west1 104.198.??.??? TCP   us-west1-a/targetInstances/x-target-instance 
x-fr-5 us-west1 104.198.?.??? TCP   us-west1-a/targetInstances/x-target-instance 

:

(नोट।। नाम बदल दिया गया है और सवाल के निशान प्रतिस्थापित किया गया है मुझे यकीन है कि यह इन निजी लेकिन खेद की तुलना में बेहतर सुरक्षित रखने के लिए मायने रखती है नहीं कर रहा हूँ)

मेरा उदाहरण "एक्स" "x-target-instance" में है और इसमें "x-fr-5" के माध्यम से "x-fr-1" पांच अग्रेषण नियम हैं। मैं "x" पर nginx चला रहा हूं और मैं इसे अपने 6 बाहरी आईपी पते (उदाहरण के लिए + 5 अग्रेषण नियमों के लिए) से एक्सेस कर सकता हूं। अब तक सब ठीक है.

मुझे अब इन बाहरी आईपी पते पर सर्वर को बाध्य करने में दिलचस्पी है। का पता लगाने के लिए, मैं का उपयोग कर अजगर की कोशिश की:

import socket 
import time 

def serve(ip_address, port=80): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.bind((ip_address, port)) 
    try: 
     sock.listen(5) 
     while True: 
      con, _ = sock.accept() 
      print con.getpeername(), con.getsockname() 
      con.send(time.ctime()) 
      con.close() 
    finally: 
     sock.close() 

अब मैं "0.0.0.0" बाध्य कर सकते हैं और मैं कुछ रोचक परिणाम प्राप्त:

>>> serve("0.0.0.0") 
('173.228.???.??', 57288) ('10.240.?.?', 80) 
('173.228.???.??', 57286) ('104.198.?.??', 80) 

जब मैं उसके बाहरी आईपी पते पर सर्वर के साथ संवाद, "getockname" विधि इंस्टेंस के आंतरिक आईपी पते को वापस लाती है। लेकिन जब मैं किसी बाहरी आईपी पते पर सर्वर के साथ एक अग्रेषण नियम द्वारा उपयोग किए जाने के साथ संवाद करता हूं, तो "getockname" विधियां बाहरी आईपी पता देता है।

ठीक है, अब मैं उदाहरण के आंतरिक आईपी पते बाँध:

>>> serve("10.240.?.?") 
('173.228.???.??', 57295) ('10.240.?.?', 80) 

फिर मैं उसके बाहरी आईपी पते पर सर्वर के साथ संवाद कर सकते हैं, और "getsockname" विधि उदाहरण के आंतरिक IP पता देता है। यह थोड़ा अजीब लगता है।

इसके अलावा, अगर मैं उदाहरण के बाहरी आईपी पते बाध्य करने के लिए प्रयास करें:

>>> serve("104.198.?.??") 
error: [Errno 99] Cannot assign requested address 

तब मैं कोई त्रुटि मिलती है।

लेकिन, अगर मैं अग्रेषण नियम द्वारा इस्तेमाल किया बाहरी IP पते बाध्य करने के लिए और फिर एक अनुरोध करना का प्रयास करें:

>>> serve("104.198.??.???") 
('173.228.???.??', 57313) ('104.198.??.???', 80) 

यह काम करता है।

अंत में मैं "ifconfig" देखो:

ens4  Link encap:Ethernet HWaddr 42:01:0a:??:??:?? 
      inet addr:10.240.?.? Bcast:10.240.?.? Mask:255.255.255.255 
      inet6 addr: fe80::4001:???:????:2/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1 
      RX packets:37554 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:32286 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1000 
      RX bytes:41201244 (41.2 MB) TX bytes:3339072 (3.3 MB) 

lo  Link encap:Local Loopback 
      inet addr:127.0.0.1 Mask:255.0.0.0 
      inet6 addr: ::1/128 Scope:Host 
      UP LOOPBACK RUNNING MTU:65536 Metric:1 
      RX packets:9403 errors:0 dropped:0 overruns:0 frame:0 
      TX packets:9403 errors:0 dropped:0 overruns:0 carrier:0 
      collisions:0 txqueuelen:1 
      RX bytes:3155046 (3.1 MB) TX bytes:3155046 (3.1 MB) 

और मैं केवल दो इंटरफेस देखते हैं। जाहिर है, Google क्लाउड प्लेटफार्म नेटवर्किंग की क्षमताओं को कॉलेज में अपने कंप्यूटर नेटवर्किंग क्लास से याद किया जा सकता है। मेरे अवलोकनों को सारांशित करने के लिए:

  1. यदि मैं इंस्टेंस के बाहरी आईपी पते पर बाध्य करना चाहता हूं, तो मैं अपना आंतरिक आईपी पता बांधता हूं।
  2. उदाहरण के आंतरिक आईपी पते से जुड़ी एक प्रक्रिया उदाहरण के आंतरिक या बाहरी आईपी पते के बीच गंतव्य आईपी को अलग नहीं कर सकती है।
  3. एकल नेटवर्किंग एडाप्टर, "ens4", किसी भी उदाहरण के 6 बाहरी आईपी पते के लिए बाध्य पैकेट प्राप्त कर रहा है।

    1. मैं क्यों नहीं उदाहरण के बाहरी आईपी पते बाध्य कर सकते हैं:

    और यहाँ मेरे सवालों का है?

  4. यह कैसे है कि मैं नियमों को अग्रेषित करते हुए बाहरी आईपी पते को बांध सकता हूं जब मेरे पास कोई नेटवर्क एडेप्टर नहीं है?
  5. यदि मैं उदाहरण के बाहरी आईपी पते पर एसएसएच एक्सेस को प्रतिबंधित करना चाहता हूं, तो क्या मुझे आंतरिक आईपी पते को बांधने के लिए एसएसएच को कॉन्फ़िगर करना चाहिए?
  6. यदि मैं अग्रेषण नियम द्वारा उपयोग किए गए बाहरी आईपी पते में से एक पर HTTP प्रॉक्सी सेट करता हूं, तो प्रॉक्सी अनुरोध का स्रोत आईपी क्या होगा?
  7. आखिरकार, और यह एक बग हो सकता है, https://console.cloud.google.com/networking/loadbalancing/advanced/forwardingRules/list?project=xxx पर अग्रेषण नियमों को वेब इंटरफ़ेस में खाली क्यों सूचीबद्ध किया गया है जब मैं उन्हें "gcloud compute अग्रेषण-नियम सूची" के साथ देख सकता हूं?
+1

तीसरे प्रश्न के लिए, हम आम तौर पर जो करते हैं वह टीसीपी पर फ़ायरवॉल बनाते हैं: 22 आंतरिक नेटवर्क आईपी रेंज की स्रोत आईपी रेंज के साथ, इस तरह आंतरिक नेटवर्क के भीतर से कनेक्शन ही स्वीकार किए जाएंगे। – Dagang

उत्तर

4
  1. यह स्थानीय अनुमार्गण तालिका में नहीं है ('आईपी मार्ग शो तालिका स्थानीय') [आप निश्चित रूप से यह जोड़ सकता है (उदाहरण के लिए 'आईपी पता जोड़ने xxxx/32 देव ens4'), लेकिन ऐसा करने से आपको बहुत अच्छा नहीं होगा, क्योंकि कोई भी पैकेट आपके वीएम को गंतव्य पते के रूप में उपयोग करने के लिए वितरित नहीं होगा - नीचे देखें ...]
  2. क्योंकि अग्रेषित पते आपकी स्थानीय रूटिंग तालिका ('आईपी) में जोड़े गए हैं मार्ग शो तालिका स्थानीय ')
  3. आप [हालांकि ध्यान दें कि यह बाहरी ग्राहकों के लिए एसएसएच पहुंच प्रतिबंधित करेगा बाहरी आईपी पते, या अपने वर्चुअल नेटवर्क के भीतर क्लाइंट को बाहरी या आंतरिक आईपी पता लक्षित करना]। हालांकि, जैसा कि पहले से ही उल्लेख किया गया है - स्वीकृत क्लाइंट पते (सर्वर पता नहीं) को प्रतिबंधित करना अधिक महत्वपूर्ण हो सकता है, और इसके लिए फ़ायरवॉल अधिक प्रभावी होगा।
  4. यह इस बात पर निर्भर करता है कि प्रॉक्सी अनुरोध का गंतव्य कहां जाता है। यदि यह आपके वर्चुअल नेटवर्क के लिए आंतरिक है, तो यह वीएम का आंतरिक आईपी पता होगा, अन्यथा यह वीएम का बाहरी आईपी पता होने के लिए एनएटी-एड (आपके वीएम के बाहर) होगा।
  5. उस पृष्ठ पर कई टैब हैं - जिनमें से दो फ़ॉरवर्डिंग नियम ("वैश्विक अग्रेषण नियम" बनाम "अग्रेषण नियम") के विभिन्न वर्ग सूचीबद्ध करते हैं। बेशक कुछ भ्रामक: पी

एक अन्य बात यह है कि थोड़ा भ्रामक है - जब (वीएम बाहर गंतव्य पता के रूप में अपनी बाहरी IP का उपयोग कर अपने वी एम के पैकेट भेजने, एक इकाई एक आभासी स्विच/रूटर/नेट के रूप में यह के बारे में सोच डिवाइस) वर्चुअल एनआईसी के लिए virtio ड्राइवर पर पैकेट आने से पहले स्वचालित रूप से गंतव्य को आंतरिक आईपी के रूप में संशोधित करता है - इसलिए उस व्यवहार को संशोधित करने के लिए आप कुछ भी नहीं कर सकते हैं। अग्रेषण नियम के आईपी को संबोधित किए गए पैकेट, हालांकि, एनएटी-एड नहीं हैं (जैसा कि आपने देखा है)।

आशा है कि मदद करता है!

+1

ग्रेट उत्तर, लेकिन किस कारण से बाहरी आईपी और अग्रेषण नियम आईपी अलग-अलग लागू किए गए हैं? – Dagang

+0

क्या स्थानीय रूटिंग तालिका आईपी गंतव्यों को इस मशीन को लक्षित करती है? इसलिए इसे अगली हॉप में अग्रेषित करने के बजाय परिवहन परत (टीसीपी/यूडीपी) को आगे बढ़ाना चाहिए। – Dagang

+0

मैं अधिकार के साथ बात नहीं कर सकता कि उन्हें अलग-अलग क्यों लागू किया गया है - यह कहने के लिए पर्याप्त है कि वे हैं, और Google ने आपके लिए असाइन किए गए बाहरी आईपी पते के साथ एनएटी करने के लिए चुना है, लेकिन नियम आईपी अग्रेषित करने के साथ नहीं।[तथ्य यह है कि वे एनएटी अग्रेषण नियम आईपी नहीं करते हैं, यह पहचानने में मदद करता है कि कोई ग्राहक किस लक्ष्यीकरण कर रहा है] स्थानीय रूटिंग तालिका के लिए - बहुत अधिक हाँ। ध्यान दें कि यदि आप उस तालिका में किसी भी स्थानीय पते को 'पिंग' करते हैं, तो इसे लूपबैक इंटरफ़ेस पर भेजा जाएगा। इस समय मुझे सबसे अच्छा संदर्भ मिल सकता है http://linux-ip.net/html/routing-tables.html – Kevin

संबंधित मुद्दे