Skip to content

REDSOCKS2使用说明

Hao Hu edited this page May 4, 2020 · 21 revisions

什么是REDSOCKS2

REDSOCKS2是基于原版REDSOCKS做大量改进而成的智能透明代理软件。为区别于原版REDSOCKS,特改名为REDSOCKS2。 REDSOCKS2修复了原REDSOCKS中的若干严重错误,在几乎兼容原REDSOCKS的全部功能(除dnstc)的同时,还向您提供以下功能:

  • 智能代理(autoproxy)功能,无需黑白名单即可自动将且仅将到无法直接正常连接的网站或目标的连接通过代理转发。
  • TCPDNS功能,将基于UDP的DNS请求通过TCP连接透明转发,达到防止DNS污染的目的。
  • 内置shadowsocks代理支持。
  • 改进的REDUDP功能,允许你通过shadowsocks UDP转发解决DNS污染问题。
  • direct代理,不通过代理中转的透明转发功能。
  • 将TCP连接透明转发到指定的网络接口。

关于捐助开发

欢迎你直接贡献代码。

智能代理(autoproxy)功能介绍

当智能代理功能关闭时,REDSOCKS2会将所有通过iptables等方式重定向到REDSOCKS监听端口的TCP连接通过指定的代理进行中转。
当智能代理功能打开时(REDSOCKS部分的autoproxy属性值不为0),在REDSOCKS2的监听端口接收到通过iptables等方式重定过来的TCP连接时,会首先尝试不通过代理而是直接将这些连接进行中转。当直接中转发生错误或连接超时,REDSOCKS2才会再次将这些遇到问题的连接通过指定代理中转。为了到提高连接超时目标的中转速度,REDSOCKS2内部有cache,会根据内部的一些规则和机制将到这些目标的连接直接通过指定代理进行中转而不尝试直接连接。简单来说就是:能直接连接的直接连接,直接连接走不通的就走代理。
利用智能代理可以有效提高正常网站的访问速度,无障碍地访问特殊网站,有效减少代理流量使用。 由于正常流量都不通过代理,一定程度上提高了安全性,减少了流量爆漏在代理服务器的风险。 注意:使用智能代理功能之前应该确保你的DNS系统未被污染! 可以利用REDSOCKS2解决DNS污染问题。

应用场景与配置

基本配置与使用

要运行REDSOCKS2请先为它准备一份配置文件。该配置文件的详细格式及内容请参考redsocks.conf.example.
REDSOCKS2的配置文件要求必须包含base部分。在后续章节中将不再重复出现该部分,请在配置时注意将该部分内容写入配置文件。

base {
  log_debug = off; 
  log_info = on;
  daemon = on;
  redirector= iptables;
}

主要参数:

  • log_debug - on/off 打开或关闭调试信息
  • log_info - on/off 打开或关闭基本信息
  • daemon - on/off 是否使用daemon模式运行
  • redirector - iptables/pf/ipf/generic 重定向器,Linux下请使用iptables

智能代理(autoproxy)

相关配置部分说明如下。

redsocks {
 bind = 192.168.1.1:1081;
 relay = 192.168.1.1:9050;
 type = socks5;
 timeout = 12;
 autoproxy = 1;
 //login = "username";
 //password = "password";
}

主要参数:

  • bind - 用于接受重定向连接的本地IP、端口,应该与你要转发的网段的IP在同一网段(或包含)
  • relay - 代理服务器的IP/域名、端口
  • type - socks4/socks5/http-connect/http-relay/direct/shadowsocks 代理服务器的类型
  • timeout - 超时值。在智能代理打开时,当尝试直接连接到目标IP的时候,如果连接超时,则认为此IP不可达,需要通过代理中转。在智能代理关闭时,此超时值仅适用于到代理服务器的连接建立,如超时则连接被关闭,不再做任何尝试。此值不建议设置过小,设置过小将导致正常网站因偶尔的连接速度变慢而被加入屏蔽网络缓存,进而使后续到这些网站的访问需要通过代理。 当然,如果你的代理又快又稳定,设置小一点也没有问题。
  • autoproxy - 0/1。当此值为0时,表示关闭智能代理。当此值不为0时,表示智能代理开启。
  • login - 当代理服务器需要认证时,指定代理服务器的用户名。当代理类型为shadowsocks时,此值被用于指定代理的加密方式。
  • password - 当代理服务器需要认证时,指定代理服务器的密码。

