使用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.安装Midnigth Commander
apt-get install mc
3.我们现在有2个界面:
enp0s3-外部,可以在Internet上查看
enp0s8-内部,应查看局域网
在其他基于Debian的发行版中,接口通常称为eth0和eth1。
ifconfig -a

介面
enp0s3:标志= 4163 <UP,广播,运行,多播> mtu 1500
inet 192.168.23.11网络掩码255.255.255.0广播192.168.23.255
inet6 fe80 :: a00:27ff:fec2:bae4 prefixlen 64 scopeid 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 <广播,多播> mtu 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

lo:标志= 73 <UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1网络掩码255.0.0.0
inet6 :: 1 prefixlen 128 scopeid 0x10循环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(04/18/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 /本地/ bin / 3proxy / usr /本地/ 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
守护程序
pidfile / home /笑话/proxy/3proxy.pid
nserver 8.8.8.8
nscache 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

netstat日志
活动的Internet连接(仅服务器)
Proto Recv-Q Send-Q本地地址外部地址状态PID /程序名称
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 504/3代理
tcp 0 0 0.0.0.0:22 0.0.0.0:*监听338 / sshd
tcp 0 0 0.0.0.0lla128 0.0.0.0:*监听504/3代理
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代理)和FoxyProxy附加组件用于具有身份验证的socks5。

root@debian9:/home/joke/proxy# reboot

4.19。 重新启动后检查代理后,您可以看到日志。 这样就完成了代理设置。

3个代理日志
1542573996.018 PROXY.8080 00000测试仪192.168.23.10:50915 217.12.15.54ced43 1193 6939 0 CONNECT_ads.yahoo.com:443_HTTP/1.1
1542574289.634 SOCK5.3128 00000测试仪192.168.23.10/101193 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 lo inet回送

#主网络接口
allow-hotplug enp0s3
iface enp0s3 inet dhcp

#辅助网络接口
allow-hotplug 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 <UP,广播,运行,多播> mtu 1500
inet 192.168.23.11网络掩码255.255.255.0广播192.168.23.255
inet6 fe80 :: a00:27ff:fec2:bae4 prefixlen 64 scopeid 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 <UP,广播,运行,多播> mtu 1500
inet 192.168.201.254网络掩码255.255.255.0广播192.168.201.255
inet6 fe80 :: a00:27ff:fe79:a7e3 prefixlen 64 scopeid 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

lo:标志= 73 <UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1网络掩码255.0.0.0
inet6 :: 1 prefixlen 128 scopeid 0x10循环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的示例配置
守护程序
pidfile / home /笑话/proxy/3proxy.pid
nserver 8.8.8.8
nscache 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
齐平
认证iponly
dnspr
允许*
父级1000袜子5 IP_EXTERNAL_PROXY 3128测试仪1234
插件/opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so transparent_plugin
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


netstat日志
活动的Internet连接(仅服务器)
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/3代理
tcp6 0 0 ::: 22 ::: *监听349 / sshd
udp 0 0 0.0.0.0:53 0.0.0.0:* 354/3代理
udp 0 0 0.0.0.0:68 0.0.0.0:* 367 / dhclient

7.现在,代理已准备好接受端口888上的任何TCP连接,端口53上的DNS,以便可以将它们重定向到远程socks5-Google代理和DNS 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
#dhcpd.conf

#ISC dhcpd的示例配置文件


#所有支持的网络通用的选项定义...
选项域名“ example.org”;
选项域名服务器ns1.example.org,ns2.example.org;

默认租赁时间600;
最大租赁时间7200;

ddns-update-style none;

#如果此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


netstat日志
活动的Internet连接(仅服务器)
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/3代理
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/3代理
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。

注意:如果我们有Web代理,那么您需要编写connect而不是socks5,如果是socks4,则需要编写connect(socks4不支持登录/密码授权!)

透明代理服务器配置示例#2
守护程序
pidfile / home /笑话/proxy/3proxy.pid
nserver 8.8.8.8
nscache 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
齐平
认证iponly
dnspr
允许*

父200袜子5 IP_EXT_EXT_PROXY#1 3128测试仪1234
父200袜子5 IP_EXT_EXT_PROXY#2 3128测试仪1234
父200袜子5 IP_EXT_EXT_PROXY#3 3128测试仪1234
父200袜子5 IP_EXT_EXT_PROXY#4 3128测试仪1234
父100袜子5 IP_EXT_EXT_PROXY#5 3128测试仪1234
父100袜子5 IP_EXT_EXT_PROXY#6 3128测试仪1234

插件/opt/proxy/3proxy-0.8.12/src/TransparentPlugin.ld.so transparent_plugin
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/aggregate并在此处复制我们的列表。 结果是-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 lo inet回送

#主网络接口
allow-hotplug enp0s3
iface enp0s3 inet静态
地址192.168.23.2
网络掩码255.255.255.0
网关192.168.23.254

#辅助网络接口
allow-hotplug 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.来源3.proxy的安装说明, 网址www.ekzorchik.ru/2015/02/how-to-take-your-socks-proxy

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

Source: https://habr.com/ru/post/zh-CN460469/


All Articles