একটি ভিন্ন শারীরিক নেটওয়ার্ক ইন্টারফেস এবং ডিফল্ট গেটওয়ে ব্যবহার করে ডকার পাত্রগুলি থেকে রাউটিং


13

পেছনের তথ্য

আমার কাছে দুটি নেটওয়ার্ক ইন্টারফেসের সাথে একটি সার্ভার রয়েছে যা ডকার চলছে। কিছু ভার্চুয়ালাইজেশন সরঞ্জামের মতো ডকার একটি লিনাক্স ব্রিজ ইন্টারফেস তৈরি করে docker0। এই ইন্টারফেসটি একটি আইপি দিয়ে ডিফল্টরূপে কনফিগার করা হয় 172.17.42.1এবং সমস্ত ডকার পাত্রে তাদের গেটওয়ে হিসাবে এই ইন্টারফেসের সাথে যোগাযোগ করে এবং একই /16পরিসরে আইপি ঠিকানা বরাদ্দ করা হয় । আমি এটি বুঝতে পেরেছি, ধারকগুলিতে / থেকে সমস্ত নেটওয়ার্ক ট্র্যাফিক একটি NAT এর মধ্য দিয়ে যায়, সুতরাং বহির্মুখী এটি আসে বলে মনে হয় 172.17.42.1এবং অভ্যন্তরে এটি প্রেরণ হয়ে যায় 172.17.42.1

আমার সেটআপটি দেখতে এমন দেখাচ্ছে:

                                          +------------+        /
                                          |            |       |
                            +-------------+ Gateway 1  +-------
                            |             | 10.1.1.1   |     /
                     +------+-------+     +------------+    |
                     |     eth0     |                      /
                     |   10.1.1.2   |                      |
                     |              |                      |
                     | DOCKER HOST  |                      |
                     |              |                      | Internet
                     |   docker0    |                      |
                     |   (bridge)   |                      |
                     |  172.17.42.1 |                      |
                     |              |                      |
                     |     eth1     |                      |
                     |  192.168.1.2 |                      \
                     +------+-------+     +------------+    |
                            |             |            |     \
                            +-------------+ Gateway 2  +-------
                                          | 192.168.1.1|       |
                                          +------------+            

সমস্যাটি

আমি রুট থেকে / সেকেন্ডের যে কোনো Docker পাত্রে সব ট্রাফিক চান eth1 192.168.1.2একটি ডিফল্ট গেটওয়ে ইন্টারফেস 192.168.1.1, যখন হোস্ট মেশিনের থেকে / সমস্ত ট্রাফিক থাকার বাইরে যেতে eth0 10.1.1.2একটি ডিফল্ট গেটওয়ে ইন্টারফেস 10.1.1.1। আমি এখন পর্যন্ত বিভিন্ন জিনিস চেষ্টা করেও লাভ করতে পারি নি তবে একটি জিনিস যা আমি মনে করি এটি সংশোধন করা সবচেয়ে নিকটতম তা iproute2 এর মতো ব্যবহার করা:

# Create a new routing table just for docker
echo "1 docker" >> /etc/iproute2/rt_tables

# Add a rule stating any traffic from the docker0 bridge interface should use 
# the newly added docker routing table
ip rule add from 172.17.42.1 table docker

# Add a route to the newly added docker routing table that dictates all traffic
# go out the 192.168.1.2 interface on eth1
ip route add default via 192.168.1.2 dev eth1 table docker

# Flush the route cache
ip route flush cache

# Restart the Docker daemon so it uses the correct network settings
# Note, I do this as I found Docker containers often won't be able
# to connect out if any changes to the network are made while it's     
# running
/etc/init.d/docker restart

