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-filter
git clone https://github.com/hatamiarash7/CheckFiltering.git
cd CheckFiltering
poetry install
You can also download the wheel package from the release page.
check-filter domain github.com
check-filter domains github.com,google.com,twitter.com
Create 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.txt
check-filter --version
# or
check-filter -v
check-filter --help
check-filter domain --help
check-filter domains --help
check-filter file --help
import 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-dev
make 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-fast
Main 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.


