使用 3proxy 和 iptables/netfilter 的透明代理基础知识或如何“通过代理放置所有内容”

在本文中,我想揭示透明代理的可能性,它允许您通过外部代理服务器重定向全部或部分流量,而客户端绝对不会注意到。

当我开始解决这个问题时,我面临着这样一个事实:它的实现有一个重大问题——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

让我们去网站 bgp.he.net/net/208.85.40.0/24#_netinfo
可以看到我要找的子网是AS40428 Pandora Media, Inc

bgp.he.net/net/208.85.40.0/24#_netinfo

开放 v4 前缀

bgp.he.net/AS40428#_prefixes

这是所需的子网!

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. 为了减少子网数量,需要进行聚合。 前往网站 ip-calculator.ru/聚合 并将我们的列表复制到那里。 结果是 - 6 个子网而不是 14 个。

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计划官方网站 3proxy.ru

2.从源码安装3proxy的说明 www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

3. GitHub上的3proxy开发分支 github.com/z3APA3A/3proxy/issues/274

来源: habr.com

添加评论