透明代理
一、透明代理
使用透明代理时,流量将重定向到网络层的代理中,而无需任何客户端配置。这使得透明代理非常适合那些您无法更改客户端行为的情况-代理不兼容的移动应用程序是一个常见示例。
要设置透明代理,我们需要两个新组件。第一种是重定向机制,可以透明地将发往Internet上服务器的TCP连接重新路由到侦听代理服务器。这通常采用与代理服务器位于同一主机上的防火墙的形式 -Linux上的iptables或OSX上的 pf。当代理接收到重定向的连接时,它将看到原始的HTTP请求,而没有主机规范。这是第二个新组件进入的地方-一个主机模块,允许我们向重定向器查询TCP连接的原始目标。
目前,mitmproxy支持OSX Lion和更高版本以及所有当前版本的Linux上的透明代理。
二、Linux
在Linux上,mitmproxy与iptables重定向机制集成在一起以实现透明模式。
1.启用IP转发。
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
这样可以确保您的机器转发数据包而不是拒绝它们。
如果要在重新启动后继续执行此操作,则需要调整您的/etc/sysctl.conf
或新创建的/etc/sysctl.d/mitmproxy.conf
(请参阅此处)。
2.禁用ICMP重定向。
sysctl -w net.ipv4.conf.all.send_redirects=0
如果您的测试设备在同一物理网络上,则您的计算机不应通过跳过代理来通知设备存在一条较短的路由。
如果要在重新启动后继续执行此操作,请参见上文。
3.创建一个iptables规则集,将所需的流量重定向到mitmproxy。
详细信息将根据您的设置而有所不同,但是规则集应如下所示:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080 ip6tables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 ip6tables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080 如果您希望在重新启动后继续执行此操作,则可以使用该iptables-persistent软件包(请参见 此处)。
4. Fire up mitmproxy.
您可能想要这样的命令:
mitmproxy --mode transparent --showhost
该--mode transparent选项打开透明模式,该--showhost参数告诉mitmproxy使用Host标头的值显示URL。
5.最后,配置您的测试设备。
设置测试设备以将运行mitmproxy的主机用作默认网关,并 在测试设备上安装mitmproxy证书颁发机构。
三、重定向源自计算机本身的流量的变通办法
请按照上述步骤1、2进行操作,但要代替步骤3中的命令,请运行以下命令
创建一个用户来运行mitmproxy
sudo useradd --create-home mitmproxyuser
sudo -u mitmproxyuser -H bash -c 'cd ~ && pip install --user mitmproxy'
然后,配置iptables规则,将所有流量从本地计算机重定向到mitmproxy。请注意,只要您运行这些,你将不能够进行成功的网络电话,直到你开始mitmproxy。如果遇到问题,iptables -t nat -F可以使用繁琐的方式从iptables表中清除(清除)所有规则nat(包括已配置的任何其他规则)。
iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 443 -j REDIRECT --to-port 8080
ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 80 -j REDIRECT --to-port 8080
ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitmproxyuser --dport 443 -j REDIRECT --to-port 8080
这会将来自mitmproxyuser机器以外的所有其他用户的数据包重定向到mitmproxy。为避免出现圆形,请以用户身份运行mitmproxy mitmproxyuser。因此,第4步应如下所示:
sudo -u mitmproxyuser -H bash -c '$HOME/.local/bin/mitmproxy --mode transparent --showhost --set block_global=false'
四、OpenBSD
1.启用IP转发。
sudo sysctl -w net.inet.ip.forwarding=1
2.将以下两行放在/etc/pf.conf中。
mitm_if = "re2"
pass in quick proto tcp from $mitm_if to port { 80, 443 } divert-to 127.0.0.1 port 8080
这些规则告诉pf将所有流量从$mitm_if发往端口80或443的流量转移到在端口8080上运行的本地mitmproxy实例。您应将$mitm_ifvalue替换 为将在其中显示测试设备的接口。
3.使用规则配置pf。
doas pfctl -f /etc/pf.conf
4.现在启用它。
doas pfctl -e
5.点燃mpmproxy。
您可能想要这样的命令:
mitmproxy --mode transparent --listen-host 127.0.0.1 --showhost
该--mode transparent选项打开透明模式,该--showhost参数告诉mitmproxy使用Host标头的值显示URL。
6.最后,配置您的测试设备。
设置测试设备以将运行mitmproxy的主机用作默认网关,并 在测试设备上安装mitmproxy证书颁发机构。
请注意,上面给出的pf.conf中的“转移至”规则仅适用于入站流量。这意味着它们不会重定向来自运行pf本身的盒子的流量。我们无法区分非mitmproxy应用程序的出站连接和mitmproxy本身的出站连接-如果您想拦截自己的流量,则应使用外部主机运行mitmproxy。但是,pf可以灵活地满足各种创造性的可能性,例如拦截从VM发出的流量。有关更多信息,请参见pf.conf手册页。
五、苹果系统
OSX Lion集成了 OpenBSD项目中的pf数据包过滤器,mitmproxy使用它来在OSX上实现透明模式。请注意,这意味着我们不支持OSX早期版本的透明模式。
1.启用IP转发。
sudo sysctl -w net.inet.ip.forwarding=1
2.将以下行放在一个名为pf.conf的文件中。
rdr pass on en0 inet proto tcp to any port {80, 443} -> 127.0.0.1 port 8080
此规则告诉pf将发往端口80或443的所有流量重定向到在端口8080上运行的本地mitmproxy实例。您应该替换 en0为将出现测试设备的接口。
3.使用规则配置pf。
sudo pfctl -f pf.conf
4.现在启用它。
sudo pfctl -e
5.配置sudoer以允许mitmproxy访问pfctl。
以根用户身份在系统上编辑文件/ etc / sudoers。将以下行添加到文件末尾:
ALL ALL=NOPASSWD: /sbin/pfctl -s state
请注意,这允许系统上的任何用户/sbin/pfctl -s state以root用户身份运行命令而无需输入密码。这仅允许检查状态表,因此不应有不适当的安全风险。如果您有特殊要求,请随时限制运行mitmproxy的用户。
6.Fire up mitmproxy。
您可能想要这样的命令:
mitmproxy --mode transparent --showhost
该--mode transparent标志打开透明模式,该--showhost参数告诉mitmproxy使用Host标头的值显示URL。
7.最后,配置您的测试设备。
设置测试设备以将运行mitmproxy的主机用作默认网关,并 在测试设备上安装mitmproxy证书颁发机构。
请注意,上面给出的pf.conf中的 rdr 规则仅适用于入站流量。 这意味着它们将不会重定向来自运行pf本身的盒子的流量。我们无法区分非mitmproxy应用程序的出站连接和mitmproxy本身的出站连接。如果要拦截自己的macOS流量,请参阅下面的解决方法,或使用外部主机运行mitmproxy。实际上,PF可以灵活地满足各种创造性的可能性,例如拦截来自VM的流量。有关更多信息,请参见pf.conf手册页。
六、重定向源自计算机本身的流量的变通办法
按照步骤1,2如上,但在步骤2变化的文件的内容pf.conf中至
#The ports to redirect to proxy
redir_ports = "{http, https}"
#The address the transparent proxy is listening on
tproxy = "127.0.0.1 port 8080"
#The user the transparent proxy is running as
tproxy_user = "nobody"
#The users whose connection must be redirected.
#
#This cannot involve the user which runs the
#transparent proxy as that would cause an infinite loop.
#
rdr pass proto tcp from any to any port $redir_ports -> $tproxy
pass out route-to (lo0 127.0.0.1) proto tcp from any to any port $redir_ports user { != $tproxy_user }
请按照上面的步骤3-5。这会将来自nobody机器以外的所有其他用户的数据包重定向到mitmproxy。为避免出现圆形,请以用户身份运行mitmproxy nobody。因此,步骤6应该如下所示:
sudo -u nobody mitmproxy --mode transparent --showhost
Linux上的“全”透明模式
默认情况下,mitmproxy将使用其自己的本地IP地址进行服务器端连接。如果不希望这样做,可以使用–spoof-source-address参数将客户端的IP地址用于服务器端连接。要使此模式正常工作,需要以下配置:
CLIENT_NET=192.168.1.0/24
TABLE_ID=100
MARK=1
echo "$TABLE_ID mitmproxy" >> /etc/iproute2/rt_tables
iptables -t mangle -A PREROUTING -d $CLIENT_NET -j MARK --set-mark $MARK
iptables -t nat \
-A PREROUTING -p tcp -s $CLIENT_NET \
--match multiport --dports 80,443 -j \
REDIRECT --to-port 8080
ip rule add fwmark $MARK lookup $TABLE_ID
ip route add local $CLIENT_NET dev lo table $TABLE_ID
但是,此模式确实需要root特权。示例目录中有一个包装器,名为“ mitmproxy_shim.c”,该包装器使您可以使用已放弃特权的此模式。它可以按如下方式使用:
gcc examples/complex/full_transparency_shim.c -o mitmproxy_shim -lcap
sudo chown root:root mitmproxy_shim
sudo chmod u+s mitmproxy_shim
./mitmproxy_shim $(which mitmproxy) --mode transparent --set spoof-source-address
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论