下面的autoproxy部分用于调整智能代理的工作细节,可选。

autoproxy {
 no_quick_check_seconds = 300;
 quick_connect_timeout = 2;
}

主要参数:

  • no_quick_check_seconds - 整数。智能代理在决定如何中转TCP连接时,如果发现目标IP是在此设置值时间内加入到屏蔽IP缓存中时,就不尝试直接连接目标IP,而是直接通过代理进行中转。此值为0时,表示当目标IP存在于缓存时,不尝试直接连接,而是直接转向代理。
  • quick_connect_timeout - 整数。智能代理在决定如何中转TCP连接时,如果发现目标IP在屏蔽IP缓存中时,会首先尝试不通过代理直接连接目标IP,如果在此设置值的时间内连接都没有建立,那么就认为目标IP仍然处理被屏蔽状态,随后便会将连接通过代理中转出去。

ipcache部分用于调整智能代理的屏蔽IP缓存机制细节,可选。

ipcache {
 cache_size = 4;
 cache_file = "/tmp/ipcache.txt";
 stale_time = 7200;
 autosave_interval = 3600;
 port_check = 1;
}

主要参数:

  • cache_size - 整数。控制IP缓存的大小,单位是1K。默认傎是4,即可以缓存4K个IP项。
  • cache_file - 缓存文件路径。如果你希望智能代理的缓存内容可以保存下来并在下次运行时自动载入的话,你可以指定一个文件用于存储和读取缓存内容。内容是纯文本,每行一个IP:port。
  • stale_time - 整数。从一个IP被加入缓存时或从上次被判定为被屏蔽IP时开始,如果时间达到此设置值,则将此IP从缓存中清除。减小此值有利于快速恢复个别IP因偶然被误判或短时间服务中断而被加入缓存的服务。增加此值有利于加入到被屏蔽IP的访问。
  • autosave_interval - 整数。自动保存缓存内容到文件的周期,0 表示不自动保存。不应该设置太小,频繁写入文件会影响正常转发的效率与响应速度。
  • port_check - 0/1。 当目标IP与缓存中项的IP相同端口不同时,是否认为是相同的目标。0表示不区分端口,1表示区分端口。

应用示例

我用TOR做代理,速度慢,不稳定

redsocks {
 bind = 192.168.1.1:1081;
 relay = 192.168.1.1:9050;
 type = socks5;
 timeout = 12; // 尽量保证正常连接不被误判
 autoproxy = 1;
}
redsocks {
 bind = 192.168.1.1:1082;
 relay = 192.168.1.1:9050;
 type = socks5;
 autoproxy = 0; //这个不开智能代理,用于将特殊流量直接导向代理。如果你的代理本来就支持透明代理,那就不用这样麻烦了,直接在iptables里把这种流量导向代理的端口就行了。
}
autoproxy {
 no_quick_check_seconds = 20;
 quick_connect_timeout = 2;
}
ipcache {
 cache_file = "/tmp/ipcache.txt";
 stale_time = 900;
 autosave_interval = 3600;
 port_check = 1;
}

我用shadowsocks做代理,又快又稳定,IP偶尔因误判走代理也不是问题

 redsocks {
  bind = 192.168.1.1:1081;
  relay = 123.123.123.123:8388; // shadowsocks代理的IP
  type = shadowsocks;
  timeout = 6; // 误判关系不大,我代理速度快
  autoproxy = 1;
  login = "rc4-md5"; // 换换加密方法吧
  password = "my.pwd123-";
 }
 autoproxy {
  no_quick_check_seconds = 0; // 别检查了,如果认为被屏蔽了就直接走代理吧
 }
 ipcache {
  cache_file = "/tmp/ipcache.txt";
  stale_time = 7200; // IP加进缓存两个小时内就别想出来了
  autosave_interval = 3600;// 如果设置为0,不自动保存的话,就相当于一个黑名单功能。  
  port_check = 1;
 }

shadowsocks代理

REDSOCKS2内置shadowsocks代理客户端,进行透明代理时不再需要其它shadowsocks软件配合。该功能与socks5等代理一样,可以和智能代理配合使用。目前仅支持IPv4的shadowsocks代理。使用方法参考前面智能代理部分的示例。 当与OpenSSL一起编译时,支持如下加密方式:

table
rc4
rc4-md5
aes-128-cfb
aes-192-cfb
aes-256-cfb
bf-cfb
camellia-128-cfb
camellia-192-cfb
camellia-256-cfb
cast5-cfb
des-cfb
idea-cfb
rc2-cfb
seed-cfb

