在本文中,我想揭示透明代理的可能性,它允许您通过外部代理服务器重定向全部或部分流量,而客户端绝对不会注意到。
当我开始解决这个问题时,我面临着这样一个事实:它的实现有一个重大问题——HTTPS 协议。 在过去的好日子里,透明 HTTP 代理并没有什么特殊问题,但使用 HTTPS 代理时,浏览器会报告协议受到干扰,这就是幸福的终结。
在Squid代理服务器的通用说明中,他们甚至建议生成自己的证书并将其安装在客户端上,这至少完全是无稽之谈,不合理,看起来像MITM攻击。 我知道 Squid 已经可以做类似的事情,但本文是关于使用来自受人尊敬的 3APA3A 的 3proxy 的经过验证的有效方法。
接下来,我们将详细了解从源代码构建 3proxy 的过程、其配置、使用 NAT 的完全代理和选择性代理、到多个外部代理服务器的通道分配,以及路由器和静态路由的使用。 我们使用 Debian 9 x64 作为操作系统。 开始!
安装 3proxy 并运行常规代理服务器
1.安装ifconfig(来自net-tools包)
apt-get install net-tools
2.安装午夜指挥官
apt-get install mc
3.我们现在有2个接口:
enp0s3 - 外部,查看互联网
enp0s8 - 内部,必须查看本地网络
在其他基于 Debian 的发行版上,接口通常命名为 eth0 和 eth1。
ifconfig -a
接口enp0s3:标志=4163 最大传输温度 1500
inet 192.168.23.11 网络掩码 255.255.255.0 广播 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000(以太网)
RX 数据包 6412 字节 8676619 (8.2 MiB)
RX 错误 0 丢弃 0 溢出 0 帧 0
TX 数据包 1726 字节 289128 (282.3 KiB)
TX 错误 0 丢弃 0 超限 0 载波 0 冲突 0
enp0s8:标志=4098 最大传输温度 1500
以太 08:00:27:79:a7:e3 txqueuelen 1000(以太网)
RX 数据包 0 字节 0 (0.0 B)
RX 错误 0 丢弃 0 溢出 0 帧 0
TX 数据包 0 字节 0 (0.0 B)
TX 错误 0 丢弃 0 超限 0 载波 0 冲突 0
瞧:标志=73 最大传输单元 65536
inet 127.0.0.1 网络掩码 255.0.0.0
inet6 ::1 prefixlen 128scopeid 0x10loop txqueuelen 1(本地环回)
RX 数据包 0 字节 0 (0.0 B)
RX 错误 0 丢弃 0 溢出 0 帧 0
TX 数据包 0 字节 0 (0.0 B)
TX 错误 0 丢弃 0 超限 0 载波 0 冲突 0
enp0s8 接口当前未使用,当我们想要使用代理 NAT 或 NAT 配置时,我们将启用它。 这时为它分配一个静态 IP 就合乎逻辑了。
4.我们开始安装3proxy
4.1 安装用于从源编译 3proxy 的基本包
root@debian9:~# apt-get install build-essential libevent-dev libssl-dev -y
4.2. 让我们创建一个文件夹来下载带有源的存档
root@debian9:~# mkdir -p /opt/proxy
4.3. 让我们进入这个文件夹
root@debian9:~# cd /opt/proxy
4.4. 现在让我们下载最新的3proxy包。 截至撰写本文时,最新稳定版本为 0.8.12 (18/04/2018) 从 3proxy 官方网站下载
root@debian9:/opt/proxy# wget https://github.com/z3APA3A/3proxy/archive/0.8.12.tar.gz
4.5. 让我们解压下载的存档
root@debian9:/opt/proxy# tar zxvf 0.8.12.tar.gz
4.6. 进入解压后的目录构建程序
root@debian9:/opt/proxy# cd 3proxy-0.8.12
4.7. 接下来,我们需要在头文件中添加一行,以便我们的服务器完全匿名(它确实有效,一切都被检查,客户端IP被隐藏)
root@debian9:/opt/proxy/3proxy-0.8.12# nano +29 src/proxy.h
添加一行
#define ANONYMOUS 1
按 Ctrl+x 和 Enter 保存更改。
4.8. 让我们开始组装程序
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux
制作日志make[2]:离开目录“/opt/proxy/3proxy-0.8.12/src/plugins/TransparentPlugin”
make[1]:离开目录“/opt/proxy/3proxy-0.8.12/src”
没有错误,我们继续。
4.9. 在系统上安装程序
root@debian9:/opt/proxy/3proxy-0.8.12# make -f Makefile.Linux install
4.10. 进入根目录,查看程序安装位置
root@debian9:/opt/proxy/3proxy-0.8.12# cd ~/
root@debian9:~# whereis 3proxy
3proxy:/usr/local/bin/3proxy /usr/local/etc/3proxy
4.11. 让我们创建一个用于配置文件的文件夹并登录用户的主目录
root@debian9:~# mkdir -p /home/joke/proxy/logs
4.12. 转到配置应该所在的目录
root@debian9:~# cd /home/joke/proxy/
4.13. 创建一个空文件并将配置复制到其中
root@debian9:/home/joke/proxy# cat > 3proxy.conf
3proxy.conf守护
pid文件 /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
缓存 65536
用户测试员:CL:1234
超时 1 5 30 60 180 1800 16 60
日志 /home/joke/proxy/logs/3proxy.log D
logformat "- +_L%t.%.%N.%p %E %U %C:%c %R:%r %O %I %h %T"
旋转3
授权强
红晕
允许测试者
袜子-p3128
代理-p8080
要保存,请按 Ctrl + Z
4.14。 让我们创建一个pid文件,以便在启动过程中不会出现错误。
root@debian9:/home/joke/proxy# cat > 3proxy.pid
要保存,请按 Ctrl + Z
4.15。 让我们启动代理服务器!
root@debian9:/home/joke/proxy# 3proxy /home/joke/proxy/3proxy.conf
4.16。 让我们看看服务器是否正在监听端口
root@debian9:~/home/joke/proxy# netstat -nlp
网络统计日志有效的互联网连接(仅限服务器)
Proto Recv-Q Send-Q 本地地址 外部地址 状态 PID/程序名称
tcp 0 0 0.0.0.0:8080 0.0.0.0:* 监听 504/3proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* 监听 338/sshd
tcp 0 0 0.0.0.0:3128 0.0.0.0:* 监听 504/3proxy
tcp6 0 0 :::22 :::* 监听 338/sshd
UDP 0 0 0.0.0.0:68 0.0.0.0:* 352/dhclient
正如配置中所写,我们的 Web 代理侦听端口 8080,Socks5 代理侦听端口 3128。
4.17。 要在重启后自动启动代理服务,您需要将其添加到 cron 中。
root@debian9:/home/joke/proxy# crontab -e
添加一行
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxy.conf
我们按 Enter 键,因为 cron 应该看到行结束符,然后保存文件。
应该有一条关于安装新 crontab 的消息。
crontab:安装新的 crontab
4.18。 让我们重新启动系统并尝试通过浏览器连接到代理。 为了进行检查,我们使用 Firefox 浏览器(用于 Web 代理)和具有身份验证功能的 sock5 的 FoxyProxy 插件。
root@debian9:/home/joke/proxy# reboot
4.19。 重新启动后检查代理的运行情况后,您可以查看日志。 这样就完成了代理服务器的设置。
3 代理日志1542573996.018 PROXY.8080 00000 测试人员 192.168.23.10:50915 217.12.15.54:443 1193 6939 0 CONNECT_ads.yahoo.com:443_HTTP/1.1
1542574289.634 SOCK5.3128 00000 测试仪 192.168.23.10:51193 54.192.13.69:443 0 0 0 CONNECT_normandy.cdn.mozilla.net:443
设置和运行透明代理 NAT 配置
在此配置中,内部网络上的所有设备都将通过远程代理服务器透明地在 Internet 上运行。 绝对所有 TCP 连接将被重定向到一个或多个(真正扩展了通道宽度,配置示例第 2 号!)代理服务器。 DNS 服务将使用 3proxy (dnspr) 功能。 UDP 不会“向外”传送,因为我们还没有使用转发机制(Linux 内核默认禁用)。
1. 是时候启用enp0s8接口了
root@debian9:~# nano /etc/network/interfaces
/etc/network/interfaces 文件#这个文件描述您的系统上可用的网络接口
#如何激活它们。 欲了解更多信息,请参阅的接口(5)。
源/etc/network/interfaces.d/*
#回环网络接口
自动卤味
iface的罗iNet的回环
# 主网络接口
允许热插拔 enp0s3
iface enp0s3 inet dhcp
# 辅助网络接口
允许热插拔 enp0s8
iface enp0s8 inet 静态
地址192.168.201.254
网络掩码255.255.255.0
这里我们为enp0s8接口分配了一个静态地址192.168.201.254和一个掩码255.255.255.0
保存配置 Ctrl+X 并重新启动
root@debian9:~# reboot
2. 检查接口
root@debian9:~# ifconfig
ifconfig 日志enp0s3:标志=4163 最大传输温度 1500
inet 192.168.23.11 网络掩码 255.255.255.0 广播 192.168.23.255
inet6 fe80::a00:27ff:fec2:bae4 prefixlen 64scopeid 0x20 ether 08:00:27:c2:ba:e4 txqueuelen 1000(以太网)
RX 数据包 61 字节 7873 (7.6 KiB)
RX 错误 0 丢弃 0 溢出 0 帧 0
TX 数据包 65 字节 10917 (10.6 KiB)
TX 错误 0 丢弃 0 超限 0 载波 0 冲突 0
enp0s8:标志=4163 最大传输温度 1500
inet 192.168.201.254 网络掩码 255.255.255.0 广播 192.168.201.255
inet6 fe80::a00:27ff:fe79:a7e3 prefixlen 64scopeid 0x20 ether 08:00:27:79:a7:e3 txqueuelen 1000(以太网)
RX 数据包 0 字节 0 (0.0 B)
RX 错误 0 丢弃 0 溢出 0 帧 0
TX 数据包 8 字节 648 (648.0 B)
TX 错误 0 丢弃 0 超限 0 载波 0 冲突 0
瞧:标志=73 最大传输单元 65536
inet 127.0.0.1 网络掩码 255.0.0.0
inet6 ::1 prefixlen 128scopeid 0x10loop txqueuelen 1(本地环回)
RX 数据包 0 字节 0 (0.0 B)
RX 错误 0 丢弃 0 溢出 0 帧 0
TX 数据包 0 字节 0 (0.0 B)
TX 错误 0 丢弃 0 超限 0 载波 0 冲突 0
3. 一切顺利,现在您需要配置 3proxy 进行透明代理。
root@debian9:~# cd /home/joke/proxy/
root@debian9:/home/joke/proxy# cat > 3proxytransp.conf
1号透明代理服务器配置示例守护
pid文件 /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
缓存 65536
超时 1 5 30 60 180 1800 16 60
日志 /home/joke/proxy/logs/3proxy.log D
logformat "- +_L%t.%.%N.%p %E %U %C:%c %R:%r %O %I %h %T"
旋转3
红晕
仅授权
域名解析服务
允许 *
父级 1000ocks5 IP_ADDRESS OF EXTERNAL_PROXY 3128 测试仪 1234
插件/opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so透明_插件
tcppm -i0.0.0.0 888 127.0.0.1 11111
4. 现在我们使用新配置启动 3proxy
root@debian9:/home/joke/proxy# /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
5.再次添加到crontab
root@debian9:/home/joke/proxy# crontab -e
@reboot /usr/local/bin/3proxy /home/joke/proxy/3proxytransp.conf
6. 让我们看看我们的代理现在正在听什么
root@debian9:~# netstat -nlp
网络统计日志有效的互联网连接(仅限服务器)
Proto Recv-Q Send-Q 本地地址 外部地址 状态 PID/程序名称
tcp 0 0 0.0.0.0:22 0.0.0.0:* 监听 349/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* 监听 354/3proxy
tcp6 0 0 :::22 :::* 监听 349/sshd
udp 0 0 0.0.0.0:53 0.0.0.0:* 354/3proxy
UDP 0 0 0.0.0.0:68 0.0.0.0:* 367/dhclient
7. 现在代理已准备好接受端口 888 上的任何 TCP 连接、端口 53 上的 DNS 连接,以便可以将它们重定向到远程ocks5 代理和 DNS Google 8.8.8.8。 我们所要做的就是配置 netfilter (iptables) 和 DHCP 规则来发布地址。
8. 安装 iptables-persistent 和 dhcpd 软件包
root@debian9:~# apt-get install iptables-persistent isc-dhcp-server
9.编辑dhcpd启动文件
root@debian9:~# nano /etc/dhcp/dhcpd.conf
配置文件#dhcpd.conf
#
# ISC dhcpd 的示例配置文件
#
# 所有支持的网络通用的选项定义...
选项域名“example.org”;
选项域名服务器 ns1.example.org, ns2.example.org;
默认租赁时间600;
最大租赁时间 7200;
ddns 更新样式无;
# 如果这个 DHCP 服务器是本地的官方 DHCP 服务器
# 网络,权威指令应该取消注释。
权威性;
# 内部子网的配置略有不同。
子网192.168.201.0网络掩码255.255.255.0 {
范围192.168.201.10 192.168.201.250;
选项域名服务器 192.168.201.254;
可选路由器192.168.201.254;
选项广播地址192.168.201.255;
默认租赁时间600;
最大租赁时间 7200;
}
11.重启并检查端口67上的服务
root@debian9:~# reboot
root@debian9:~# netstat -nlp
网络统计日志有效的互联网连接(仅限服务器)
Proto Recv-Q Send-Q 本地地址 外部地址 状态 PID/程序名称
tcp 0 0 0.0.0.0:22 0.0.0.0:* 监听 389/sshd
tcp 0 0 0.0.0.0:888 0.0.0.0:* 监听 310/3proxy
tcp6 0 0 :::22 :::* 监听 389/sshd
UDP 0 0 0.0.0.0:20364 0.0.0.0:* 393/dhcpd
udp 0 0 0.0.0.0:53 0.0.0.0:* 310/3proxy
UDP 0 0 0.0.0.0:67 0.0.0.0:* 393/dhcpd
UDP 0 0 0.0.0.0:68 0.0.0.0:* 405/dhclient
udp6 0 0 :::31728 :::* 393/dhcpd
原始 0 0 0.0.0.0:1 0.0.0.0:* 393/dhcpd
12. 剩下的就是将所有 tcp 请求重定向到端口 888 并将规则保存在 iptables 中
root@debian9:~# iptables -t nat -A PREROUTING -s 192.168.201.0/24 -p tcp -j REDIRECT --to-ports 888
root@debian9:~# iptables-save > /etc/iptables/rules.v4
13. 要扩展通道带宽,您可以同时使用多个代理服务器。 总数必须为 1000。与指定代理服务器建立新连接的概率为 0.2、0.2、0.2、0.2、0,1、0,1。
注意:如果我们有网络代理,那么我们需要编写 connect,而不是ocks5,如果是socks4,则需要编写socks4(socks4 不支持登录/密码授权!)
2号透明代理服务器配置示例守护
pid文件 /home/joke/proxy/3proxy.pid
nserver 8.8.8.8
缓存 65536
麦克康500
超时 1 5 30 60 180 1800 16 60
日志 /home/joke/proxy/logs/3proxy.log D
logformat "- +_L%t.%.%N.%p %E %U %C:%c %R:%r %O %I %h %T"
旋转3
红晕
仅授权
域名解析服务
允许 *
父级 200ocks5 IP_ADDRESS_EXTERNAL_PROXY#1 3128 测试仪 1234
父级 200ocks5 IP_ADDRESS_EXTERNAL_PROXY#2 3128 测试仪 1234
父级 200ocks5 IP_ADDRESS_EXTERNAL_PROXY#3 3128 测试仪 1234
父级 200ocks5 IP_ADDRESS_EXTERNAL_PROXY#4 3128 测试仪 1234
父级 100ocks5 IP_ADDRESS_EXTERNAL_PROXY#5 3128 测试仪 1234
父级 100ocks5 IP_ADDRESS_EXTERNAL_PROXY#6 3128 测试仪 1234
插件/opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so透明_插件
tcppm -i0.0.0.0 888 127.0.0.1 11111
设置和运行 NAT + 透明代理配置
在此配置中,我们将使用常用的 NAT 机制,对各个地址或子网进行选择性或完全透明的代理。 内部网络用户将使用某些服务/子网,甚至没有意识到他们正在通过代理工作。 所有 https 连接都工作正常,无需生成/替换证书。
首先,我们决定要代理哪些子网/服务。 我们假设外部代理位于 pandora.com 等服务运行的地方。 现在仍然需要确定其子网/地址。
1. 平
root@debian9:~# ping pandora.com
PING pandora.com (208.85.40.20) 56(84) 字节数据。
2. 在 Google 中输入 BGP 208.85.40.20
让我们去网站
可以看到我要找的子网是AS40428 Pandora Media, Inc
开放 v4 前缀
这是所需的子网!
199.116.161.0/24
199.116.162.0/24
199.116.164.0/23
199.116.164.0/24
199.116.165.0/24
208.85.40.0/24
208.85.41.0/24
208.85.42.0/23
208.85.42.0/24
208.85.43.0/24
208.85.44.0/24
208.85.46.0/23
208.85.46.0/24
208.85.47.0/24
3. 为了减少子网数量,需要进行聚合。 前往网站
199.116.161.0/24
199.116.162.0/24
199.116.164.0/23
208.85.40.0/22
208.85.44.0/24
208.85.46.0/23
4. 清除iptables规则
root@debian9:~# iptables -F
root@debian9:~# iptables -X
root@debian9:~# iptables -t nat -F
root@debian9:~# iptables -t nat -X
启用转发和NAT机制
root@debian9:~# echo 1 > /proc/sys/net/ipv4/ip_forward
root@debian9:~# iptables -A FORWARD -i enp0s3 -o enp0s8 -j ACCEPT
root@debian9:~# iptables -A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT
root@debian9:~# iptables -t nat -A POSTROUTING -o enp0s3 -s 192.168.201.0/24 -j MASQUERADE
为了确保重新启动后永久启用转发,让我们更改文件
root@debian9:~# nano /etc/sysctl.conf
并取消注释该行
net.ipv4.ip_forward = 1
Ctrl+X 保存文件
5. 我们将 pandora.com 子网封装在代理中
root@debian9:~# iptables -t nat -A PREROUTING -s 192.168.201.0/24 -d 199.116.161.0/24,199.116.162.0/24,199.116.164.0/23,208.85.40.0/22,208.85.44.0/24,208.85.46.0/23 -p tcp -j REDIRECT --to-ports 888
6.让我们遵守规则
root@debian9:~# iptables-save > /etc/iptables/rules.v4
通过路由器配置设置和运行透明代理
在此配置中,透明代理服务器可以是家庭/公司路由器后面的单独 PC 或虚拟机。 在路由器或设备上注册静态路由就足够了,整个子网将使用代理,而不需要任何额外的设置。
重要的! 我们的网关必须从路由器接收静态 IP,或者将其本身配置为静态。
1.配置静态网关地址(enp0s3适配器)
root@debian9:~# nano /etc/network/interfaces
/etc/network/interfaces 文件#这个文件描述您的系统上可用的网络接口
#如何激活它们。 欲了解更多信息,请参阅的接口(5)。
源/etc/network/interfaces.d/*
#回环网络接口
自动卤味
iface的罗iNet的回环
# 主网络接口
允许热插拔 enp0s3
iface enp0s3 inet 静态
地址192.168.23.2
网络掩码255.255.255.0
网关192.168.23.254
# 辅助网络接口
允许热插拔 enp0s8
iface enp0s8 inet 静态
地址192.168.201.254
网络掩码255.255.255.0
2.允许192.168.23.0/24子网的设备使用代理
root@debian9:~# iptables -t nat -A PREROUTING -s 192.168.23.0/24 -d 199.116.161.0/24,199.116.162.0/24,199.116.164.0/23,208.85.40.0/22,208.85.44.0/24,208.85.46.0/23 -p tcp -j REDIRECT --to-ports 888
3.让我们遵守规则
root@debian9:~# iptables-save > /etc/iptables/rules.v4
4. 让我们在路由器上注册子网
路由器网络列表199.116.161.0 255.255.255.0 192.168.23.2
199.116.162.0 255.255.255.0 192.168.23.2
199.116.164.0 255.255.254.0 192.168.23.2
208.85.40.0 255.255.252.0 192.168.23.2
208.85.44.0 255.255.255.0 192.168.23.2
208.85.46.0 255.255.254.0 192.168.23.2
使用的材料/资源
1. 3proxy计划官方网站
2.从源码安装3proxy的说明
3. GitHub上的3proxy开发分支
来源: habr.com