这个是逗比根据地的备份镜像站(非官方)。牢记域名: [doubibackup.com]。搜索:标签云
投稿文章 | 广告合作 | Telegram 群组 / 公告频道 / 使用教程
广告

Shadowsocks利用 iptables 实现中继(中转/端口转发)加速

Shadowsocks Toyo 27评论
广告
本文最后更新于 2017年10月29日 11:07 可能会因为没有更新而失效。如已失效或需要修正,请留言!

上次写了一个HaProxy中转的教程,但是不支持UDP端口转发,没办法玩游戏之类的,所以这次写个iptables转发端口教程。


其他的优化方案:https://doub.io/ss-jc26/#三、优化Shadowsocks

其他的端口转发教程https://doub.io/ss-jc26/#服务器中继(国内中转)

Socat:

优点:支持 TCP/UDP 转发。缺点:不支持端口段(多个端口需要开启多个转发)

HaProxy:

优点:支持 TCP 转发,支持 端口段 转发。缺点:不支持 UDP 转发。

iptables:

优点:支持 TCP/UDP 转发,支持 端口段 转发。缺点:配置麻烦,容易出错。

iptables配置

开启防火墙的ipv4转发

echo -e "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

配置iptables开机加载

首先我们设置一下iptables 防火墙的开机启动自动载入规则功能。

CentOS 系统:

service iptables save
chkconfig --level 2345 iptables on

Debian/Ubuntu 系统:

iptables-save > /etc/iptables.up.rules
echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables
chmod +x /etc/network/if-pre-up.d/iptables

单端口 端口转发

注意:下面最后是写中转服务器 网卡绑定的IP,而不仅仅是外网IP,比如一些国内服务器可能网卡绑定的是内网IP,你就需要写内网IP,而不是外网IP!

同端口 端口转发

iptables -t nat -A PREROUTING -p tcp --dport [本地端口] -j DNAT --to-destination [目标IP:目标端口]
iptables -t nat -A PREROUTING -p udp --dport [本地端口] -j DNAT --to-destination [目标IP:目标端口]
iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [目标端口] -j SNAT --to-source [本地服务器主网卡绑定IP]
iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [目标端口] -j SNAT --to-source [本地服务器主网卡绑定IP]

以下示例,假设你的国外服务器(被中转服务器)是 1.1.1.1 ,你的SS端口是 10000 ,而你这台正在操作的VPS的主网卡绑定IP(中转服务器)是 2.2.2.2 

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10000 -j DNAT --to-destination 1.1.1.1:10000
iptables -t nat -A PREROUTING -p udp -m udp --dport 10000 -j DNAT --to-destination 1.1.1.1:10000
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 10000 -j SNAT --to-source 2.2.2.2
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 10000 -j SNAT --to-source 2.2.2.2

这个时候你Shadowsocks客户端填写Shadowsocks信息的时候,账号配置和端口填写都不变,只需要修改IP为中转服务器IP即可

不同端口 端口转发

本地服务器(中转服务器 2.2.2.2 ) 10000 端口转发至目标IP(被中转服务器) 1.1.1.1  30000 端口

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10000 -j DNAT --to-destination 1.1.1.1:30000
iptables -t nat -A PREROUTING -p udp -m udp --dport 10000 -j DNAT --to-destination 1.1.1.1:30000
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 30000 -j SNAT --to-source 2.2.2.2
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 30000 -j SNAT --to-source 2.2.2.2

这个时候你Shadowsocks客户端填写Shadowsocks信息的时候,端口应该填 10000 而不是 30000

多端口 端口转发

同端口 端口转发

本地服务器(中转服务器 2.2.2.2 ) 10000~30000 端口转发至目标IP(被中转服务器) 1.1.1.1  10000~30000 端口

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10000:30000 -j DNAT --to-destination 1.1.1.1:10000-30000
iptables -t nat -A PREROUTING -p udp -m udp --dport 10000:30000 -j DNAT --to-destination 1.1.1.1:10000-30000
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 10000:30000 -j SNAT --to-source 2.2.2.2
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 10000:30000 -j SNAT --to-source 2.2.2.2

这个时候你Shadowsocks客户端填写Shadowsocks信息的时候,账号配置和端口填写都不变,只需要修改IP为中转服务器IP即可

不同端口 端口转发

本地服务器(中转服务器 2.2.2.2 ) 10000~20000 端口转发至目标IP(被中转服务器) 1.1.1.1  30000~40000 端口

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10000:20000 -j DNAT --to-destination 1.1.1.1:30000-40000
iptables -t nat -A PREROUTING -p udp -m udp --dport 10000:20000 -j DNAT --to-destination 1.1.1.1:30000-40000
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 30000:40000 -j SNAT --to-source 2.2.2.2
iptables -t nat -A POSTROUTING -d 1.1.1.1 -p udp -m udp --dport 30000:40000 -j SNAT --to-source 2.2.2.2

