আইপি সেটগুলি পুনরায় দেখা গেছে
ইতিমধ্যে আইপি সেটগুলি উল্লেখ করে একটি উত্তর রয়েছে। তবে এটি বরং দ্বি-মাত্রিক কারণ এটি ক্লাসিক নিয়মের তুলনায় পারফরম্যান্স লাভের উপর দৃষ্টি নিবদ্ধ করে এবং আইপি সেটগুলি যে সমস্যাটি হ্রাস করে তা হ্রাস করে অনেকের ব্যক্তিগত আইপি ঠিকানা যা সহজেই সিআইডিআর স্বরলিপিতে সাবনেট হিসাবে প্রকাশ করা যায় না।
নীচে স্বরলিপি ব্যবহৃত
কারণ ipset
আমি পড়ে ipset restore
এবং দ্বারা লিখিত স্বরলিপি ব্যবহার করব ipset save
।
অনুসারে iptables
(এবং ip6tables
) বিধিগুলির জন্য আমি স্বরলিপিটি পড়ে iptables-restore
এবং দ্বারা লিখিত হিসাবে ব্যবহার করব iptables-save
। এটি একটি সংক্ষিপ্ত স্বরলিপি তৈরি করে এবং এটি আমাকে সম্ভাব্য আইপিভি 4-কেবল (উপসর্গযুক্ত -4
) বা আইপিভি 6-কেবল (উপসর্গযুক্ত -6
) বিধিগুলি হাইলাইট করতে দেয় ।
কিছু উদাহরণে আমরা প্যাকেট প্রবাহকে অন্য চেইনে রূপান্তর করব। চেইনটি সেই মুহুর্তে বিদ্যমান বলে ধরে নেওয়া হয়, তাই চেইনগুলি তৈরি করার জন্য লাইন তৈরি হয় না (সারণীর নামটিও উল্লেখ করা হয় না বা শেষে কমান্ডগুলি COMMIT
দেওয়া হয় না)।
উন্নত আইপি সেট
অন্যান্য উত্তরগুলিতে বর্ণিত আইপি সেটগুলি আরও অনেক কিছু করতে পারে এবং আপনার এখানে অবশ্যই এই সংক্ষিপ্ত এন্ট্রি ছাড়াও আইপি সেট ডকুমেন্টেশন ( ipset(8)
) পড়তে হবে iptables-extensions(8)
।
উদাহরণ হিসেবে বলা যায় আমি প্রধানত তিনটি সেট ধরনের উপর ফোকাস করব: hash:ip
, hash:net
এবং list:set
, কিন্তু তুলনায় আরও বেশি এবং তারা সকল বৈধ ব্যবহারের ক্ষেত্রে আছে।
আপনি উদাহরণস্বরূপ , কেবল আইপি ঠিকানাগুলি নয়, পোর্ট নম্বরগুলিও মেলাতে পারেন ।
সংরক্ষণ এবং মত আইপি সেট পুনরূদ্ধার iptables-save
এবংiptables-restore
আপনি বাল্কে আইপি সেট ঘোষণাগুলি তৈরি করতে পারেন এবং এগুলিতে পাইপ রেখে এগুলি আমদানি করতে পারেন ipset restore
। আপনি যদি ইতিমধ্যে বিদ্যমান এন্ট্রিগুলির বিরুদ্ধে আপনার কমান্ডটিকে আরও স্থিতিশীল করতে চান তবে ব্যবহার করুন ipset -exist restore
।
যদি আপনার বিধিগুলি যদি এমন কোনও ফাইলে থাকে যা default.set
আপনি ব্যবহার করতে চান:
ipset -exist restore < default.set
এর মতো একটি ফাইল সেগুলিতে প্রবেশের জন্য create
এবং সেগুলিতে প্রবেশের জন্য থাকতে পারে add
। তবে সাধারণত কমান্ড লাইন থেকে প্রাপ্ত বেশিরভাগ কমান্ডেরই ফাইলগুলিতে অনুরূপ সংস্করণ থাকে। উদাহরণ (ডিএনএস সার্ভারের একটি সেট তৈরি করা):
create dns4 hash:ip family inet
create dns6 hash:ip family inet6
# Google DNS servers
add dns4 8.8.8.8
add dns4 8.8.4.4
add dns6 2001:4860:4860::8888
add dns6 2001:4860:4860::8844
এখানে একটি সেট আইপিভি 4 ( dns4
) এবং একটি আইপিভি 6 ( dns6
) এর জন্য তৈরি করা হয়েছে।
আইপি সেটে সময়সীমা
আইপি সেটগুলিতে টাইমআউটগুলি সেট প্রতি প্রতি ডিফল্ট হিসাবে এবং প্রতিটি প্রবেশের জন্যও সেট করা যেতে পারে। পরিস্থিতিগুলির জন্য এটি খুব দরকারী যেখানে আপনি কাউকে অস্থায়ীভাবে ব্লক করতে চান (যেমন পোর্ট-স্ক্যানিং বা আপনার এসএসএইচ সার্ভারকে জোর করে চাপিয়ে দেওয়ার চেষ্টা করার জন্য)।
এটি যেভাবে কাজ করে তা নিম্নরূপ (আইপি সেট তৈরির সময় ডিফল্ট):
create ssh_loggedon4 hash:ip family inet timeout 5400
create ssh_loggedon6 hash:ip family inet6 timeout 5400
create ssh_dynblock4 hash:ip family inet timeout 1800
create ssh_dynblock6 hash:ip family inet6 timeout 1800
আমরা নীচে এই নির্দিষ্ট সেটগুলিতে ফিরে যাব এবং তারা কেন সেভাবে সেট করা হচ্ছে তার যুক্তি।
আপনি যদি কোনও নির্দিষ্ট আইপি ঠিকানার জন্য সময়সীমা নির্ধারণ করতে চান, আপনি কেবল বলতে পারেন:
add ssh_dynblock4 1.2.3.4 timeout 7200
(সেট) ডিফল্ট আধ ঘন্টাের পরিবর্তে আইপি 1.2.3.4 কে দুই ঘন্টা অবরুদ্ধ করতে।
আপনি যদি ipset save ssh_dynblock4
কিছুক্ষণ পরে এটির দিকে নজর রাখেন তবে আপনি এর লাইনে কিছু দেখতে পাবেন:
create ssh_dynblock4 hash:ip family inet hashsize 1024 maxelem 65536 timeout 1800
add ssh_dynblock4 1.2.3.4 timeout 6954
সময়সীমা সাবধান
- টাইমআউটগুলি কোনও প্রদত্ত সেটে একটি বৈশিষ্ট্য। সময়সীমা সমর্থন সহ যদি সেটটি তৈরি না করা হয় তবে আপনি একটি ত্রুটি পাবেন (উদাঃ
Kernel error received: Unknown error -1
)।
- সময় সেকেন্ডে দেওয়া হয়। উদাহরণস্বরূপ মিনিট থেকে কয়েক সেকেন্ড সময় পেতে বাশ পাটিগণিতের এক্সপ্রেশনগুলি ব্যবহার করুন। উদাহরণ:
sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))
প্রদত্ত আইপি সেটে কোনও এন্ট্রি বিদ্যমান কিনা তা পরীক্ষা করা হচ্ছে
আপনার স্ক্রিপ্টগুলির ভিতরে এটি প্রবেশদ্বার ইতিমধ্যে বিদ্যমান কিনা তা দেখতে দরকারী হতে পারে। এটি অর্জন করা যেতে পারে ipset test
যা এন্ট্রি উপস্থিত থাকলে শূন্য এবং অন্যথায় শূন্য না হলে ফিরে আসে। সুতরাং সাধারণ চেকগুলি কোনও স্ক্রিপ্টে প্রয়োগ করা যেতে পারে:
if ipset test dns4 8.8.8.8; then
echo "Google DNS is in the set"
fi
তবে, অনেক ক্ষেত্রে আপনি -exist
স্যুইচটি ব্যবহার করতে চান ipset
এটি বিদ্যমান এন্ট্রিগুলির বিষয়ে অভিযোগ না করার জন্য এটি নির্দেশ করতে।
iptables
বিধি থেকে আইপি সেট পপুলেটিং করছে
এটি আমার মতে, আইপি সেটগুলির অন্যতম হত্যাকারী বৈশিষ্ট্য। আপনি কেবল একটি আইপি সেটের এন্ট্রিগুলির সাথে মেলে না, আপনি বিদ্যমান আইপি সেটে নতুন এন্ট্রি যুক্ত করতে পারেন।
উদাহরণস্বরূপ এই প্রশ্নের উত্তরে আপনার কাছে রয়েছে:
-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT
... এসএসএইচ (টিসিপি পোর্ট 22) সাথে রেট-সীমা সংযোগের চেষ্টা করার উদ্দেশ্যে। ব্যবহৃত মডিউল recent
সাম্প্রতিক সংযোগ প্রচেষ্টা ট্র্যাক করে। state
মডিউলটির পরিবর্তে , আমি conntrack
মডিউলটিকে পছন্দ করি ।
# Say on your input chain of the filter table you have
-A INPUT -i eth+ -p tcp --dport ssh -j SSH
# Then inside the SSH chain you can
# 1. create an entry in the recent list on new connections
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
# 2. check whether 3 connection attempts were made within 2 minutes
# and if so add or update an entry in the ssh_dynblock4 IP set
-4 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock4 src --exist
-6 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock6 src --exist
# 3. last but not least reject the packets if the source IP is in our
# IP set
-4 -A SSH -m set --match-set ssh_dynblock4 src -j REJECT
-6 -A SSH -m set --match-set ssh_dynblock6 src -j REJECT
এই ক্ষেত্রে আমি প্রবাহটিকে SSH
শৃঙ্খলে এমনভাবে পুনঃনির্দেশ করছি যা -p tcp --dport ssh
প্রতিটি একক নিয়মের জন্য আমাকে নিজেকে পুনরাবৃত্তি করতে হবে না ।
পুনরাবৃত্তি করতে:
-m set
iptables
সচেতন করে তোলে যে আমরা set
মডিউলটি (যা আইপি সেটগুলি পরিচালনা করে) থেকে স্যুইচ ব্যবহার করছি
--match-set ssh_dynblock4 src
নামকরণ করা সেট ( ) এর
বিপরীতে উত্স ( ) ঠিকানার iptables
সাথে ম্যাচ করতে বলেsrc
ssh_dynblock4
- এটি এর সাথে মিলে যায়
sudo ipset test ssh_dynblock4 $IP
(যেখানে $IP
প্যাকেটের সোর্স আইপি ঠিকানা রয়েছে)
-j SET --add-set ssh_dynblock4 src --exist
আইপি সেটে প্যাকেট থেকে উত্স ( src
) ঠিকানা যুক্ত বা আপডেট করে ssh_dynblock4
। কোনও এন্ট্রি উপস্থিত থাকলে ( --exist
) এটি সহজভাবে আপডেট করা হবে।
- এটি এর সাথে মিলে যায়
sudo ipset -exist add ssh_dynblock4 $IP
(যেখানে $IP
প্যাকেটের সোর্স আইপি ঠিকানা রয়েছে)
আপনি যদি এর পরিবর্তে লক্ষ্য / গন্তব্য ঠিকানার সাথে মেলে চেয়েছিলেন, তাহলে আপনি ব্যবহার করতে চাই dst
পরিবর্তে src
। আরও বিকল্পের জন্য ম্যানুয়ালটির পরামর্শ নিন।
সেট সেট
আইপি সেটে অন্যান্য সেট থাকতে পারে। এখন আপনি যদি এখানে নিবন্ধটি অনুসরণ করেন তবে আপনি বিস্মিত হবেন যে সেটগুলি একত্রিত করা সম্ভব কিনা। এবং অবশ্যই এটি। উপরের আইপি সেটগুলির জন্য আমরা দুটি যৌথ সেট তৈরি করতে পারি ssh_dynblock
এবং ssh_loggedon
যথাক্রমে আইপিভি 4-কেবল এবং আইপিভি 6-কেবল সেটগুলি রাখতে:
create ssh_loggedon4 hash:ip family inet timeout 5400
create ssh_loggedon6 hash:ip family inet6 timeout 5400
create ssh_dynblock4 hash:ip family inet timeout 1800
create ssh_dynblock6 hash:ip family inet6 timeout 1800
# Sets of sets
create ssh_loggedon list:set
create ssh_dynblock list:set
# Populate the sets of sets
add ssh_loggedon ssh_loggedon4
add ssh_loggedon ssh_loggedon6
add ssh_dynblock ssh_dynblock4
add ssh_dynblock ssh_dynblock6
আর পরের প্রশ্নে যে আপনার মনের মধ্যে পপ আপ হবে কিনা তা এই আমাদের অনুমতি দেয় মেলে একটি IP সংস্করণ অ্যাগনোস্টিক ফ্যাশন এবং এবং আইপি সেট নিপূণভাবে।
এবং এর উত্তর একটি সুরদায়ক: হ্যাঁ! (হায় আফসোস, শেষ বার যখন আমি পরীক্ষা করেছি এটি স্পষ্টভাবে নথিভুক্ত করা হয়নি)
ফলস্বরূপ পূর্ববর্তী বিভাগের বিধিগুলি পুনরায় লেখা যেতে পারে:
-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT
যা অনেক বেশি সংক্ষিপ্ত। এবং হ্যাঁ, এটি চেষ্টা করা এবং পরীক্ষিত হয় এবং এটি একটি কবজির মতো কাজ করে।
এগুলিকে একসাথে রেখে দেওয়া: এসএসএইচ প্রাণবন্ত প্রতিরক্ষা
আমার সার্ভারগুলিতে আমার একটি স্ক্রিপ্ট চাকরিরূপে চালিত হয়েছে cron
যা একসাথে হোস্টের নাম নেয় এবং সেগুলিকে আইপি অ্যাড্রেসে সমাধান করে, তারপরে এটিকে "বিশ্বস্ত হোস্ট" এর আইপি সেটে খাওয়ানো হয়। ধারণাটি হ'ল বিশ্বস্ত হোস্টগুলি সার্ভারে লগ ইন করার জন্য আরও বেশি প্রচেষ্টা পায় এবং অন্য কারও হিসাবে অগত্যা অবরুদ্ধ করা হয় না।
বিপরীতভাবে আমি পুরো দেশগুলি আমার এসএসএইচ সার্ভারের সাথে সংযোগ স্থাপন থেকে বিরত রেখেছি, বিশ্বস্ত হোস্টের (সম্ভাব্য) ব্যতিক্রম ব্যতীত (বিধি সম্পর্কিত বিষয়গুলির ক্রম)।
তবে এটি পাঠকের অনুশীলন হিসাবে ছেড়ে গেছে। এখানে আমি একটি ঝরঝরে সমাধান যুক্ত করতে চাই ssh_loggedon
যা পরবর্তী সংযোগের প্রচেষ্টাগুলির মাধ্যমে অন্য প্যাকেটের মতো একই তদন্তের সাপেক্ষে না হয়ে সেটটিতে থাকা সেটগুলি ব্যবহার করবে ।
নিম্নলিখিত নিয়মগুলি দেখার ssh_loggedon
জন্য 90 মিনিটের জন্য 30 মিনিটের এবং 30 মিনিটের ডিফল্ট সময়সীমাটি মনে রাখা গুরুত্বপূর্ণ :ssh_dynblock
iptables
-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m set --match-set ssh_loggedon src -j ACCEPT
-A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT
এতক্ষণে আপনার নিজের জিজ্ঞাসা করা উচিত যে কীভাবে সংযুক্ত আইপি ঠিকানাটি ssh_loggedon
উপ-সেটে শেষ হয়। তাই পড়ুন ...
বোনাস: এসএসএইচ লগনের সময় আপনি যে আইপি দিয়ে লগ ইন করেছেন তা যুক্ত করুন
যদি আপনি sshrc
এবং বন্ধুদের সাথে পরীক্ষা করে থাকেন তবে আপনি এর ত্রুটিগুলি শিখতে পারবেন। তবে প্যাম উদ্ধার করতে আসে। নামের মডিউলটি pam_exec.so
আমাদের এসএসএইচ লগনের সময় এমন একটি স্থানে স্ক্রিপ্ট শুরু করার অনুমতি দেয় যেখানে আমরা জানি যে ব্যবহারকারীটি প্রবেশ করেছে।
ইন /etc/pam.d/sshd
নিচে pam_env
এবং pam_selinux
এন্ট্রি নিম্নলিখিত পংক্তিটি যোগ করুন:
session optional pam_exec.so stdout /path/to/your/script
এবং নিশ্চিত করুন যে আপনার স্ক্রিপ্টের ( /path/to/your/script
উপরে) সংস্করণটি বিদ্যমান এবং কার্যকর রয়েছে।
কী চলছে তা যোগাযোগের জন্য প্যাম পরিবেশের ভেরিয়েবল ব্যবহার করে, যাতে আপনি এটির মতো একটি সাধারণ স্ক্রিপ্ট ব্যবহার করতে পারেন:
#!/bin/bash
# When called via pam_exec.so ...
SETNAME=ssh_loggedon
if [[ "$PAM_TYPE" == "open_session" ]] && [[ -n "$PAM_RHOST" ]]; then
[[ "x$PAM_RHOST" != "x${PAM_RHOST//:/}" ]] && SETNAME="${SETNAME}6" || SETNAME="${SETNAME}4"
ipset -exist add $SETNAME "$PAM_RHOST"
fi
দুর্ভাগ্যক্রমে ipset
ইউটিলিটিটি নেটফিল্টারের অন্তর্নির্মিত স্মার্টগুলি বলে মনে হচ্ছে না। সুতরাং আমাদের এন্ট্রি যুক্ত করার সময় আমাদের আইপিভি 4 এবং আইপিভি 6 আইপি সেটগুলির মধ্যে পার্থক্য করতে হবে। অন্যথায় ipset
ধরে নেবে আমরা আইপির পরিবর্তে সেটগুলির সেটটিতে আরও একটি সেট যুক্ত করতে চাই । এবং অবশ্যই এটি কোনও আইপি এর নামে একটি সেট থাকবে :) এর সম্ভাবনা কম :)
সুতরাং আমরা :
আইপি ঠিকানার জন্য যাচাই করি এবং 6
এ জাতীয় ক্ষেত্রে এবং 4
অন্যথায় সেট নামের সাথে যুক্ত করি ।
শেষ।