镜像域名 doub.bid 提供给无翻墙能力的人访问,有能力的建议访问主域名:doub点io(防镜像替换 自己改点)
投稿文章 | 广告投放 | Telegram 群组 / 公告频道

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

Shadowsocks Toyo 23评论
文章目录
[显示]
本文最后更新于 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 实现中继(中转/端口转发)加速
责任声明:本站一切资源仅用作交流学习,请勿用作商业或违法行为!如造成任何后果,本站概不负责!

赞 (24)or打赏
发表我的评论
取消评论
表情

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

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(23)个小伙伴在吐槽
  1. 我自己折腾了半天iptable,你不是说自己没时间搞嘛!!万分感谢!!打算在自己的openwrt上搞一个试试!
    jacob2017-11-22 10:03 回复
  2. 你好, 我有一点一直搞不懂,既然你在中间的服务器上使用了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 回复
  3. 中转服务器需要安装ssserver吗?
    耶稣2017-06-05 17:42 回复
    • 不需要。ShadowsocksR服务端是安装在被中转服务器上的。
      Toyo2017-06-05 17:56 回复
      • 好的
        耶稣2017-06-06 11:00 回复
  4. 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 回复
  5. 你好,按照要求来弄。输完service iptables save 返回结果:iptables: unrecognized service 不能识别的服务?怎么回事,求解答。
    smish2016-12-22 01:35 回复
    • Debian/Ubuntu是没有把iptables注册成服务的,CentOS 7也是,7默认用的是firewall防火墙,需要关掉或者删掉安装iptables防火墙才行。
      Toyo2016-12-22 10:46 回复
  6. 请问这个能不能同时中转多个ip
    LL2016-11-27 01:30 回复
  7. 233.233.233.233/32 这个32是什么意思?
    John2016-08-25 12:11 回复
  8. 手机上怎么弄
    4019559772016-08-19 23:00 回复
  9. 如非同端口那个方案,转发后算的是10000端口还是30000端口,求解
    jiqimao2016-08-14 17:35 回复
    • 这个时候你Shadowsocks客户端填写Shadowsocks信息的时候端口应该填 10000 而不是 30000 。
      Toyo2016-08-14 19:40 回复
  10. 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 回复
  11. "看完此逗比文章的心情时"有迷投票bug啊,投票一个人可以多次戳相同的选项。。。
    ENDMAN352016-07-28 06:04 回复
    • 无所谓了,反正也只是加上玩的,不用在意这些细节
      Toyo2016-07-28 06:49 回复