Monthly Archives: February 2016

小记socks over stunnel以及msmtp的代理错误

在之前一篇文章”OpenVPN over stunnel配合dnsmasq+dnscrypt实现最佳上网体验“,把OpenVPN流量塞到了stunnel里,但有的时候我只需要一个socks代理,不需要全局VPN,比如浏览器的代理,收发gmail的代理(见”走SOCKS代理收发gmail邮件“)等等。虽然以前用ssh tunnel就能搞定,但现在ssh tunnel已经不稳定了,经常会无响应,所以需要再找一个方法。

之前折腾stunnel的时候搜索到了3proxy这个包,是一个类似squid的代理程序,不过代理的是socks。问题在于配置用户认证等等还是挺麻烦的,尤其是已经折腾完stunnel之后,再折腾用户认证就显得不必要了,因为stunnel需要证书,也就完成了用户认证这一步(自己简单使用的情况下)。更重要的是,3proxy包中还有一个叫做“socks”的程序,用来实现一个SOCKS网关,如果能把流量导入这个网关也就完成了一个不带认证的socks代理。接下来就很自然的想到把socks放入stunnel了。

socks的使用非常简单,用下边的命令就开启了一个只监听本地地址的socks网关,需要注意的是选项和参数之间不能有空格

socks -ilocalhost -p8888 -d
# -i: internal address
# -p: port number
# -d: daemonize

在VPS上运行一下就好了。这里用 -ilocalhost 是只监听本地地址,不对外提供服务,因为本身没有用户认证功能,需要用stunnel把流量转给本地的socks。

接下来配置stunnel。在VPS上配置stunnel服务端

# cat /etc/stunnel/stunnel.conf
debug = 3

; global settings
fips = no
pid =
;compression = zlib

; performance
socket = l:TCP_NODELAY=1

cert = /path/to/stunnel.pem
CAfile = /path/to/st-client.pem
verify = 3

[socks]
accept = 8887
connect = localhost:8888

accept表示监听8887端口接受外来请求,connect表示把接收到的请求转发给本地的8888端口,也就是刚刚起来的socks网关。关于stunnel key的设置可以看我之前的文章(其实也是引用的别人的文章……)。

然后在本机配置stunnel

# cat /etc/stunnel/stunnel
; debug
;foreground = yes
debug = 3

; global settings
fips = no
;compression = zlib
pid =

; performance
socket = l:TCP_NODELAY=1

; auth
cert = /path/to/st-client.pem

[socks]
client = yes
accept = 8888
connect = your.vps.ip:8887

基本上就是多了一个client = yes,说明这是client,监听本地8888端口并转发到VPS的8887端口。

到此就在本机上起了一个socks代理,地址就是 localhost:8888。配合浏览器的代理插件等使用效果更佳:)

不过我在用msmtp代理的时候遇到了问题,邮件怎么也发不出去,一直报错 “proxy failure: unknown error”。搜索了很久也没找到原因,后来clone了msmtp的代码来看,从git log里发现了 1.6.3 版本上有一个commit来修复socks相关的bug(091b31f SOCKS5: do not clobber the status byte reported by the server.),然后看了下Fedora 23自带的msmtp版本是 1.6.2,就自己编译了最新的代码试试。结果证明,果然就是这个bug引起的问题。这个问题困扰我好久了,导致我想发邮件还得起个ssh tunnel,因为不稳定还得赶紧发,发完就关掉。今天终于把这个问题解决了!

Monthly Pic 2016 01

IMG_20160125_164843
尝试了一把天猫超市买菜,有点儿贵,送货第三天才到的,好处就是不用去超市瞎逛不知道买什么,然后还排队称重了。结果没吃完,茄子都坏了……