লিনাক্সে একটি শিশু প্রক্রিয়া "অফলাইন" চালানোর জন্য আদেশ (কোনও বাহ্যিক নেটওয়ার্ক নেই)


15

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

তবে একটি রিমোট মেশিনে সংযোগ স্থাপনের প্রচেষ্টা ব্যর্থ হওয়া উচিত।

আমি এমন একটি ইউটিলিটি রাখতে চাই যা strace/ unshare/ এর মতো কাজ করে sudoএবং কেবলমাত্র ইন্টারনেট (এবং ল্যান) গোপন করা এবং অন্য সব কিছু দিয়ে এখনও একটি কমান্ড চালায়:

$ offline my-program-to-test

এই প্রশ্নের উত্তরের ইঙ্গিত রয়েছে: একটি প্রক্রিয়াটির নেটওয়ার্ক অ্যাক্সেসকে ব্লক করুন?

সেখানে বেশ কয়েকটি প্রস্তাবনা রয়েছে, যেমন অন্য ব্যবহারকারী হিসাবে চালানো তারপর iptables ম্যানিপুলেট, বা unshare -n। তবে উভয় ক্ষেত্রেই আমি ইউনিক্স ডোমেন সকেট পেতে এবং মূল সিস্টেমের সাথে লুপব্যাকটি ভাগ করে নেওয়ার প্রবণতাটি জানি না - এই প্রশ্নের উত্তরগুলি কেবল আমাকে কীভাবে পুরো নেটওয়ার্কটি ভাগ করে নেবে তা আমাকে বলে ।

আমি যে প্রোগ্রামটি পরীক্ষা করছি তার জন্য এখনও আমার এক্স সার্ভার এবং ডিবিাসের সাথে সংযোগ স্থাপন করা দরকার এবং এমনকি সিস্টেমের অন্যান্য অ্যাপ্লিকেশন থেকে সংযোগের জন্য লুপব্যাক শুনতে সক্ষম হবেন।

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

স্থানীয়ভাবে অ-লোকাল ঠিকানা উল্লেখ করে যে নেটওয়ার্ক কলগুলি ব্যর্থ হবে তা বাদ দিয়ে আমি স্বাভাবিকভাবেই 100% চালানোর প্রক্রিয়াটি পছন্দ করি। আদর্শভাবে একই ইউআইডি, একই বাড়ির, একই pwd, একই ... অফলাইন বাদে রাখা।

আমি ফেডোরা 18 ব্যবহার করছি, সুতরাং অপরিবর্তনীয় লিনাক্স উত্তরগুলি ঠিক আছে (প্রত্যাশিত, এমনকি)।

আমি সি সি প্রোগ্রাম লিখে এটি সমাধান করতে পেরেও আনন্দিত, যদি এর সাথে জড়িত থাকে, সুতরাং সি লিখার সাথে জড়িত উত্তরগুলি ভাল। আমি কেবল জানি না যে স্থানীয় নেটওয়ার্ক রাখার সময় বহিরাগত নেটওয়ার্ক অ্যাক্সেস প্রত্যাহার করার জন্য সি প্রোগ্রামটির দরকার কী কী সিস্টেমে কল করে।

যে কোনও বিকাশকারী "অফলাইন মোড" সমর্থন করার চেষ্টা করছেন সম্ভবত এই ইউটিলিটিটির প্রশংসা করবে!

উত্তর:


9

Traditionalতিহ্যবাহী উত্তর হ'ল প্রোগ্রামটি অন্য ব্যবহারকারী এবং ব্যবহার হিসাবে চালানো iptables -m owner। এইভাবে, নেটওয়ার্ক কনফিগারেশন ভাগ করা হয়েছে। তবে, নেমস্পেসগুলির আবির্ভাবের সাথে একটি সহজ উপায় রয়েছে।

নেমস্পেসগুলির সাহায্যে আপনি নেটওয়ার্কটি ভাগ করে নিন, তারপরে আপনার যদি সীমাবদ্ধ নেটওয়ার্ক অ্যাক্সেসের প্রয়োজন হয় তবে ভার্চুয়াল নেটওয়ার্ক লিঙ্ক তৈরি করুন।

ইউনিক্স ডোমেন সকেটগুলি ভাগ করতে, আপনার কেবলমাত্র 2010 প্যাচের পরে সাম্প্রতিক পর্যায়ে কার্নেল থাকা দরকার , সুতরাং 2.6.36 বা তার বেশি (যা আরএইচইএল / সেন্টোস ব্যতীত লেখার সময় সমস্ত বর্তমান বিতরণে ঘটেছে)।

প্রোগ্রামটি তার নিজস্ব আইপি নেমস্পেসে চালান। প্রোগ্রামটি শুরুর আগে ভার্চুয়াল ইথারনেট ইন্টারফেসটি স্থাপন করুন। খুব বেশি ডকুমেন্টেশন আছে বলে মনে হয় না; আমি কয়েকটি ব্লগে সঠিক মন্ত্রটি পেয়েছি:

