关闭

Ubuntu编译运行ss-redir打造透明代理Wifi环境

标签: iptables路由器ubuntuopenwrt
13346人阅读 评论(21) 收藏 举报

研究了一阵子的Openwrt路由器,主要是让影s梭s作为一个服务跑在openwrt路由器上,然后该路由器就实现了透明代理功能,连入该路由器Wifi的设备都实现了代理,达到了科学上网的效果。后来又一想,既然Openwrt可以,那Ubuntu应该也没啥问题,于是着手开始研究。

首先Openwrt用的ss是libev的版本,也就是c语言直接编译过来的版本,其源代码可以从这里(https://github.com/ss/ss-libev)下载到。libev版本包含ss-server,ss-local,ss-redir,ss-tunnel,其中ss-redir是做透明代理用的服务程序,需要配合iptables使用。但是,网上多数的Ubuntu+ss文章都是介绍的python版本和ss linux版本,而这两个版本都是只有ss-server和ss-local 两个服务,ss-local只能开放一个代理端口,然后让浏览器使用类似swichysharp类似的软件设置代理,这样的方式虽然安装容易但是只能让浏览器走代理,不能实现全局的透明代理。


针对python版的ss-local客户端,可以使用redsocks进行透明代理,这种方法在我之前的一篇博客《WiFi热点分享ss流量实现全局透明代理》中写过

不过这种方式有几个弊端

1、redsocks服务只能代理tcp流量,不能代理udp流量

2、redsocks有bug,不能关闭已建立的连接,一旦超越linux的最大限制,就会报“Too many open files”异常,导致服务瘫痪,需要每隔一段时间进行重启
3、在我的使用还发现这种方式经常会让NetworkManager对无线网卡的管理崩溃,导致搜索不到wifi信号,需要经常重启NetworkManager

4、图形界面版的ss-qt5有bug,在连接数多的时候会崩溃掉

所以我们要安装ss-libev这个库并开启ss-redir服务进行全局代理

这样做的好处有很多

1、ss-libev版占用内存比python版更小,在30块钱路由器上都能跑很溜的程序在Ubuntu上肯定没什么问题

2、可以随时下载最新源码编译最新的软件包,比如在Ubuntu16.04上,直接使用apt-get install ss 安装的版本很旧,连rc4-md5的加密都不支持

3、无需借助其他第三方程序如redsocks,大大提高了系统稳定性

4、deb包安装完成后会自动加入环境变量,而python版是没有环境变量的


好了进入正题,如何安装部署ss-libev版呢

作为一名Ubuntu用户,首先我们可以登录ss的github的官网去下载相关c源代码,然后编译成deb包,因为创造ss的大神 clowwindy已经退隐江湖,所以我们可以从还在更新着的其他人的分支上去clone,比如这个https://github.com/madeye/shadowsocks-libev

当然目前我已经把Ubuntu常见的版本已经编译出来了,大家可以直接下载使用(在多台电脑上亲测可用)\

V2.5.5版(稳定版)

14.04及以上系统下载连接 http://download.csdn.net/detail/lvshaorong/9721087

16.04及以上版本下载地址:http://download.csdn.net/detail/lvshaorong/9662213


V3.0.3版(2017.03 最新版)

16.04及以上版本下载地址:http://download.csdn.net/detail/lvshaorong/9773002


使用dpkg命令可以直接安装该deb包

sudo dpkg -i ./ss-libev_2.5.5-1_amd64.deb


安装完成之后可以使用ss-redir -h命令来检查是否安装成功


然后我们需要写一个文本文件,里面是个json字符串,写明服务器地址,密码,监听端口等信息,如下


注意这里的“local_address”一定要填写0.0.0.0,默认是127.0.0.1,但是默认是无法使用iptables进行端口转发的,所以要设置为0.0.0.0,其他的内网地址也不行,比如192.168.1.81,我试过

配置好用户名密码之后就可以开启ss服务了,方法很简单

sudo ss-redir -c <上面json配置文件路径> -v -u
上面的-v是指开启罗嗦模式,也就是把端口转发情况全部打印出来,方便我们调试错误

-u 是指开启udp转发,如果你的服务器支持那么推荐开启

如果出现如下报错


那说明json中配置的1081端口已经被别的程序占用了,这时我们可以通过netstat -ntl检查端口占用情况,然后选一个没有被占用过的端口


下面是最重要的一步,开启iptables端口转发,其作用就是将无线网卡收集到的数据包转发给ss走代理,所以要写一点iptables路由规则,如下

iptables -t nat -A PREROUTING -d 127.0.0.0/24 -j RETURN
iptables -t nat -A PREROUTING -d 192.168.0.0/16 -j RETURN
iptables -t nat -A PREROUTING -d 10.42.0.0/16 -j RETURN
iptables -t nat -A PREROUTING -d 0.0.0.0/8 -j RETURN
iptables -t nat -A PREROUTING -d 10.0.0.0/8 -j RETURN
iptables -t nat -A PREROUTING -d 172.16.0.0/12 -j RETURN
iptables -t nat -A PREROUTING -d 224.0.0.0/4 -j RETURN
iptables -t nat -A PREROUTING -d 240.0.0.0/4 -j RETURN
iptables -t nat -A PREROUTING -d 169.254.0.0/16 -j RETURN

iptables -t nat -A PREROUTING -p tcp -s 10.42.0.0/16 -j REDIRECT --to-ports 1081

其中修改的是PREROUTING表,这样只会对Wifi网卡的流量起作用,而不会对本机起作用,如果想让本机起作用,可以把相同的规则加上server的ip return加到OUTPUT表上

上面的10.42.0.0/16是Ubuntu系统分享wifi后,wifi子网连入设备的IP地址,上面最后一句话的意思就是把所有来自Wifi的数据包都发送到ss-redir的监听端口1081去

可以用

sudo iptables -t nat -L -n
来检查iptables路由规则,正确的情况应该如下图


另外,ss-redir还支持udp转发,方法是在上面路由规则上再加一句

iptables -t nat -A PREROUTING -p udp -s 10.42.0.0/16 -j REDIRECT --to-ports 1081

在开启了UDP转发之后,Shdowsocks就彻底可以当VPN使用了,因为全部的流量都已经得到转发,这在python版里是实现不了的。


这里要注意一下,使用如上配置之后是可以将TCP流量代理到SS服务器的,但是有些网站如Facebook,google还是打不开,原因是DNS目前仍然从本机发出,使用UDP协议且不经过代理,所以对于这些网站会被DNS投毒解析到一个错误的IP,访问这个错误的服务器当然不会成功,所以下一步我们要解决DNS的问题

此时需要使用Pdnsd或者ss-tunnel服务,用来防止DNS污染

然后修改修改系统默认的DNS服务器地址为上面我们开启的pdnsd或ss-tunnel的监听地址

sudo nano /etc/resolv.conf


这一步的详情请参考我之前写的两边DNS文章《Ubuntu16.04用Pdnsd替换dnsmasq防止DNS污染》《一分钟快速搭建Windows防污染DNS服务器——Pcap_DNSProxy》搭建自己的DNS服务器

好了,现在可以开启wifi功能让手机连入,然后开心的fan wall了,Ubuntu16.04开启Wifi分享功能网上说的很多,我这里就不浪费篇幅了

http://jingyan.baidu.com/article/363872ecd8f35d6e4ba16f97.html

附图:通过netstat命令检查ss是否正在运行



关于编译:

编译ss-libev库其实很简单,根据github上的说明两行代码就可以搞定,记得要执行apt-get update就好

git clone https://github.com/shadowsocks/shadowsocks-libev.git
sudo apt-get update
cd shadowsocks-libev
sudo apt-get install --no-install-recommends build-essential autoconf libtool libssl-dev \
    gawk debhelper dh-systemd init-system-helpers pkg-config asciidoc xmlto apg libpcre3-dev
dpkg-buildpackage -b -us -uc -i
cd ..
sudo dpkg -i shadowsocks-libev*.deb


0
0
查看评论

iptables+tproxy实现ss-redir的UDP转发的方法

在OpenWrt路由器上配置Shadowsocks实现Socks5代理,使用ss-redir做透明代理转发tcp流量很简单,只需在NAT 表的PREROUTING链中加一句端口转发就可以了,但是SS相对于SSH很大的一个优点是支持UDP的流量的转发,而且UDP转发的功能在很多情境下是非常有用的,比如...
  • lvshaorong
  • lvshaorong
  • 2016-11-17 18:42
  • 12939

分享一个用树莓派+SS+ChinaDNS+bandwagon 做网关的帖子

这个方案合适有树莓派硬体、不想在路由器做更改的朋友,这是一个网内全部都可以翻,也会根据访问目的IP(国内和非国内进行路由,不会全部数据走SS),当然如果有更好的方案或者错误请指出。 准备工作: 1:raspberry B+ (推荐B+,这个版本相对B有很大进步,具体就不说了自己google下),这...
  • lostgdi
  • lostgdi
  • 2015-01-12 16:00
  • 13731

spicy client usbredir 参数说明

-spice-usbredir-auto-redirect-filter
  • lipei1220
  • lipei1220
  • 2016-10-19 14:48
  • 741

Java面试题全集(上)

2013年年底的时候,我看到了网上流传的一个叫做《Java面试题大全》的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对这个所谓的《Java面试大全》进行了全面的修订并重新发布在我的CSDN博客。
  • jackfrued
  • jackfrued
  • 2015-04-08 17:14
  • 669391

用Ubuntu架设透明的Squid代理服务器

Squid是全功能的HTTP/1.0代理服务器,也近乎完整的兼容HTTP/1.1。Squid提供丰富的访问控制、认证和日志环境用以网站代理服务器和内容服务应用。 本文简单介绍了如何架设一台透明Squid代理服务器。Squid可用于HTTP,HTTPS,FTP等网站的缓存代理服务器。它能通过缓存和重...
  • s464036801
  • s464036801
  • 2012-11-02 18:41
  • 1129

Ubuntu 14.04 ss-libev deb安装包

  • 2016-12-26 10:39
  • 220KB
  • 下载

路由器级联方式(二级路由为例)

这两天由于路由器出了点问题导致网络连接一直不顺畅。出现的问题是二级路由只能一台电脑连上。其他设备无法连上二级路由。 对于之前路由器级联的认知水平仅仅是将一级路由的WAN口连接二级路由的LAN口,二级路由就可以正常工作了,但是为什么是这样的呢?不知道,所以现在出了问题就不知道如何解决。 路由器...
  • u010302764
  • u010302764
  • 2014-08-17 11:58
  • 8146

交叉编译ss-redir

本文适合有一定linux基础的人阅读,不会写的非常细,主要是编译时踩过的一些坑。 ss-redir透明代理介绍ss-redir与一般shadowsocks客户端不同,ss-redir运行于linux环境下,一般搭建在路由器上,与iptables配合使用,可以使所有连接到该路由器上的设备自动通过ss代...
  • he012821397
  • he012821397
  • 2017-12-04 10:44
  • 62

WiFi热点分享S-S流量实现全局透明代理

平时使用SS或SSH做代理的时候,独乐乐不如众乐乐,如何把我连上ss的电脑做成热点,通过wifi分享给周围其他的人呢?又如何将ss变成一个全局的代理,而不仅仅限于浏览器和少数几个支持代理的软件呢?将一台Ubuntu电脑打造成一台WIFI路由器,经过该路由器的流量全部转发给ss,让需要全局科学上网的设...
  • lvshaorong
  • lvshaorong
  • 2016-09-12 09:06
  • 7869

ss-libev 源码解析udp篇 (3)

本篇分析server_recv_cb,这个是udp转发中最重要的函数。server_recv_cb: 当ss-local或ss-server接收到来自前端的udp数据包时调用。这个函数代码比较多,除了local和remote(即ss-server),还有redir, tunnel,android的代...
  • n5
  • n5
  • 2017-06-23 18:19
  • 939
    个人资料
    • 访问:565814次
    • 积分:6079
    • 等级:
    • 排名:第4934名
    • 原创:150篇
    • 转载:0篇
    • 译文:1篇
    • 评论:216条
    最新评论