Nginx转发Socts5

代理服务原理

代理服务器有很多种,大体来说有http,ftp,socks代理三种,其中又分透明代理和不透明代理。其中透明代理一般是网关,是硬件。所以这里讨论不透明代理。

当机器通过代理服务器上网时。通讯是分两次的,先是机器和代理服务器通讯,再是代理服务器和目的地址通讯。

  • 机器和代理服务器通讯时,目的IP是代理服务器的IP。
  • 代理服务器和目的地址通讯时,源IP是代理服务器的IP。

HTTP代理过程

用http代理上网的过程如下:

  1. 机器和代理服务器建立TCP连接。

  2. 机器发出GET命令给代理服务器(这时GET命令中包含URL或IP地址,数据是明文)。

  3. 代理服务器将其中的URL转换为IP地址,可能会有DNS。将源数据包中的数据拷贝下来。去掉URL,重新组包,再发出去。

代理方式对比

http (get)
http (connect)
ftp (user user@host:port)
ftp (user user@host port)
ftp (open host)
ftp (site host)
ftp (site user@host)
socks5
socks4

这些代理方式都有一个特点:在连接时,都会先和代理服务器连接,发出请求,一般为 command url,command就是get,connect,user 等。http和ftp都一样,可以通过关键字来识别。而且url是明文。Socks有些特别。它不是明文的,而是十六进制数据。要获得IP地址,还要经过转换。

Nginx代理Socts5

Nginx版本 >= 1.13,但是并不会默认安装,需要在编译时通过指定 –with-stream 参数来激活这个模块。

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
user  root;
# 处理请求的进程数量,CPU核心数量决定
worker_processes 1;

error_log /var/log/nginx/error.log;

events {
worker_connections 1024;
}

stream {
upstream backend {
hash $remote_addr consistent;
server 转发IP:PORT max_fails=3 fail_timeout=30s;
}

server {
listen 0.0.0.0:8000;
proxy_connect_timeout 30s;
proxy_timeout 30s;
proxy_pass backend;
}
}

Dockerfile

1
2
FROM nginx
COPY ./nginx.conf /etc/nginx/nginx.conf

运行Docker

1
docker run --name nginx_proxy -d --rm -p 8000:8000 image:nginx