নিচে snippet, আমি ব্যবহার ns_execহয় এই মোড়কের প্রায়setns সীমাবদ্ধ নামস্থান চলমান প্রক্রিয়া থেকে নেটওয়ার্ক লিঙ্ক হোস্ট পাশ আনতে মানুষ পৃষ্ঠা থেকে তালিকাভুক্ত। আপনার আসলে এটির দরকার নেই: আপনি সীমাবদ্ধ নেমস্পেসের বাইরে থেকে লিঙ্কটির হোস্ট সাইড সেট আপ করতে পারেন। ভিতরে থেকে এটি করা নিছক প্রবাহ নিয়ন্ত্রণের সুবিধার্থে অন্যথায় লিঙ্কটি প্রতিষ্ঠিত হওয়ার পরে আপনার প্রোগ্রাম শুরু করার আগে সেটআপ করতে আপনার কিছুটা সমন্বয় প্রয়োজন।

unshare -n -- sh -c '
  # Create a virtual ethernet interface called "confined",
  # with the other end called "global" in the namespace of PID 1
  ip link add confined type veth peer name global netns 1

  # Bring up the confined end of the network link
  ip addr add 172.16.0.2/30 dev confined
  ip link set confined up

  # Bring up the global end of the network link
  ns_exec /proc/1/ns/net ifconfig global 172.16.0.1 netmask 255.255.255.252 up

  # Execute the test program
  exec sudo -E -u "$TARGET_USER" "$0" "$@"
' /path/to/program --argument

রুট হিসাবে আপনাকে এগুলি করতে হবে। কার্নেল 3.8 ব্যবহারকারী নামব্যবধান প্রবর্তনের এই কোনো বিশেষ অনুমতির সঙ্গে করা সম্ভব করতে পারে, নেটওয়ার্ক লিঙ্ক বিশ্বব্যাপী শেষ স্থাপনের ব্যতীত।

আমি জানি না যে কীভাবে দুটি নেমস্পেসের মধ্যে লোকালহোস্ট ভাগ করা যায়। ভার্চুয়াল ইথারনেট ইন্টারফেস একটি পয়েন্ট-টু-পয়েন্ট ব্রিজ তৈরি করে। আপনি চাইলে iptables/ থেকে ট্র্যাফিক পুনর্নির্দেশের জন্য ফরোয়ার্ডিং বিধিগুলি ব্যবহার করতে পারেন lo


ভাল অতিরিক্ত তথ্য, ধন্যবাদ। আমি মনে করি ভ্যাথ আমাকে নাম স্থানটির "বাইরের" সাথে একটি লিঙ্ক দেয় তবে আমার নতুন নেমস্পেসটি এখনও একই নেটওয়ার্ক নোড অ-স্থানীয় ইন্টারফেসের চেয়ে আলাদা নেটওয়ার্ক নোডের সমান amounts প্রভাবগুলি (?): ইউনিক্স ডোমেন / অ্যাবস্ট্রাক্ট সকেটগুলি এখনও ব্যর্থ হবে এবং লুপব্যাকটি iptables এর মাধ্যমে ফরোয়ার্ড করা যেতে পারে, তবে ফরোয়ার্ডিং ভাগ করে নেওয়া অর্জন করে না - যে, মূল এবং সীমাবদ্ধ নেমস্পেস উভয় লুপব্যাক এবং উভয় সেট (গতিগতভাবে) শুনতে পারে - পরিবর্তন) বন্দরগুলি উভয় নেমস্পেসে দৃশ্যমান হওয়া দরকার ... আমি কী চাই তা অনুমান করা শুরু করা এখানে অসম্ভব: - /
হ্যাভোক পি

1

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

https://github.com/quitesimpleorg/qsni


0

/ !! \ এটি সম্ভবত একটি বৈধ উত্তর নয় কারণ এটি আপনার সমস্ত ট্র্যাফিক আপনার সাথে নেবে, কেবল একটি পিডের ট্র্যাফিকই নয়।

আমি এটি ব্যবহার করি নি, তবে আমি মনে করি আপনি সম্ভবত কমকাস্ট ব্যবহার করতে পারেন:

https://github.com/tylertreat/Comcast

100% প্যাকেট ক্ষতি সেট

আবার, আমি এটি পরীক্ষা করিনি, তবে তাত্ত্বিকভাবে, তাদের রিডমি থেকে আপনি যা করতে পারেন তা থেকে সংশোধিত:


লিনাক্স

লিনাক্সে, আপনি iptablesআগত এবং বহির্গামী প্যাকেটগুলি ড্রপ করতে ব্যবহার করতে পারেন ।

$ iptables -A INPUT -m statistic --mode random --probability 1 -j DROP
$ iptables -A OUTPUT -m statistic --mode random --probability 1 -j DROP

বিকল্পভাবে, আপনি ব্যবহার করতে পারেন tcযা কিছু অতিরিক্ত বিকল্প সমর্থন করে।

$ tc qdisc change dev eth0 root netem reorder 0 duplicate 0 corrupt 1

পুনঃ স্থাপন করতে:

$ tc qdisc del dev eth0 root netem
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.