此篇博客只讲解如何将mitmproxy的中间人代理脚本放在服务器上运行,不会过多说明mitmproxy如何使用,有需要请自行百度,Google等

一、生成requirements.txt文件

requirements.txt用于记录所有依赖包及其精确的版本号。以便新环境部署。使用方法参考这篇博客

二、编写Dockerfile文件

FROM python:3.7
MAINTAINER Jacob
ENV PATH /usr/local/bin:$PATH
ADD . /demo_mitm
WORKDIR /demo_mitm
RUN pip3 install -i https://pypi.doubanio.com/simple/ -r requirements.txt
CMD mitmdump -p 8888 -s mitm_addons.py --set block_global=false

Dockerfile 指令:

指令

说明

FROM

指定所创建镜像的基础镜像

MAINTAINER

指定维护者信息

ENV

指定环境变量

ADD

赋值指定的路径下的内容到容器中的路径下,可以为URL;如果为tar文件,会自动解压到路径下(注意: 上边命令中./demo_mitm之间有空格,其中.表示宿主机的当前目录,即当前脚本所在目录,/demo_mitm表示docker容器目录,合起来的意思就是将宿主机当前目录下的文件拷贝至docker容器的/demo_mitm目录,文件夹不存在会自动创建)

WORKDIR

配置工作目录,这里我配置的是/demo_mitm,即在上边通过ADD指令添加的目录下

RUN

在创建镜像时运行的命令,可写多个

CMD

指定启动容器时默认执行的命令

注意事项

  • 在启动mitmproxy时不要用mitmproxy,在docker中不支持会报Error: mitmproxy's console interface requires a tty. Please run mitmproxy in an interactive shell environment.,需要用 mitmdump 方式来启动
  • CMD启动容器时默认执行的命令我添加了 --set block_global=false,这样做的原因是block_global是用来设置是否阻止来自全球可访问网络的连接,这在IANA特殊目的注册表中已定义。默认值:True,只能在内网设置代理,需要指定为False允许外网访问
    如果不添加则在手机端设置好代理后报如下错误(ip我用*号代替):
Client connection from ::ffff:*.*.*.* killed by block_global
*.*.*.*:2197: Connection killed
*.*.*.*:2197: clientdisconnect
*.*.*.*:2198: clientconnect
Client connection from ::ffff:*.*.*.* killed by block_global
*.*.*.*:2198: Connection killed
*.*.*.*:2198: clientdisconnect
*.*.*.*:2199: clientconnect

三、调整项目中的连接

如果代码中有连接数据库等操作,且填的是内网地址,需要将链接改为外网地址,如果同属一个docker内网,也可以改成docker的内网地址

四、构建镜像

构建

docker build -t demo_mitm:latest .

命名格式: 镜像名称(不能有英文大写字母):标签
PS: 如果没有标签那么可以写latest

注:在构建下载依赖包时,可能会卡在 brotlipy-0.x.0.tar.gz 很长时间,耐心等待即可

检查是否构建成功

输入 docker images 查看镜像列表是否有刚才创建的demo_mitm镜像

五、启动镜像

输入下边的命令即可启动

docker run -d -v /opt/myapp/demo_mitm:/demo_mitm -p 8080:8888 --name demo_mitm demo_mitm
  • -d: 容器在后台运行
  • -v: 将宿主机目录映射到容器内,将宿主机上的代码映射到容器的工作内,这里当我修改编写好的脚本后就不需要重建构建镜像了,只需要修改在宿主机上的代码即可,如果不用后期再修改代码,则不需要映射容器内工作目录的代码还是最开始的
  • -p: 将宿主机端口映射到容器使用的端口,容器使用的是8888端口,因为宿主机8888端口被其他项目占用了所以使用了8080来映射,如果不映射端口外网无法访问容器端口
  • --name: 设置容器名字,我这里是设置和镜像名称保持一致
  • 结尾的 demo_mitm 指定启动的镜像

结束

至此即可用手机连接wifi后设置代理为服务器的ip+端口后在服务端进行抓包