使用 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/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/*

#回環網絡接口
汽車LO
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中#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/*

#回環網絡接口
汽車LO
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

來源: www.habr.com

添加評論