SSH隧道动态转发端口实现SOCKS代理 + HTTP代理(Privoxy)
一、文章概要
实现效果:ssh连接远程服务器进行网络转发,本地服务连接网络代理环境:windows11/10需要工具:MobaXterm(ssh隧道端口转发),Privoxy(socks转http代理),一个云服务器
二、步骤
1. 用SSH从本地计算机连接远程主机
多种方法选一种即可:
命令行:ssh -C -N -D LOCAL_ADDRESS:LOCAL_PORT USER@REMOTE_ADDRESSPutty客户端MobaXteam中的MobaSSHTunnel
MobaSSHTunnel
2. Privoxy安装和配置
1. 官网下载压缩包版本 http://www.privoxy.org/
2. 修改配置文件:
通过listen-address指定HTTP代理的监听地址和端口。默认privoxy的配置文件会带有这一项。
其格式为:listen-address [ADDRESS]:[PORT]
默认值是:listen-address 127.0.0.1:8118
通过forward-socks5指定转发到socks代理
默认privoxy的配置文件不会配置这一项。
forward-socks5支持的格式比较复杂,但是这里只需要简单的写成如下内容就可以了:
forward-socks5 / [SOCKS_ADDRESS]:[SOCKS_PORT] .
其中“/”所在的位置是一个URL模式,与之匹配的URL都会转发到这个项目指定的socks代理。“/”这个值表示把所有请求都转发到socks5代理上去
例如:forward-socks5 / 127.0.0.1:9150 .
!注意:
listen-address指定http代理监听地址只允许本地访问该端口,允许局域网(LAN)访问需要设置为:listen-address 0.0.0.0:8118
三、测试与使用
1. 浏览器
Chrome + Switchyomega:支持socks5代理
2. 命令行(Powershell)
curl -Uri www.google.com -proxy http://127.0.0.1:8118
windows中的curl命令其实是包装的Invoke-WebRequest
3. python
使用urllib3库进行测试
http代理测试代码:
import urllib3
import json
proxy_addr = 'http://127.0.0.1:8118'
print(f'代理地址:{proxy_addr}')
proxy = urllib3.ProxyManager(proxy_addr)
resp = proxy.request('GET', 'https://httpbin.org/ip')
print(resp.data.decode('utf-8'))
socks代理测试代码:
from urllib3.contrib.socks import SOCKSProxyManager
import json
proxy_addr = 'socks5://127.0.0.1:80'
print(f'SOCKS5代理地址:{proxy_addr}')
proxy = SOCKSProxyManager(proxy_addr)
resp = proxy.request('GET', 'https://httpbin.org/ip')
print(resp.data.decode('utf-8'))
url = 'https://www.google.com'
resp = proxy.request('GET', url)
print(f'返回状态码:{resp.status}')
四、遇到的坑
1. ping不通但是浏览器能连上?
简言之,就是ping走的是ICMP协议,在网络层(第三层),而ssr用的是socks代理是传输层 (第四层),上层协议无法对下层协议起作用,因此ping不通,但是通过http(超文本传输协议,应用层协议,在比socks代理层数更高)却可以访问。
大部分都不支持socks代理,而支持http代理
2. ssh隧道开启socks代理,其他代理隧道开启什么代理?
HTTPS代理隧道开启https、WebSocket隧道开启ws、ICMP隧道
References
建立和使用代理服务器 -doc文档
Privoxy教程使用详解_privoxy是什么东西_ZhaoYingChao88的博客-CSDN博客