这个时候你Shadowsocks客户端填写Shadowsocks信息的时候,端口应该填 10000~2000 而不是 30000~40000 

保存iptables配置

修改后记得保存 iptables配置,免得重启后没了。

CentOS 系统:

service iptables save

Debian/Ubuntu 系统:

iptables-save > /etc/iptables.up.rules

查看NAT规则

iptables -t nat -vnL POSTROUTING
iptables -t nat -vnL PREROUTING

删除NAT规则

通过上面的查看规则命令,查看规则后,确定你要删除的规则的顺序,下面的命令是删除 第一个 规则。

iptables -t nat -D POSTROUTING 1
iptables -t nat -D PREROUTING 1

其他的端口转发教程https://doub.io/ss-jc26/#服务器中继(国内中转)

其他的优化方案:https://doub.io/ss-jc26/#三、优化Shadowsocks

参考资料:https://github.com/shadowsocks/shadowsocks/wiki/Setup-a-Shadowsocks-relay

本教程转载自:https://www.91yun.co/archives/3008

转载请超链接注明:逗比根据地 » Shadowsocks利用 iptables 实现中继(中转/端口转发)加速
责任声明:本站一切资源仅用作交流学习,请勿用作商业或违法行为!如造成任何后果,本站概不负责!

赞 (34)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(27)个小伙伴在吐槽
  1. 大佬好,反复试验了端口段且非同端口段转发的方案,发现不能很好对应,比如我设置2000-9000转发到12000-19000,并不是2000对应12000,9000对应19000,网上也看到有人遇到同样情况,所以这个方案可能有问题,我现在是写了个脚本单个端口去一一对应,但是比较麻烦,不知是否还有其他解决方案
    yudong2018-11-11 09:10 回复
    • 这是 Iptables 自身的问题,我无法解决。
      Toyo2018-11-11 12:08 回复
  2. 抓包时发现被中转服务器tcp包出现 cksum incorrect 执行命令ethtool -K eth0 rx off tx off sg off tso off更改设置之后显示正常。但我在ssr-win中将服务器ip修改为中转服务器地址后仍然没有任何反应,没有收到任何来自中转服务器的包。 被中转服务器:
    02:12:33.302878 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 52)
        cloudletk1mega.com.1025 > 42.159.93.xxx.24838: Flags [S.], cksum 0x0757 (correct), seq 1973342682, ack 3629166418, win 42340, options [mss 1460,nop,nop,sackOK,nop,wscale 11], length 0
    	0x0000:  4500 0034 0000 4000 4006 aca6 6771 9e33  [email protected]@...gq.3
    	0x0010:  2a9f 5dda 0401 6106 759e d1da d850 af52  *.]...a.u....P.R
    	0x0020:  8012 a564 0757 0000 0204 05b4 0101 0402  ...d.W..........
    	0x0030:  0103 030b  
    中转服务器:
    02:12:01.864377 IP (tos 0x4, ttl 114, id 19963, offset 0, flags [DF], proto TCP (6), length 52)
        aaa.24838 > 103.113.158.xx.1025: Flags [S], cksum 0x77e0 (correct), seq 3629166417, win 64240, options [mss 1440,nop,wscale 8,nop,nop,sackOK], length 0
    	0x0000:  4504 0034 4dfb 4000 7206 ab1b 0a00 0005  [email protected]
    	0x0010:  6771 9e33 6106 0401 d850 af51 0000 0000  gq.3a....P.Q....
    	0x0020:  8002 faf0 77e0 0000 0204 05a0 0103 0308  ....w...........
    	0x0030:  0101 0402 
    请问我应该如何排查错误呢,问题有可能出在哪里。求解答
    
    ooooo2018-09-07 02:23 回复
    • 折腾了好几天,换一家主机商完美解决问题。。。。。发现手里这些机器只有他们家的机器不行
      ooooo2018-09-09 01:31 回复
  3. 我自己折腾了半天iptable,你不是说自己没时间搞嘛!!万分感谢!!打算在自己的openwrt上搞一个试试!
    jacob2017-11-22 10:03 回复
  4. 你好, 我有一点一直搞不懂,既然你在中间的服务器上使用了DNAT改变了数据包的目标地址为被中继的服务器,然后发给被中继的服务器,那为什么被中继的服务器还能够知道这些数据都是要发给最终真实要请求的服务器呢?还有这个方法适用于ss-libev的ss-redir透明代理吗?
    王万荣2017-09-06 17:45 回复
    • 你给我绕晕了,iptables 以及其他端口转发工具,原理都是一样的(大致)。
      设置中转规则后。你SSR客户端的IP和端口改成 中转服务器的 IP和端口(端口可以一样),然后你浏览器访问你谷歌,浏览器把数据传给SSR客户端,SSR客户端把数据发给中转服务器,中转服务器根据你设置的规则把收到的流量“原封不动”的发给SSR服务器,然后SSR服务端处理数据后,再把数据返回给发送过来的服务器(也就是返回给中转服务器,SSR服务端是从那个IP收到就返回给哪个IP),然后中转服务器收到返回的数据后,就按照你设置的规则返回给你本地SSR客户端,然后浏览器获得网页数据,打开谷歌。
      就是这样,SS-libev 我不清楚。
      
      Toyo2017-09-06 18:10 回复
      • 你好, 我看了一个iptables的NAT教程,但搞不懂,就来问问大神。那个教程说:数据包包头里有指明数据包来源和去向的地址。(就是source address和destination address)。而DNAT就会改变那个表明数据包去向的地址,所以我想既然在中转服务器上已经用DNAT改变了目标地址了,那原来的地址就没有了,在被中转的服务器收到数据后应该只知道这些数据是发给自己的,不知道还要发给谷歌服务器吧?
        王万荣2017-09-06 21:25 回复
      • 既然你说流量是原封不动的发给被中转的服务器,那应该就能说通了。哈哈
        王万荣2017-09-06 21:32 回复
  5. 中转服务器需要安装ssserver吗?
    耶稣2017-06-05 17:42 回复
    • 不需要。ShadowsocksR服务端是安装在被中转服务器上的。
      Toyo2017-06-05 17:56 回复
      • 好的
        耶稣2017-06-06 11:00 回复
  6. firewall一样也可以实现上述的功能,centos7不需要改用iptables。
    echo 1 > /proc/sys/net/ipv4/ip_forward
    # 开启防火墙转发
    firewall-cmd --permanent --add-port=2333/tcp
    firewall-cmd --permanent --add-port=2333/udp
    firewall-cmd --permanent --add-masquerade
    firewall-cmd --permanent --add-forward-port=port=2333:proto=tcp:toport=6666:toaddr=1.1.1.1
    firewall-cmd --permanent --add-forward-port=port=2333:proto=udp:toport=6666:toaddr=1.1.1.1
    firewall-cmd --reload
    
    以上完成了简单的防火墙中转。
    其中 2333 代表本地监听端口, 6666 表示欲中转服务器(SS服务端)的端口, 1.1.1.1 代表欲中转服务器(SS服务端)的ip地址,大家可以试一下。
    快看那头熊2016-12-26 15:21 回复
    • 不玩Centos,不清楚这些,我帮你编辑格式化一下。
      Toyo2016-12-26 15:30 回复
      • 我是看到你的文章觉得可以一试,然后去测试了一下,然后我又懒得换iptables了,就直接用firewall搞了一下
        快看那头熊2016-12-26 15:37 回复
  7. 你好,按照要求来弄。输完service iptables save 返回结果:iptables: unrecognized service 不能识别的服务?怎么回事,求解答。
    smish2016-12-22 01:35 回复
    • Debian/Ubuntu是没有把iptables注册成服务的,CentOS 7也是,7默认用的是firewall防火墙,需要关掉或者删掉安装iptables防火墙才行。
      Toyo2016-12-22 10:46 回复
  8. 请问这个能不能同时中转多个ip
    LL2016-11-27 01:30 回复
  9. 233.233.233.233/32 这个32是什么意思?
    John2016-08-25 12:11 回复
  10. 手机上怎么弄
    4019559772016-08-19 23:00 回复
  11. 如非同端口那个方案,转发后算的是10000端口还是30000端口,求解
    jiqimao2016-08-14 17:35 回复
    • 这个时候你Shadowsocks客户端填写Shadowsocks信息的时候端口应该填 10000 而不是 30000 。
      Toyo2016-08-14 19:40 回复
  12. Debian配置失败!求指点!谢谢! iptables-restore < /etc/iptables.rules iptables-restore v1.4.14: Line 54 seems to have a -t table option. Error occurred at line: 54 Try `iptables-restore -h' or 'iptables-restore --help' for more information.
    夏天乐园2016-08-14 11:10 回复
  13. "看完此逗比文章的心情时"有迷投票bug啊,投票一个人可以多次戳相同的选项。。。
    ENDMAN352016-07-28 06:04 回复
    • 无所谓了,反正也只是加上玩的,不用在意这些细节
      Toyo2016-07-28 06:49 回复