透明代理

优质
小牛编辑
119浏览
2023-12-01

一、透明代理

使用透明代理时,流量将重定向到网络层的代理中,而无需任何客户端配置。这使得透明代理非常适合那些您无法更改客户端行为的情况-代理不兼容的移动应用程序是一个常见示例。

要设置透明代理,我们需要两个新组件。第一种是重定向机制,可以透明地将发往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