প্রথম, আমি জানি এটি একটি পুরানো প্রশ্ন তবে ...
আমি কয়েক দশক ধরে আমার নিজস্ব প্রামাণিক, নন রিকার্সিভ, ডিএনএস সার্ভার চালিয়ে যাচ্ছি, তবে কোনও ডিএনএস ভিত্তিক ডিডিওএস আক্রমণে কখনও শিকার হয়ে উঠি নি - এখনও অবধি, যখন আমি একটি নতুন আইএসপিতে চলে এসেছি। হাজার হাজার বানোয়াট ডিএনএস অনুসন্ধানগুলি আমার লগগুলিকে প্লাবিত করেছিল এবং আমি সত্যিই বিরক্ত হয়ে পড়েছিলাম - আমার সার্ভারে প্রভাব সম্পর্কে এতটা নয়, বরং এটি আমার লগগুলিকে বিশৃঙ্খল করে এবং অপব্যবহারের অস্বস্তি বোধ করে। দেখে মনে হচ্ছে আক্রমণকারী আমার ডিএনএসকে "অনুমোদিত নাম সার্ভার আক্রমণ " ব্যবহার করার চেষ্টা করছে ।
সুতরাং আমি বুঝতে পেরেছি, যদিও আমি আমার অভ্যন্তরীণ নেটওয়ার্কে পুনরাবৃত্ত অনুসন্ধানগুলি সীমাবদ্ধ করি (অন্য সব অস্বীকার করে), আমি বরং স্পুফড আইপি ঠিকানাগুলিতে নেতিবাচক প্রতিক্রিয়াগুলি ফেরত দেওয়ার চেয়ে আমার সিপিইউ চক্রগুলিকে আইপ্যাবেলে ম্যাচিংয়ে ব্যয় করি (আমার লগগুলিতে কম বিশৃঙ্খলা কম) নেটওয়ার্ক ট্র্যাফিক এবং আমার নিজস্ব একটি উচ্চতর সন্তুষ্টি স্তর)।
অন্য সবার মতো করা হিসাবে আমি শুরু করেছিলাম , কোন ডোমেনের নাম অনুসন্ধান করা আছে তা খুঁজে বার করে সেই ডোমেনে একটি টার্গেট ডিআআরপি দিয়ে একটি স্ট্রিং ম্যাচ তৈরি করেছি। তবে আমি শীঘ্রই বুঝতে পেরেছিলাম যে আমি বিপুল পরিমাণে বিধি-বিধান নিয়ে শেষ করব, যার মধ্যে প্রতিটি সিপিইউ চক্র গ্রহণ করছে। তো এখন কি করা? যেহেতু আমি একটি পুনরাবৃত্ত নামের সার্ভারটি চালাচ্ছি না আমি বুঝতে পেরেছিলাম যে আমি যে বাস্তব অঞ্চলে অনুমোদিত তা আমি মেলিং করতে পারি এবং আমি সমস্ত কিছু বাদ দিই।
আইপেটেবলগুলিতে আমার ডিফল্ট নীতি হ'ল এসিসিপিটি, যদি আপনার নীতিটি ড্রপ হয় তবে আপনাকে নিম্নলিখিত সমাধানটি ব্যবহার করতে চাইলে আপনার সম্ভবত কিছু সামঞ্জস্য করা দরকার।
আমি আমার জোন কনফিগারেশন একটি পৃথক ফাইলে রাখি (/etc/bind/name.conf.local), আসুন এটি উদাহরণ হিসাবে ব্যবহার করুন:
zone "1.168.192.in-addr.arpa" { // Private
type master;
allow-query { 192.168.1.0/24; 127.0.0.1; };
allow-transfer { 127.0.0.1; };
file "/etc/bind/db.192.168.1";
};
zone "home.example.net" { // Private
type master;
allow-query { 192.168.1.0/24; 127.0.0.1; };
allow-transfer { 127.0.0.1; };
file "/etc/bind/pri/db.home.example.net";
};
zone "example.net" {
type master;
file "/etc/bind/pri/db.example.net";
allow-transfer { 127.0.0.1; 8.8.8.8; };
};
zone "example.com" {
type slave;
masters { 8.8.8.8; };
file "sec.example.com";
allow-transfer { 127.0.0.1; };
notify no;
};
zone "subdomain.of.example.nu" {
type slave;
masters { 8.8.8.8; };
file "sec.subdomain.of.example.nu";
allow-transfer { 127.0.0.1; };
notify no;
};
আমার প্রথম দুটি জোনে "// ব্যক্তিগত" মন্তব্যটি নোট করুন, আমি এটিকে বৈধ অঞ্চলগুলির তালিকা থেকে বাদ দেওয়ার জন্য নিম্নলিখিত স্ক্রিপ্টে এটি ব্যবহার করি।
#!/usr/bin/perl
# zone2iptables - Richard Lithvall, april 2014
#
# Since we want to match not only example.net, but also (for example)
# www.example.net we need to set a reasonable maximum value for a domain
# name in our zones - 100 character should be more that enough for most people
# and 255 is the absolute maximum allowed in rfc1034.
# Set it to 0 (zero) if you would like the script to fetch each zone (axfr)
# to get the actual max value.
$maxLengthOfQueryName=255;
$externalInterface="eth1";
print "# first time you run this, you will get error on the 3 first commands.\n";
print "# It's here to make it safe/possible to periodically run this script.\n";
print "/sbin/iptables -D INPUT -i $externalInterface -p udp --dport 53 -j DNSvalidate\n";
print "/sbin/iptables -F DNSvalidate\n";
print "/sbin/iptables -X DNSvalidate\n";
print "#\n";
print "# now, create the chain (again)\n";
print "/sbin/iptables -N DNSvalidate\n";
print "# and populate it with your zones\n";
while(<>){
if(/^zone\s+"(.+)"\s+\{$/){
$zone=$1;
if($maxLengthOfQueryName){
$max=$maxLengthOfQueryName;
} else {
open(DIG,"dig -t axfr +nocmd +nostats $zone |");
$max=0;
while(<DIG>){
if(/^(.+?)\.\s/){
$max=(length($1)>$max)?length($1):$max;
}
}
close(DIG);
}
printf("iptables -A DNSvalidate -m string --from 40 --to %d --hex-string \"",($max+42));
foreach $subdomain (split('\.',$zone)){
printf("|%02X|%s",length($subdomain),$subdomain);
}
print("|00|\" --algo bm -j RETURN -m comment --comment \"$zone\"\n");
}
}
print "# and end the new chain with a drop\n";
print "/sbin/iptables -A DNSvalidate -j DROP\n";
print "# And, at last, make the new chain active (on UDP/53)\n";
print "/sbin/iptables -A INPUT -i $externalInterface -p udp --dport 53 -j DNSvalidate\n";
যুক্তি হিসাবে জোন কনফিগারেশন ফাইলের সাথে উপরের স্ক্রিপ্টটি চালান।
root:~/tmp/# ./zone2iptables.pl /etc/bind/named.conf.local
# first time you run this, you will get error on the 3 first commands.
# It's here to make it safe/possible to periodically run this script.
/sbin/iptables -D INPUT -i eth1 -p udp --dport 53 -j DNSvalidate
/sbin/iptables -F DNSvalidate
/sbin/iptables -X DNSvalidate
#
# now, create the chain (again)
/sbin/iptables -N DNSvalidate
# and populate it with your zones
iptables -A DNSvalidate -m string --from 40 --to 297 --hex-string "|07|example|03|net|00|" --algo bm -j RETURN -m comment --comment "example.net"
iptables -A DNSvalidate -m string --from 40 --to 297 --hex-string "|07|example|03|com|00|" --algo bm -j RETURN -m comment --comment "example.com"
iptables -A DNSvalidate -m string --from 40 --to 297 --hex-string "|09|subdomain|02|of|07|example|02|nu|00|" --algo bm -j RETURN -m comment --comment "subdomain.of.example.nu"
# and end the new chain with a drop
/sbin/iptables -A DNSvalidate -j DROP
# And, at last, make the new chain active (on UDP/53)
/sbin/iptables -A INPUT -i eth1 -p udp --dport 53 -j DNSvalidate
কোনও স্ক্রিপ্টে আউটপুট সংরক্ষণ করুন, এটিকে শেলের সাথে পাইপ করুন বা নতুন চেইন তৈরি করতে আপনার টার্মিনালে অনুলিপি করুন এবং পেস্ট করুন এবং সমস্ত অবৈধ ডিএনএস কোয়েরি ফিল্টার আউট করুন।
চালানোর পক্ষ থেকে / sbin / iptables- র -L DNSvalidate -nvx
নতুন শৃঙ্খল প্রতিটি নিয়ম উপর প্যাকেট (এবং বাইট) কাউন্টারে দেখতে (আপনি আরো কার্যকর করা তালিকার শীর্ষে সবচেয়ে প্যাকেট জোন স্থানান্তর করতে চান পারে)।
আশা করি যে কেউ এটি দরকারী খুঁজে পেতে পারেন :)