
NFtables या IPtables पर सीधे Q-Feeds लागू करने की स्क्रिप्ट
Linux सर्वरों के लिए स्वचालित मैलवेयर IP ब्लॉकलिस्ट — nftables और iptables+ipset का समर्थन
tip.qfeeds.com पर एक निःशुल्क API कुंजी प्राप्त करें।
git clone https://github.com/Q-Feeds/NFtables-IPtables-integration-script.git cd NFtables-IPtables-integration-script chmod +x qfeeds-installer.sh qfeeds-uninstaller.sh
### चरण 3: इंस्टॉलर को root के रूप में चलाएँ```bash
sudo ./qfeeds-installer.sh
इंस्टॉलर निम्नलिखित कार्य करेगा:
आपका सर्वर अब सुरक्षित है। क्रॉन जॉब हर 20 मिनट (कॉन्फ़िगरेबल) में अपडेट की जाँच करता है, और वास्तविक API कॉल केवल तब होती हैं जब आपका लाइसेंस अनुमति देता है।
यह समाधान समय-समय पर Q-Feeds से नवीनतम खतरा खुफिया फ़ीड डाउनलोड करता है और इसे फ़ायरवॉल नियमों के रूप में लागू करता है, जिससे आप यह कर सकते हैं:
इंस्टॉलर स्वचालित रूप से पता लगाता है कि कौन सा फ़ायरवॉल बैकएंड उपलब्ध है:
| प्राथमिकता | पता लगाना | बैकएंड |
|---|
पता लगाया गया बैकएंड कॉन्फ़िगरेशन फ़ाइल में संग्रहीत किया जाता है। अपडेटर और अनइंस्टॉलर स्क्रिप्ट सही फ़ायरवॉल कमांड चलाने के लिए इसका उपयोग करते हैं।
दोनों बैकएंड अधिकतम प्रदर्शन के लिए समान स्प्लिट-सेट रणनीति का उपयोग करते हैं:
nftables बैकएंड:``` ┌─────────────────────────────────────────────────────────┐ │ table ip qfeeds │ │ │ │ ┌─────────────────────────┐ ┌───────────────────────┐ │ │ │ qfeeds_blacklist_v4 │ │ qfeeds_blacklist_v4 │ │ │ │ (hash set) │ │ _nets (interval set) │ │ │ │ │ │ │ │ │ │ Individual IPs │ │ CIDR ranges │ │ │ │ ~99% of entries │ │ ~1% of entries │ │ │ │ O(1) lookup & insert │ │ O(log n) lookup │ │ │ └─────────────────────────┘ └───────────────────────┘ │ │ │ │ ┌─────────────────────────┐ │ │ │ qfeeds_whitelist_v4 │ │ │ │ (interval set) │ │ │ │ Your allowed IPs/CIDRs │ │ │ └─────────────────────────┘ │ │ │ │ chain input-chain (hook input, priority 0, accept) │ │ → ip saddr @qfeeds_whitelist_v4 accept │ │ → ip saddr @qfeeds_blacklist_v4 drop │ │ → ip saddr @qfeeds_blacklist_v4_nets drop │ │ │ │ chain output-chain (if enabled) │ │ → ip daddr @qfeeds_whitelist_v4 accept │ │ → ip daddr @qfeeds_blacklist_v4 drop │ │ → ip daddr @qfeeds_blacklist_v4_nets drop │ └─────────────────────────────────────────────────────────┘
**iptables+ipset बैकएंड:**```
┌──────────────────────────────────────────────────────────┐
│ ipset sets │
│ │
│ ┌─────────────────────────┐ ┌────────────────────────┐ │
│ │ qfeeds_blacklist_v4 │ │ qfeeds_blacklist_v4 │ │
│ │ (hash:ip) │ │ _nets (hash:net) │ │
│ │ maxelem 1000000 │ │ maxelem 65536 │ │
│ │ │ │ │ │
│ │ Individual IPs │ │ CIDR ranges │ │
│ └─────────────────────────┘ └────────────────────────┘ │
│ │
│ ┌─────────────────────────┐ │
│ │ qfeeds_whitelist_v4 │ │
│ │ (hash:net) │ │
│ └─────────────────────────┘ │
│ │
│ iptables: INPUT/OUTPUT jump to a dedicated chain │
│ (jump rule tagged -m comment "qfeeds"): │
│ │
│ chain QFEEDS_INPUT (rebuilt each run, in order): │
│ -m set --match-set whitelist_v4 src -j ACCEPT │
│ -m set --match-set blacklist_v4 src -j DROP │
│ -m set --match-set blacklist_v4_nets src -j DROP │
│ (QFEEDS_OUTPUT mirrors this with dst, if enabled) │
└──────────────────────────────────────────────────────────┘
IPv6 के लिए भी यही संरचना मौजूद है (ip6 qfeeds तालिका या ip6tables + family inet6 ipsets)।
दो सेट प्रकार क्यों?
┌──────────────────────────────────────────────────────┐ │ 1. Check license schedule (licenses.php API) │ │ → Skip run if not yet time for next update │ │ 2. Determine sync mode (full or diff) │ │ 3. Fetch IPv4 feed (ipv6=0) and IPv6 feed │ │ (ipv6=only) separately │ │ 4. Separate IPs from CIDRs in awk │ │ 5. Batch-load into hash set (IPs) and net/interval │ │ set (CIDRs) │ │ 6. Update whitelist sets from config │ │ 7. Persist rules │ └──────────────────────────────────────────────────────┘
### पूर्ण सिंक बनाम डिफ सिंक
| मोड | कब | यह क्या करता है |
|------|------|-------------|
| **पूर्ण सिंक** | पहली बार चलाने पर, बलपूर्वक अपडेट करने पर, डिफ विफलता के बाद, जब स्थानीय सेट अपनी आधार रेखा खो चुका हो (खाली या अपेक्षा से बहुत छोटा), या जब अंतिम सिंक `FULL_SYNC_MAX_AGE` (डिफ़ॉल्ट 24 घंटे) से पुराना हो | पहले प्रत्येक फ़ीड को प्राप्त करता है और मान्य करता है, फिर ब्लैकलिस्ट सेट को फ्लश और रीलोड करता है। सेट केवल तभी फ्लश किया जाता है जब वैध डेटा हाथ में हो, इसलिए असफल फ़ेच आपको कभी असुरक्षित नहीं छोड़ता |
| **डिफ सिंक** | बाद के रन (केवल `malware_ip` फ़ीड) एक स्वस्थ स्थानीय सेट के साथ | अंतिम पुल के बाद से केवल जोड़ (`+`) और हटाव (`-`) प्राप्त करता है |
डिफ सिंक **प्रति API कुंजी** है — API आपके अंतिम सफल पुल को ट्रैक करता है और तब से केवल परिवर्तन लौटाता है। यदि डिफ विफल होता है, तो स्क्रिप्ट स्वचालित रूप से पूर्ण सिंक पर वापस आ जाती है।
> **स्व-उपचार:** डिफ अपडेट केवल मौजूदा सेट को पैच करते हैं। यदि वह सेट कभी खो जाता है या काट दिया जाता है — उदाहरण के लिए रिबूट जहाँ फ़ायरवॉल नियम बनाए नहीं रखे गए, मैन्युअल फ्लश, या पिछला आंशिक सिंक — तो अपडेटर लापता आधार रेखा (लाइव एलिमेंट काउंट 0 है या अंतिम रिकॉर्ड किए गए काउंट से बहुत कम है) का पता लगाता है और खाली सेट पर डिफ करने के बजाय एक पूर्ण पुनर्निर्माण को बाध्य करता है। एक अतिरिक्त सुरक्षा जाल के रूप में, यह समय-समय पर पूर्ण सिंक (डिफ़ॉल्ट रूप से हर 24 घंटे, `FULL_SYNC_MAX_AGE` के माध्यम से) भी बाध्य करता है।
### लाइसेंस-आधारित शेड्यूलिंग
अपडेटर प्रत्येक रन से पहले Q-Feeds लाइसेंस API (`licenses.php`) की जाँच करता है। यदि आपके लाइसेंस का `next_update` टाइमस्टैम्प अभी तक नहीं पहुँचा है, तो स्क्रिप्ट अनावश्यक API कॉल किए बिना जल्दी बाहर निकल जाती है। क्रॉन जॉब बार-बार चलता है (डिफ़ॉल्ट: हर 20 मिनट), लेकिन वास्तविक अपडेट केवल तब होते हैं जब आपका लाइसेंस अनुमति देता है।
---
## ✅ पूर्वापेक्षाएँ
इंस्टॉल करने से पहले, सुनिश्चित करें कि आपके पास है:
- [x] **Linux सर्वर** जिसमें **nftables** या **iptables** हो (Debian, Ubuntu, CentOS, Fedora, Arch, Alpine)
- [x] **रूट एक्सेस** — इंस्टॉलर और अपडेटर को रूट के रूप में चलना चाहिए
- [x] **Q-Feeds API टोकन** — [tip.qfeeds.com](https://tip.qfeeds.com/) पर मुफ्त प्राप्त करें
- [x] **इंटरनेट एक्सेस** — सर्वर को `api.qfeeds.com` तक पहुँचने में सक्षम होना चाहिए
इंस्टॉलर आवश्यक निर्भरताओं को स्वचालित रूप से इंस्टॉल करेगा:
- **nftables बैकएंड**: `nftables`, `curl`, `jq`, `util-linux`
- **iptables बैकएंड**: `iptables`, `ipset`, `curl`, `jq`, `util-linux`
---
## 📝 विस्तृत इंस्टॉलेशन गाइड
### 1. अपना API टोकन प्राप्त करें
अपना मुफ्त Q-Feeds API टोकन प्राप्त करने के लिए [tip.qfeeds.com](https://tip.qfeeds.com/) पर जाएँ।
### 2. डाउनलोड करें और चलाएँ```bash
git clone https://github.com/Q-Feeds/NFtables-IPtables-integration-script.git
cd NFtables-IPtables-integration-script
chmod +x qfeeds-installer.sh qfeeds-uninstaller.sh
sudo ./qfeeds-installer.sh
इंस्टॉलर निम्नलिखित प्रश्न पूछेगा:
Enter your Q-Feeds API Token:
आपका टोकन [tip.qfeeds.com](https://tip.qfeeds.com/) से। यदि खाली है तो इंस्टॉलर जारी रखने से मना कर देता है।
#### फ़ीड प्रकार```
Enter feed type [default: malware_ip]:
डिफ़ॉल्ट malware_ip है। इसे केवल तभी बदलें जब Q-Feeds ने आपको एक अलग फ़ीड प्रकार प्रदान किया हो।
Enter the limit of IPs to fetch (leave empty for no limit):
सीमा न होने के लिए Enter दबाएँ (अनुशंसित)। फ़ीड का आकार सीमित करने के लिए एक संख्या दर्ज करें।
#### दिशात्मक अवरोधन```
Block INCOMING connections from malicious IPs? [Y/n]:
Block OUTGOING connections to malicious IPs? [y/N]:
Configure a whitelist of IPs/CIDRs that must NEVER be blocked? [y/N]: Enter IPv4 whitelist (comma-separated, e.g. 1.2.3.4,5.6.7.8): Enter IPv6 whitelist (comma-separated, e.g. 2001:db8::1):
अपने प्रबंधन IP(s) को यहां जोड़ें ताकि यह सुनिश्चित हो सके कि आप कभी लॉक आउट न हों, भले ही वे फ़ीड में दिखाई दें। व्हाइटलिस्ट नियमों की जाँच हमेशा **ब्लैकलिस्ट** नियमों से **पहले** की जाती है।
#### Cron Schedule```
Enter cron schedule (e.g., '*/20 * * * *') [default: */20 * * * *]:
How often the updater checks for new data. Default is every 20 minutes. The license-based scheduling ensures the API is only called when your license allows an update.
Re-running the installer with a customized crontab: If a Q-Feeds cron entry already exists, the installer asks before touching it:
An existing Q-Feeds cron entry was found in the current crontab. Replace it with a fresh default entry? Choosing 'no' keeps your crontab unchanged [y/N]:Answer
no(the default) to keep your existing crontab. A clean first install has no existing entry and skips this prompt. For unattended installs, setQFEEDS_SKIP_CRON=1to leave the crontab untouched without prompting.
सभी सेटिंग्स /etc/qfeeds/qfeeds_config.conf में संग्रहीत हैं। आप इंस्टॉलर को फिर से चलाए बिना इस फ़ाइल को सीधे संपादित कर सकते हैं। परिवर्तन अगले क्रॉन रन पर प्रभावी होते हैं।
nft list table ip qfeeds
nft list set ip qfeeds qfeeds_blacklist_v4 | grep -oP '\d+.\d+.\d+.\d+' | wc -l
nft list set ip qfeeds qfeeds_blacklist_v4_nets | head -20
nft list set ip6 qfeeds qfeeds_blacklist_v6 | wc -l
### iptables+ipset backend```bash
# List all Q-Feeds ipsets and their sizes
ipset list -t | grep -A4 qfeeds
# Count loaded IPv4 IPs
ipset list qfeeds_blacklist_v4 | tail -n +9 | wc -l
# Show loaded CIDR ranges
ipset list qfeeds_blacklist_v4_nets | tail -n +9 | head -20
# Show the qfeeds jump rule in INPUT, then the dedicated chain's block rules
iptables -L INPUT -n --line-numbers | grep qfeeds
iptables -L QFEEDS_INPUT -n
ip6tables -L QFEEDS_INPUT -n
tail -20 /var/log/qfeeds_blocklist.log
grep -i "error" /var/log/qfeeds_blocklist.log
sudo /usr/local/bin/update_qfeeds_blocklist.sh
sudo QFEEDS_FORCE_UPDATE=1 /usr/local/bin/update_qfeeds_blocklist.sh
sudo crontab -l | grep qfeeds
---
## 🔍 समस्या निवारण
### सामान्य
**इंस्टॉलेशन विफल होता है "Unable to locate package" के साथ**
- इंस्टॉलर आपके डिस्ट्रो (Debian/Ubuntu, CentOS/RHEL, Fedora, Arch, Alpine) का स्वतः पता लगाता है। यदि पहचान विफल होती है, तो निर्भरताओं को मैन्युअल रूप से स्थापित करें: `curl`, `jq`, `util-linux` (`flock` के लिए), साथ ही `nftables` या `iptables`+`ipset`।
**इंस्टॉलेशन के बाद सेट खाली हैं**
- लॉग जांचें: `tail -50 /var/log/qfeeds_blocklist.log`
- अपना API टोकन सही होने की पुष्टि करें
- एक बलपूर्वक अपडेट का प्रयास करें: `sudo QFEEDS_FORCE_UPDATE=1 /usr/local/bin/update_qfeeds_blocklist.sh`
**"अभी समय नहीं हुआ। अगला अपडेट निर्धारित है..."**
- अपडेटर आपके लाइसेंस शेड्यूल का सम्मान करता है। इस संदेश का अर्थ है कि क्रोन चला, लेकिन आपका लाइसेंस अभी अपडेट की अनुमति नहीं देता। यह सामान्य है — अगला क्रोन रन फिर से जांच करेगा।
- लिनक्स इंस्टॉलर स्थानीय कैश्ड `licenses.php` इंडेक्स रखता है और कैश्ड `next_update` को अपने शेड्यूल गेट के रूप में उपयोग करता है। सफल पुल के बाद यह अगले चक्र के लिए उस स्थानीय इंडेक्स को ताज़ा करता है।
**रीबूट के बाद नियम स्थायी नहीं रहते**
- यदि `netfilter-persistent` स्थापित है, तो नियम स्वचालित रूप से सहेजे जाते हैं
- **nftables**: यदि `netfilter-persistent` अनुपस्थित है, तो अपडेटर अब पूर्ण रूलसेट को `/etc/nftables.conf` में स्वचालित रूप से लिखता है और `nftables` सेवा को सक्षम करता है; आप अभी भी `nft list ruleset > /etc/nftables.conf` से मैन्युअल रूप से सहेज सकते हैं
- **iptables**: अपडेटर `ipset save > /etc/ipset.conf` और `iptables-save` से सहेजता है; आप मैन्युअल रूप से भी सहेज सकते हैं
- यदि स्थायित्व पूरी तरह विफल भी हो, तो अपडेटर स्व-सुधार करता है: अगले रन पर यह रीबूट के बाद खाली सेट का पता लगाता है और पूर्ण सिंक के साथ इसे पुनर्निर्माण करता है
### nftables-विशिष्ट
**"Batch nft -f विफल। प्रति-कमांड निष्पादन पर वापस जा रहा है..."**
- यह सामान्य है, विशेषकर LXC कंटेनरों पर जहां कर्नेल का नेटलिंक बफर (`wmem_max`) प्रतिबंधित है। प्रति-कमांड फ़ॉलबैक सही ढंग से काम करता है और तेज़ है (~400k+ आईपी के लिए 10 सेकंड)।
**सिंटैक्स त्रुटि: "unexpected string"**
- सुनिश्चित करें कि आप nftables का एक हालिया संस्करण चला रहे हैं। स्क्रिप्ट `ip saddr`/`ip daddr` सिंटैक्स का उपयोग करती है जिसके लिए nftables 0.9+ आवश्यक है।
**"Error: Could not process rule: Message too long"**
- यह नेटलिंक बफर सीमा है, आमतौर पर LXC कंटेनरों में। स्क्रिप्ट स्वचालित रूप से प्रति-कमांड निष्पादन पर वापस आ जाती है। यदि आप लॉग में एक सफल लोड के साथ यह देखते हैं, तो यह इच्छित रूप से काम कर रहा है।
### iptables+ipset-विशिष्ट
**"ipset restore failed"**
- जांचें कि `ipset` स्थापित है: `command -v ipset`
- विशिष्ट त्रुटियों के लिए लॉग जांचें: `grep -i "error" /var/log/qfeeds_blocklist.log`
- सुनिश्चित करें कि ipset मॉड्यूल लोड है: `lsmod | grep ip_set`
**iptables नियम दिखाई नहीं दे रहे**
- ब्लॉकिंग नियम समर्पित `QFEEDS_INPUT` / `QFEEDS_OUTPUT` चेन में रहते हैं; `INPUT`/`OUTPUT` केवल `qfeeds` टिप्पणी के साथ टैग किए गए एक `-j QFEEDS_INPUT` जंप को रखते हैं
- इससे सत्यापित करें: `iptables -L INPUT -n | grep qfeeds` (जंप) और `iptables -L QFEEDS_INPUT -n` (ब्लॉक नियम)
- जंप नियम पहचान के लिए `-m comment --comment "qfeeds"` का उपयोग करता है
- सुनिश्चित करें कि `xt_set` मॉड्यूल लोड है: `modprobe xt_set`
**"ipset create ... विफल"**
- बहुत पुराने कर्नेल पर, `hash:ip` या `hash:net` प्रकार उपलब्ध नहीं हो सकते हैं। अपने कर्नेल को अपग्रेड करें या एक नए रिपॉजिटरी से `ipset` स्थापित करें।
## 🗑️ अनइंस्टॉल करना```bash
sudo ./qfeeds-uninstaller.sh
The uninstaller removes everything based on the detected backend:
nftables backend:
ip qfeeds और ip6 qfeeds तालिकाओं को हटाता है (सभी श्रृंखलाओं, नियमों और सेटों सहित)iptables backend:
qfeeds टिप्पणी से टैग किए गए सभी iptables/ip6tables नियमों को हटाता है (जंप नियमों सहित)QFEEDS_INPUT / QFEEDS_OUTPUT श्रृंखलाओं को फ्लश और हटाता हैqfeeds_blacklist_v4, qfeeds_blacklist_v4_nets, qfeeds_whitelist_v4, और IPv6 समकक्ष)Both backends:
/etc/qfeeds/)/usr/local/bin/update_qfeeds_blocklist.sh)यदि कॉन्फ़िग फ़ाइल गायब है, तो अनइंस्टॉलर दोनों बैकएंड के लिए सफाई का प्रयास करता है।
नोट: अनइंस्टॉलर निर्भरता के रूप में स्थापित सिस्टम पैकेज (curl, jq, ipset, आदि) को नहीं हटाता है।
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Use at your own risk.
Please test these scripts in your environment before deploying them in production. The author is not responsible for any issues or damages that may occur from their use.
AI सहायता: इस प्रोजेक्ट के कुछ भाग (कोड, सुधार और दस्तावेज़ीकरण) AI टूल्स की सहायता से लिखे गए थे और बाद में अनुरक्षकों द्वारा समीक्षा की गई। जबकि हम परिवर्तनों का परीक्षण और समीक्षा करते हैं, कृपया स्क्रिप्ट्स को चलाने से पहले स्वयं जांच लें और कुछ भी गलत लगे तो रिपोर्ट करें।
| 1st | nft कमांड मिला | nftables |
| 2nd | iptables कमांड मिला | iptables+ipset |
| — | कोई नहीं मिला | त्रुटि (बाहर निकलें) |
| Variable | Description | Default |
|---|
BACKEND | फ़ायरवॉल बैकएंड (nftables or iptables) | (स्वतः पता लगाया गया) |
API_TOKEN | आपका Q-Feeds API टोकन | (आवश्यक) |
FEED_TYPE | प्राप्त करने के लिए फ़ीड प्रकार | malware_ip |
LIMIT | प्राप्त करने के लिए अधिकतम IP (खाली = कोई सीमा नहीं) | (खाली) |
BLOCK_INCOMING | ब्लैकलिस्टेड IP से आने वाले को ब्लॉक करें | yes |
BLOCK_OUTGOING | ब्लैकलिस्टेड IP को जाने वाले को ब्लॉक करें | no |
WHITELIST_V4 | अल्पविराम से अलग किया गया IPv4 व्हाइटलिस्ट | (खाली) |
WHITELIST_V6 | अल्पविराम से अलग किया गया IPv6 व्हाइटलिस्ट | (खाली) |
LOG_FILE | लॉग फ़ाइल का पथ | /var/log/qfeeds_blocklist.log |
FULL_SYNC_MAX_AGE | पूर्ण पुनः-सिंक को बाध्य करने से पहले सेकंड में अधिकतम आयु (गहराई में रक्षा) | 86400 (24 घंटे) |
| Path | Purpose |
|---|
/etc/qfeeds/qfeeds_config.conf | कॉन्फ़िगरेशन फ़ाइल |
/etc/qfeeds/.last_sync | पूर्ण/अंतर सिंक ट्रैकिंग के लिए स्थिति फ़ाइल |
/etc/qfeeds/.last_count | अंतिम सफल तत्व गणना, खोए हुए आधार रेखा का पता लगाने के लिए उपयोग किया जाता है |
/usr/local/bin/update_qfeeds_blocklist.sh | अद्यतन स्क्रिप्ट (क्रॉन के माध्यम से चलती है) |
/var/log/qfeeds_blocklist.log | लॉग फ़ाइल |