A command-line tool to check if domains are filtered (blocked) in Iran by analyzing DNS responses.
This tool checks if a domain is blocked by Iranian ISPs by:
- Resolving the domain's A record using DNS
- Comparing the resolved IP addresses against known blocking IPs used by Iranian ISPs
- Reporting whether the domain is blocked or accessible
Note: This tool can only detect DNS-based blocking and does not have the power to detect other types of filtering or network disorders.
- π Fast async DNS resolution - Check multiple domains concurrently
- π Multiple input methods - Single domain, comma-separated list, or file
- π¨ Beautiful CLI output - Rich formatted tables with live updates
- π§ Configurable - Custom DNS servers and timeout settings
- Python 3.10+
pip install check-filtergit clone https://github.com/hatamiarash7/CheckFiltering.git cd CheckFiltering poetry installYou can also download the wheel package from the release page.
check-filter domain github.comcheck-filter domains github.com,google.com,twitter.comCreate a file with domain names (one per line). Lines starting with # are treated as comments:
# Social media github.com twitter.com facebook.com # Development gitlab.com stackoverflow.com Then run:
check-filter file domains.txtcheck-filter --version # or check-filter -vcheck-filter --help check-filter domain --help check-filter domains --help check-filter file --helpimport asyncio from check_filter import DomainChecker, FilterStatus async def main(): checker = DomainChecker() # Check a single domain result = await checker.acheck("google.com") print(f"{result.domain}: {result.status.value}") print(f"Blocked: {result.is_blocked}") print(f"IPs: {result.ips}") # Check multiple domains concurrently results = await checker.acheck_many([ "google.com", "twitter.com", "github.com", ]) for result in results: status = "π« Blocked" if result.is_blocked else "β
Free" print(f"{result.domain}: {status}") asyncio.run(main())from check_filter import DomainChecker # Use custom blocked IPs and DNS servers checker = DomainChecker( blocked_ips={"10.10.34.34", "10.10.34.35"}, nameservers=["8.8.8.8", "8.8.4.4"], timeout=10.0, )from check_filter import CheckResult, FilterStatus # CheckResult is a dataclass with useful properties result = await checker.acheck("example.com") # Access properties print(result.domain) # "example.com" print(result.status) # FilterStatus.FREE print(result.is_free) # True print(result.is_blocked) # False print(result.ips) # frozenset({'93.184.216.34'}) print(result.error) # None (or error message if failed) # Backward compatible tuple unpacking domain, is_free = result# Clone the repository git clone https://github.com/hatamiarash7/CheckFiltering.git cd CheckFiltering # Install dependencies with dev tools make install-devmake help # Show all available commands make test # Run tests make test-cov # Run tests with coverage report make lint # Run all linters make lint-fix # Run linters with auto-fix make format # Format code with black and isort make type-check # Run type checking with mypy make check # Run all checks (format, lint, type-check, test) make build # Build package make clean # Clean build artifacts# Run all tests make test # Run tests with coverage make test-cov # Run fast tests (exclude slow/integration tests) make test-fastMain class for checking domain filtering status.
DomainChecker( blocked_ips: Set[str] | None = None, # Custom blocked IPs nameservers: list[str] | None = None, # DNS servers to use timeout: float = 5.0, # DNS query timeout )Methods:
acheck(domain: str) -> CheckResult- Check a single domainacheck_many(domains: list[str]) -> list[CheckResult]- Check multiple domains
Dataclass containing the result of a domain check.
Attributes:
domain: str- The checked domainstatus: FilterStatus- The filtering statusips: frozenset[str]- Resolved IP addresseserror: str | None- Error message if check failed
Properties:
is_blocked: bool- True if domain is blockedis_free: bool- True if domain is not blocked
Enum with possible filtering statuses:
FREE- Domain is accessibleBLOCKED- Domain is blockedERROR- Check failed (timeout, etc.)UNKNOWN- Domain doesn't exist (NXDOMAIN)
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch:
git checkout -b feature/my-new-feature - Install development dependencies:
make install-dev - Make your changes and add tests
- Run checks:
make check - Commit your changes:
git commit -am 'Add some feature' - Push to the branch:
git push origin feature/my-new-feature - Submit a pull request
Found a bug or have a suggestion? Please open an issue.
This project is licensed under the MIT License - see the LICENSE file for details.


