一、域名 dns查询
在 Linux 系统中,你可以使用多种工具和技术来进行 DNS 查询和 IP 限制。以下是一些常用的方法和工具:
DNS 查询
-
dig
命令:
dig
是一个强大的命令行工具,用于查询 DNS 信息。dig example.com
你可以指定查询类型,例如 A 记录、MX 记录等:
dig example.com A dig example.com MX
直接输出ip信息
dig +short example.com
指定dns域名服务商
dig @114.114.114.114 example.com
8.8.8.8 谷歌
-
nslookup
命令:
nslookup
是另一个常用的 DNS 查询工具。nslookup example.com
-
host
命令:
host
命令也可以用于 DNS 查询。host example.com
二、域名IP 访问限制
在 Linux 系统中,你可以使用 iptables
或 nftables
来限制 IP 地址的访问。
1)使用 iptables
阻止特定 IP 地址:
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
这条命令会阻止来自 192.168.1.100
的入站流量。
iptables
是一个强大的命令行工具,用于配置 Linux 内核内置的防火墙,即 Netfilter。以下是一些常用参数的说明,以及如何使用 iptables
进行域名字符串匹配限制。
常用参数说明
-
-I
(插入规则):
将规则插入到链的顶部(即第一个位置)。sudo iptables -I INPUT -s 192.168.1.100 -j DROP
这条命令会将阻止来自
192.168.1.100
的入站流量的规则插入到INPUT
链的顶部。 -
-D
(删除规则):
从链中删除指定的规则。sudo iptables -D INPUT -s 192.168.1.100 -j DROP
这条命令会删除
INPUT
链中阻止来自192.168.1.100
的入站流量的规则。 -
-A
(追加规则):
将规则追加到链的末尾。sudo iptables -A INPUT -s 192.168.1.100 -j DROP
这条命令会将阻止来自
192.168.1.100
的入站流量的规则追加到INPUT
链的末尾。 -
-p
(协议):
指定要匹配的协议(如tcp
、udp
、icmp
等)。sudo iptables -A INPUT -p tcp --dport 22 -j DROP
这条命令会阻止所有到端口 22(SSH)的 TCP 入站流量。
-
-s
(源地址):
指定要匹配的源 IP 地址或网络。sudo iptables -A INPUT -s 192.168.1.0/24 -j DROP
这条命令会阻止来自
192.168.1.0/24
网络的所有入站流量。 -
-d
(目标地址):
指定要匹配的目标 IP 地址或网络。sudo iptables -A OUTPUT -d 192.168.1.100 -j DROP
这条命令会阻止所有到
192.168.1.100
的出站流量。 -
--dport
(目标端口):
指定要匹配的目标端口。sudo iptables -A INPUT -p tcp --dport 80 -j DROP
这条命令会阻止所有到端口 80(HTTP)的 TCP 入站流量。
-
-j
(跳转目标):
指定匹配规则时要执行的操作(如ACCEPT
、DROP
、REJECT
等)。sudo iptables -A INPUT -s 192.168.1.100 -j DROP
这条命令会阻止来自
192.168.1.100
的所有入站流量。
域名字符串匹配
你的命令是使用iptables
来阻止从源 IP 地址192.168.2.9
发出的数据包,如果这些数据包中包含字符串"qq.com"
。以下是命令的详细解释:
sudo iptables -I OUTPUT -s 192.168.2.9 -m string --string "qq.com" --algo kmp -j DROP
-I OUTPUT
:将规则插入到OUTPUT
链的顶部。-s 192.168.2.9
:匹配源 IP 地址为192.168.2.9
的数据包。-m string
:加载string
模块。--string "qq.com"
:匹配数据包中包含字符串"qq.com"
的内容。--algo kmp
:指定字符串匹配算法为kmp
(Knuth-Morris-Pratt 算法)。-j DROP
:匹配到的数据包将被丢弃。
删除重复屏蔽规则
sudo iptables -nL OUTPUT --line-numbers ##查询规则索引显示
按索引号删除,注意要从最后往前索引号删除
def delete_iptables_rules(match_content):
try:
# 列出 INPUT 链中的所有规则及其行号
result = subprocess.run(['sudo', 'iptables', '-nL', 'OUTPUT', '--line-numbers'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
lines = result.stdout.replace('"',"").split('\n')
# 提取所有规则的行号
line_numbers = []
for line in lines:
if line and not line.startswith('Chain'):
line_number = line.split()
if len(match_content)==2:
if match_content[0] in line_number and match_content[1] in line_number:
line_numbers.append(int(line_number[0]))
if len(match_content)==1:
if match_content[0] in line_number:
line_numbers.append(int(line_number[0]))
# 从最后一行开始逐条删除规则
for line_number in sorted(line_numbers, reverse=True):
subprocess.run(['sudo', 'iptables', '-D', 'OUTPUT', str(line_number)], check=True)
## orgin_ip 是 -s源头ip,url 是字符串匹配的域名,d_url是访问服务器ip
delete_iptables_rules([orgin_ip,url])
delete_iptables_rules([orgin_ip,d_url])
使用场景
这个命令通常用于阻止特定 IP 地址发出的包含特定字符串的数据包。例如,如果你有一个 HTTP 请求从 192.168.2.9
发出,并且请求中包含 "qq.com"
字符串,这个命令会阻止该请求。
注意事项
- 应用层协议:这个命令主要用于应用层协议(如 HTTP、SMTP 等),因为这些协议的数据包中可能包含字符串内容。
- 协议匹配:你可能需要指定协议(如
-p tcp
)来匹配特定的协议。
完整示例
假设你想阻止从 192.168.2.9
发出的 HTTP 请求中包含 "qq.com"
字符串的数据包,可以使用以下命令:
sudo iptables -I OUTPUT -s 192.168.2.9 -p tcp --dport 80 -m string --string "qq.com" --algo kmp -j DROP
这个命令会阻止从 192.168.2.9
发出的目标端口为 80(HTTP)的 TCP 数据包,如果这些数据包中包含 "qq.com"
字符串。
禁止所有网站访问:
2)使用 nftables
nftables
是 iptables
的继任者,提供了更灵活和高效的规则管理。
-
安装
nftables
:sudo apt-get install nftables
-
阻止特定 IP 地址:
sudo nft add rule ip filter input ip saddr 192.168.1.100 drop
-
允许特定 IP 地址:
sudo nft add rule ip filter input ip saddr 192.168.1.100 accept
-
阻止特定端口:
sudo nft add rule ip filter input tcp dport 22 drop
-
保存和恢复规则:
保存规则:
sudo nft list ruleset > /etc/nftables.conf
恢复规则:
sudo nft -f /etc/nftables.conf
结合 DNS 查询和 IP 限制
你可以结合 DNS 查询和 IP 限制来实现更复杂的策略。例如,你可以先查询域名的 IP 地址,然后根据这些 IP 地址设置防火墙规则。
-
查询域名的 IP 地址:
dig +short example.com
-
根据查询结果设置防火墙规则:
假设查询结果为
192.168.1.100
,你可以使用以下命令阻止该 IP 地址:sudo iptables -A INPUT -s 192.168.1.100 -j DROP
通过这些方法,你可以在 Linux 系统中实现灵活的 DNS 查询和 IP 限制策略。
三、PTR 反向解析从 IP 地址到域名的映射
参考:https://worktile.com/kb/ask/1850738.html
PTR记录(Pointer Record)是DNS(Domain Name System)中的一种资源记录,用于将IP地址映射到域名。与A记录(Address Record)和CNAME记录(Canonical Name Record)将域名映射到IP地址不同,PTR记录用于反向DNS查询,即从IP地址查找对应的域名。
PTR记录的作用
- 验证身份:在电子邮件系统中,PTR记录用于验证发送方的身份。许多邮件服务器会检查发送方的IP地址是否有对应的PTR记录,以判断邮件是否来自合法的域名。
- 提高邮件传递率:拥有有效的PTR记录可以提高电子邮件的传递率,因为许多邮件服务提供商会将没有PTR记录的IP地址标记为潜在的垃圾邮件发送者。
- 网络安全:PTR记录可以帮助识别和追踪网络攻击源,通过反向查找IP地址对应的域名,可以更好地了解攻击者的来源。
检查PTR记录
你可以使用以下命令来检查某个IP地址的PTR记录:
-
Linux/Unix:
host IP_ADDRESS
例如:
host 8.8.8.8
-
Windows:
nslookup -type=PTR IP_ADDRESS
例如:
nslookup -type=PTR 8.8.8.8
ubuntu
windows
示例
假设你有一个IP地址为192.0.2.1
,你希望为其创建一个PTR记录,指向域名example.com
。你需要联系你的ISP或IP管理机构,请求创建如下PTR记录:
1.2.0.192.in-addr.arpa. IN PTR example.com.
注意事项
- PTR记录的域名必须是有效的,并且指向的域名必须有对应的A记录或CNAME记录。
- PTR记录的创建和修改可能需要一些时间来传播到全球的DNS服务器,通常需要几个小时到几天的时间。
- 确保你提供的域名是正确的,并且你有权使用该域名,否则可能会导致邮件传递问题或其他安全问题。