আমি যখন কোনও ধারক নিয়ে আসি আমি এগুলি করার পরে একেবারে পিন করতে পারি না। এই ধরণের রাউটিংয়ের জন্য শারীরিক ইন্টারফেসগুলি ঠিক সেভাবেই ব্রিজ ইন্টারফেসগুলি পরিচালনা করা হয় কিনা তা আমি অনিশ্চিত এবং কেবল একটি স্যানিটি পরীক্ষার পাশাপাশি আমি কীভাবে এই আপাতদৃষ্টিতে সহজ কাজটি সম্পাদন করতে পারি তার কোনও টিপস চাই।


NAT সম্পর্কে আপনার মন্তব্য সঠিক নয়। এটি 172.17.0.0/16 উত্স ঠিকানাতে মাস্ক্রেড করতে সেট করেছে যেখানে আউটপুট ইন্টারফেসটি ডকার0 নয়। অর্থাত্ একটি পোস্টারিং -s 172.17.0.0/16! -o docker0 -j মাস্কোয়াডে। যার অর্থ যদি কোনও ডকারের ধারক থেকে উত্পন্ন প্যাকেটটি ইথ 0 বা এথ 1 এর মাধ্যমে বের হয় তবে এটি সেই ইন্টারফেসের আইপি ঠিকানাটি গ্রহণ করবে, 172.17.xx আইপি নয়।
ম্যাট

আপনার মন্তব্যের জন্য ধন্যবাদ. সুতরাং যে একটি নির্দিষ্ট ইন্টারফেস থেকে রাউটিং আউট জন্য আমার পদ্ধতির পরিবর্তন হবে, তাই না? আপনি কি জানেন যে আমি এটি কীভাবে সম্পাদন করতে পারি? এটি যেমন দাঁড়িয়ে আছে ডকার মনে হয় কেবল হোস্ট সিস্টেমের ডিফল্ট গেটওয়ে ব্যবহার করবে এবং এটি পছন্দসই আচরণ নয়। আমি চাই সমস্ত জিনিস ডকার একটি নির্দিষ্ট ইন্টারফেস থেকে বেরিয়ে আসে।

আমি নিশ্চিত না যে আমার প্রস্তাবিতটি কেন কাজ করছে না। তবে অন্য বিকল্পটি পাইপওয়ার্ক ব্যবহার করা হতে পারে। github.com/jpetazzo/pipework এছাড়াও ডকার সাহায্যের উন্নত নেটওয়ার্কিং বিভাগটি পড়তে কার্যকর হতে পারে। docs.docker.com/articles/networking
ম্যাট

@ ম্যাট এই বিষয়ে আপনার পরামর্শের জন্য আপনাকে ধন্যবাদ। পাইপ ওয়ার্কটি যা পড়েছি তা থেকে কোনও কন্টেইনারটি সঠিক গেটওয়েতে অ্যাক্সেস পেতে শুরু করার পরে অতিরিক্ত কমান্ডের প্রয়োজন যা সুরক্ষার দুর্বলতার মতো বলে মনে হয়। এটি মূলত একাধিক হোস্টের একসাথে পাত্রে সংযোগ স্থাপনের জন্য তৈরি হয়েছিল, যা এখানে আমার লক্ষ্য নয়। ডকার অ্যাডভান্সড নেটওয়ার্কিং ডকস হিসাবে, আমি আবার একবার দেখে নেব, তবে এখনও পর্যন্ত এটি এই পরিস্থিতিতে সহায়ক হয়নি (এখানে পোস্ট করার আগে আমি এটি পড়েছিলাম)। আমি ডকার গিথুব ইস্যু পৃষ্ঠায় এই পোস্টটির একটি লিঙ্ক পোস্ট করতে যাচ্ছি এবং সেখান থেকে এটি কীভাবে যায় তা দেখুন।

এখানে গিথুব

উত্তর:


1