当与PolarSSL一起编译时,支持如下加密方式:

table
ARC4-128
AES-128-CFB128
AES-192-CFB128
AES-256-CFB128
BLOWFISH-CFB64
CAMELLIA-128-CFB128
CAMELLIA-192-CFB128
CAMELLIA-256-CFB128

由于salsa20和chacha20两种加密方式需要在中转过程中进行内存复制,使用这些加密方法所提升的有限效率会被内存复制所消耗,所以对这两种加密方式的支持意义不大,暂时不考虑支持。

direct代理

这其实不是一种代理,但是该功能是以与其它代理相同的方式提供的,其目的是将连接不经过任何代理直接中转出去或者通过指定接口(比如:VPN接口)中转出去。这个功能看似没有多大用,但有时候真的很有用。

应用示例

直接中转
我的ISP不允许多台电脑共享上网,但经过REDSOCKS2中转后就可以共享了。目前仅在我使用的移动宽带上有效(且需要用iptables设置outgoing packets的TTL为64),其它ISP未经验证。

redsocks {
 bind = 192.168.1.1:1088;
 type = direct;
 timeout = 20;
}

仅将到被屏蔽目标的连接通过VPN中转

redsocks {
 bind = 192.168.1.1:1088;
 interface = tun0; // 我的VPN的接口
 type = direct;
 autoproxy = 1; // 启用智能代理。仅Blocked Traffic会通过VPN接口中转。
 timeout = 8;   // 我的VPN速度不错,误判问题不大。
}

https代理

尚未实现

利用shadowsocks代理解决DNS污染

REDSOCKS2内置了shadowsocks UDP的支持。如果你的shadowsocks服务器延时比较低的话,你完全可以利用REDSOCKS2解决DNS污染。此功能需要shadowsocks server打开UDP转发功能。

应用示例

将UDP DNS请求通过shadowsocks转发

redudp {
 bind = 127.0.0.1:1053;
 relay = your.ss-server.com:443;
 type = shadowsocks;
 login = rc4-md5;
 password = "ss server password";
 dest = 8.8.8.8:53;
 udp_timeout = 3;
}

利用tcpdns解决DNS污染

REDSOCKS2内置了将UDP的DNS请求通过TCP连接转发的功能。如果你有比较好的支持TCP DNS请求的DNS服务器的话,那么这个功能会很有用。

应用示例

将UDP DNS请求通过TCP转发

tcpdns {
 bind = 192.168.1.1:1053; // Local server to act as DNS server
 tcpdns1 = 8.8.4.4;      // DNS server that supports TCP DNS requests
 tcpdns2 = 8.8.8.8;      // DNS server that supports TCP DNS requests
 timeout = 4;            // Timeout value for TCP DNS requests
}

如果你愿意的话,你还可以再用iptables将到8.8.8.8:53和8.8.4.4:53的TCP连接重定向到一个透明代理监听端口上,以实现和DNS2SOCKS相同的功能且不受限于socks代理类型,任何支持TCP连接的代理都可以。

UDP透明代理

REDSOCKS2也支持基于TPROXY的UDP透明代理。此功能除可用于解决DNS污染外,还可用于多种用途,比如VPN。此功能需要TPROXY内核模块和iptables TPROXY用户模块的配合。所以使用前请确保你的系统已经正确安装TPROXY相关模块。如果你使用openwrt的话,你需要安装以下两个软件包:

kmod-ipt-tproxy
iptables-mod-tproxy

应用示例

将到任意UDP端口的UDP包进行透明代理(取决于你通过iptables将哪些UDP包转发到此UDP监听端口)

redudp {
 bind = 192.168.1.1:3000; // Local server to receive redirected UDP packets
 relay = your.ss-server.com:443; // 支持UDP转发的shadowsocks代理服务器
 type = shadowsocks;
 login = rc4-md5;
 password = "ss server password";
 udp_timeout = 4;
 // 要使用TPROXY,一定不要指定dest_ip和dest_port
}

iptables的配置

iptables的配置相对比较复杂,也是最容易出问题的地方。大多数配置透明代理失败都是因为在这里出了错。 请仔细阅读原redsocks中关于iptables的说明特别注意,在给路由器配置透明代理时,'bind'的ip地址一定不要设置成127.0.0.1,也不推荐设置成0.0.0.0。 最好是像192.168.1.1这样的。