Linux下 redsocks + iptables + socks5 实现全局代理

目录

redsocks

首先安装redsocks并配置好socks5服务,将socket连接通过iptables重定向到redsocks监听的本地端口上时,redsocks能够实现透明代理

iptables

设置iptables,我们需要在nat表上新建一个链,命名为SSR
然后在SSR链上将所有TCP流量重定向到redsocks监听的本地端口上,并在OUTPUT链上将所有tcp流量跳转到SSR链上

sudo iptables -t nat -F    # 清空nat表规则
sudo iptables -t nat -N SSR    # 新建SSR链
sudo iptables -t nat -A SSR -j REDIRECT -p tcp --to-ports 12345 -m comment --comment 'redsocks全局SSR代理'
sudo iptables -t nat -A OUTPUT -j SSR -p tcp -m comment --comment '跳转到redsocks全局SSR代理'

现在我们来验证一下设置是否正确,如果可以telnet任何IP的任何端口就证明tcp流量被重定向到了redsocks程序,

kasumi@kasumi:~$ telnet google.com 80
Trying 172.217.24.14...
Connected to google.com.
Escape character is '^]'.
GET / HTTP/1.1
Host: google.com

^]
telnet> quit
Connection closed.

不过现在它不会返回我们任何数据,此时,系统内部发生了错误,因为发生了无限循环的重定向

kasumi@kasumi:~$ sudo service redsocks status
● redsocks.service - Redsocks transparent SOCKS proxy redirector
   Loaded: loaded (/lib/systemd/system/redsocks.service; enabled; vendor preset: enabled)
   Active: active (running) since 一 2019-11-11 12:08:52 CST; 2h 41min ago
  Process: 1210 ExecStart=/usr/sbin/redsocks -c ${CONFFILE} (code=exited, status=0/SUCCESS)
  Process: 1192 ExecStartPre=/usr/sbin/redsocks -t -c ${CONFFILE} (code=exited, status=0/SUCCESS)
 Main PID: 1213 (redsocks)
   CGroup: /system.slice/redsocks.service
           └─1213 /usr/sbin/redsocks -c /etc/redsocks.conf

11月 11 14:47:41 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 10797 ms: Too many open files
11月 11 14:47:52 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 21279 ms: Too many open files
11月 11 14:48:13 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 24326 ms: Too many open files
11月 11 14:48:38 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 26179 ms: Too many open files
11月 11 14:49:04 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 692 ms: Too many open files
11月 11 14:49:04 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 605 ms: Too many open files
11月 11 14:49:05 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 5462 ms: Too many open files
11月 11 14:49:10 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 15419 ms: Too many open files
11月 11 14:49:26 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 7611 ms: Too many open files
11月 11 14:49:34 kasumi redsocks[1213]: accept: out of file descriptors, backing off for 45675 ms: Too many open files

我们要做的就是放行局域网和socks5代理服务器IP,此处我们往OUTPUT链里设置,设置到SSR链也可以,不过最好用SSR链专门来设置白名单

Chain_SSR="OUTPUT"
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 0.0.0.0/8
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 10.0.0.0/8
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 100.64.0.0/10
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 127.0.0.0/8
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 169.254.0.0/16
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 172.16.0.0/12
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 192.168.0.0/16
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 198.18.0.0/15
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 224.0.0.0/4
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment '局域网放行' -d 240.0.0.0/4
sudo iptables -t nat -I $Chain_SSR -j RETURN -m comment --comment 'socks5代理服务器放行' -d 47.95.255.46

恭喜,现在可以全局了

设置白名单

release_domain="cip.cc"
sudo iptables -t nat -I SSR -j RETURN -m comment --comment '白名单域名:'"$release_domain" -d $release_domain

由于这个操作很频繁,所以我写了一行交互式的脚本

read -p 请输入要设置白名单的域名: release_domain && sudo iptables -t nat -I SSR -j RETURN -m comment --comment '白名单域名:'"$release_domain" -d $release_domain && sudo iptables -t nat -nvL --line-number

查看SSR链规则

kasumi@kasumi:~$ sudo iptables -t nat -nvL SSR --line-number
Chain SSR (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 RETURN     all  --  *      *       0.0.0.0/0            122.51.162.249       /* 白名单域名:cip.cc */
2      346 20760 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* redsocks全局SSR代理 */ redir ports 12345

添加 ssrstart ssrclose 等自定义命令

在.bashrc中添加alias别名,从而提供一键启用/关闭代理的命令

alias ssrclose="sudo iptables -t nat -j RETURN -m comment --comment 临时关闭代理 -I SSR"
alias ssrstart="sudo iptables -t nat -j RETURN -m comment --comment 临时关闭代理 -D SSR"
alias ssrstatus="sudo iptables -t nat -nvL SSR --line-number"

function ssradd() {
    read -p 请输入要设置白名单的域名: release_domain && sudo iptables -t nat -I SSR -j RETURN -m comment --comment '白名单域名:'"$release_domain" -d $release_domain && sudo iptables -t nat -nvL --line-number
}

socks5

使用国内服务器启用ssr client, 连接国外ssr server, 从而提供socks5服务

令iptables永久生效,及安装pdnsd以DNS污染的解决办法

  • 什么是pdnsd

p dns d -> Proxy DNS Daemon

安装pdnsd执行tcp查询,主要配置如下
官方文档

 62 server {
 63         label = "root-servers";
 64         root_server=on;
 65         ip = 8.8.8.8;
 66         timeout = 5;
 67         uptest = query;
 68         interval = 30m;      // Test every half hour.
 69         ping_timeout = 300;  // 30 seconds.
 70         purge_cache = off;
 71         exclude = .localdomain;
 72         policy = included;
 73         preset = off;
 74 }

启动本地DNS服务:

sudo pdnsd --tcp -mto -d

为了开机启动pdnsd,编辑 /etc/default/pdnsd 文件,修改下列行:

START_DAEMON=yes

接下来修改/etc/resolv.conf,将DNS改为127.0.0.1即可

见Github项目https://github.com/develon2015/mysocks5

END

posted @ 2019-11-10 16:28  develon  阅读(9445)  评论(0编辑  收藏  举报