আপনাকে iptables সেটআপে আরও দেখতে হবে। ডকার কনটেইনার সাবনেট থেকে উত্পন্ন সমস্ত ট্র্যাফিককে মাস্ক্রেড করে, 172.17.0.0/16 বলুন, 0.0.0.0 এ। আপনি যদি চালান iptables -L -n -t nat, আপনি নাট টেবিলের নীচে পোষ্ট্রুটিং চেইন দেখতে পাবেন যা এটি করে -

চেইন পোষ্ট্রোটিং (নীতিমালা গ্রহণ)
লক্ষ্য সুরক্ষা অপ্ট উত্স গন্তব্য
সমস্ত মাস্ক্রেড করুন - 172.17.0.0/16 0.0.0.0/0

এখন, আপনি এই নিয়মটি সরাতে পারেন এবং এটি এমন একটি নিয়মের সাথে প্রতিস্থাপন করতে পারেন যা আপনার দ্বিতীয় ইন্টারফেসের আইপি - 192.168.1.2 এর ধারকগুলির সাবনেট থেকে উত্পন্ন সমস্ত ট্র্যাফিককে ম্যাসেজ করে। মোছার বিধিটি হবে, ধরেই নেওয়া যে এটি পোষ্ট্রোটিং চেইনের অধীনে প্রথম নিয়ম -

iptables -t nat -D পোষ্ট্রোটিং 1

তারপরে আপনি এই কাস্টম বিধি যুক্ত করুন -

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j SNAT - থেকে উত্স 192.168.1.2

প্রকৃতপক্ষে এটি আউটপুট ইন্টারফেসে এটি মাস্কারেড করে। গন্তব্য অংশটি কেবল এটুকুই বলছে যে উত্স সাবনেট থেকে যে কোনও গন্তব্য পর্যন্ত উত্পন্ন কোনও ট্র্যাফিক মাসকারাড করা হবে।
ম্যাট

দুর্ভাগ্যক্রমে এটি কার্যকর হয়নি। আমার সম্পূর্ণ প্রক্রিয়া চালানোর জন্য ছিল: ip rule add from 172.17.0.0/16 table docker ip route add default via 192.168.1.2 dev eth1 table docker ip route flush cache iptables -t nat -D POSTROUTING 1 iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j SNAT --to-source 192.168.1.2 /etc/init.d/docker restart। তারপরে আমি একটি পাত্রে একটি পিং আউট এবং একটি ট্রেস্রুট চালানোর চেষ্টা করেছি, এবং কোনও কিছুই পৌঁছাতে অক্ষম।

আমার অনুরূপ প্রয়োজনীয়তা ছিল, পাবলিক আইপিতে পৌঁছানোর জন্য হোস্টের গৌণ আইপি সেটআপ রয়েছে। এবং আমি ডকারের ধারকও এটি অনুসরণ করতে চাই। এই ক্ষেত্রে এটি কাজ করেছে: "iptables -t nat -I POSTROUTING 1 -s 172.17.0.0/16 -d PUBIP / 32 -j SNAT - টো উত্স সেকেন্ডারিপ"
রাম

1

একটি বন্ধু এবং আমি এই সঠিক সমস্যার দিকে ছুটে এসেছি যেখানে আমরা ডকারের সমর্থনটি একাধিক নেটওয়ার্ক ইন্টারফেসের সার্ভিসিংয়ের অনুরোধ করতে চাইছিলাম। আমরা বিশেষত এডাব্লুএস ইসি 2 পরিষেবা নিয়ে কাজ করছিলাম যেখানে আমরা অতিরিক্ত ইন্টারফেসগুলি সংযুক্ত / কনফিগারেশন / আনতে যাচ্ছিলাম। এই প্রকল্পে , আপনার যা প্রয়োজন তার চেয়েও অনেক বেশি তাই আমি আপনার এখানে যা প্রয়োজন কেবল তা অন্তর্ভুক্ত করার চেষ্টা করব।

প্রথমত, আমরা যা করেছি তা হল এর জন্য একটি পৃথক রুট টেবিল তৈরি করা eth1:

ip route add default via 192.168.1.2 dev eth1 table 1001

এর পরে আমরা কিছু সংযোগ চিহ্নগুলি আসার জন্য মঙ্গলের টেবিলটি কনফিগার করেছি eth1:

iptables -t mangle -A PREROUTING -i eth1 -j MARK --set-xmark 0x1001/0xffffffff
iptables -t mangle -A PREROUTING -i eth1 -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff

পরিশেষে আমরা fwmarkআমাদের তৈরি নতুন টেবিলটি ব্যবহার করার জন্য সকলের জন্য এই নিয়মটি যুক্ত করি।

ip rule add from all fwmark 0x1001 lookup 1001

নীচের iptablesকমান্ডটি সংযোগ চিহ্নটি পুনরুদ্ধার করবে এবং তারপরে রাউটিং বিধিটিকে সঠিক রাউটিং টেবিলটি ব্যবহার করার অনুমতি দেবে।

iptables -w -t mangle -A PREROUTING -i docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff

আমি বিশ্বাস করি যে এটি আমাদের জটিল জটিল উদাহরণগুলির থেকে প্রয়োজনীয় যেখানে (যেমন আমি বলেছিলাম) eth1বুট করার সময় আমাদের প্রকল্পটি সংযুক্তি / কনফিগারেশন / ইন্টারফেসটি আনছিল।

এখন এই উদাহরণটির eth0মাধ্যমে সংযোগগুলি পরিষেবা দেওয়ার থেকে সংযোগগুলি থামিয়ে দেবে না docker0তবে আমি বিশ্বাস করি এটি প্রতিরোধের জন্য আপনি কোনও রাউটিং বিধি যুক্ত করতে পারেন।


@ স্টান্টম্যাচিন যদি আপনি এটি চেষ্টা করার সুযোগ পেয়ে থাকেন তবে কেবল কৌতূহলী? আপনি যদি ইতিমধ্যে নিজে থেকে কিছু বের করে নিয়ে থাকেন তবে আপনি কি নিজের সমাধানটি ভাগ করে নিতে সক্ষম হবেন?
উইলিয়ামসদেব

হাই @ উইলিয়ামসবদেব - পুরাতন পোস্ট এবং দীর্ঘ শট, তবে আপনি কি মনে করেন যে এই সমাধানটি আমার ইস্যুতেও এসও তে কাজ করবে? stackoverflow.com/questions/51312310/…
জুলি রজার

2
জলি রজার - আমি বিশ্বাস করি এটি আপনার সমস্যার সমাধান করবে। আমি সম্প্রতি অন্য একটি টিমকে এই ব্লগ পোস্টটি সম্পর্কে জিজ্ঞাসা করেছি (মূলত এখানে একই সমাধান) এবং তারা বলেছে এটি দুর্দান্ত কাজ করেছে। উইলিয়ামসদেব.কম / পোস্ট
ডকার-

0

মাস্ক্রেড 172.17.42.1 এর পরিবর্তে নয়

 -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

যার অর্থ এই বিধিটি সঠিকভাবে কাজ করবে না।

ip rule add from 172.17.42.1 table docker

পরিবর্তে চেষ্টা করুন

ip rule add from 172.17.0.0/16 table docker

দুর্ভাগ্যক্রমে এটি কার্যকর হয়নি। আমার কনটেইনারগুলি এখনও হোস্টের মতো একই ডিফল্ট গেটওয়েতে বেরিয়ে আসছিল। আমি যা ip rule add from 172.17.0.0/16 table docker ip route add default via 192.168.1.2 dev eth1 table docker ip route flush cache /etc/init.d/docker restart চালিয়েছি তা এখানে: পাত্রে থেকে আমি একটি ট্রেস্রয়েট চালিয়েছিলাম এবং প্রথম হপটি 10.1.1.1 এ ছিল যখন এটি হওয়া উচিত ছিল 192.168.1.1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.