Pages

Sunday, 22 November 2020

linux随机端口转发

 大家都知道,国内连接国外的服务器速度慢,甚至连不上,特别是tcp连接。所以我一般用kcptun服务承载加速tcp连接。效果确实还不错,但是又带来另一个问题,就是单个udp的端口流量太大容易被无形的大手干掉。

有没有好一点的方法能够解决这个问题呢?

加了kcp的Q群,里面有大神提到可以利用iptables的随机端口转发(专业名词好像是DNAT啥的)。

上网搜了搜,感觉写的比较乱,我整理一下,以备需要时使用。

代码分服务器端和客户端,客户端一般是在路由器上。

首先,在服务器上执行以下命令:

1
2
3
4
## 连续的端口:8123-8126
iptables -t nat -A PREROUTING -p udp --dport 8123:8126 -j DNAT --to-destination <serverip>:9998
## 离散的端口:3000,10000,11000
iptables -t nat -A PREROUTING -p udp -m multiport --dports 3000,10000,11000 -j DNAT --to-destination <serverip>:9998

这两行命令的含义是在服务器上添加了udp的端口转发。我们假设我们的kcp监听的udp端口是9998,第一行命令是将连续的从8123到8126四个udp端口转发到服务器的9998端口上。第二行命令是将离散的3000、10000和11000三个端口转发到服务器的9998上。这时如果我们访问8123到8126四个端口或者3000、10000、11000端口,就相当于访问了9998端口。注意将<serverip>替换成服务器公网的ip。

接着我们可以在客户端执行以下命令,这里假设在服务器端开启的是8123到8126四个端口:

1
2
3
4
iptables -t nat -A OUTPUT -p udp --dport 9998 -m state --state NEW -m statistic --mode nth --every 4 --packet 0 -j DNAT --to-destination <serverip>:8123
iptables -t nat -A OUTPUT -p udp --dport 9998 -m state --state NEW -m statistic --mode nth --every 4 --packet 1 -j DNAT --to-destination <serverip>:8124
iptables -t nat -A OUTPUT -p udp --dport 9998 -m state --state NEW -m statistic --mode nth --every 4 --packet 2 -j DNAT --to-destination <serverip>:8125
iptables -t nat -A OUTPUT -p udp --dport 9998 -m state --state NEW -m statistic --mode nth --every 4 --packet 3 -j DNAT --to-destination <serverip>:8126

四行命令的含义,如果客户端的程序如果想访问服务器的9998这个udp端口,这个程序发出的包会分成4个部分分别平均发送到服务器的8123到8126端口上,这样就可以实现随机端口转发了。

我们可以通过以下命令查看刚刚iptables的端口转发的信息:

1
iptables -L -t nat

总的来说这个方法,有点麻烦,而且客户端最好是能让你折腾的路由器,我用路由器是刷了梅林固件的网件R6400。不过为了能够让我们的服务能够更稳定,也只能这样啦。

个人感觉离散的端口会更好一点。

说到这,我们会发现一个问题,一旦服务器重启了,之前配置好的iptables就会没了,这是我们需要一个iptables规则持久化的工具来帮我们管理iptables。上网搜索一番,感觉iptables-persistent这个工具就很好用,在ubuntu17.10下配置几乎为零,安装完了就好了。下面是安装的命令:

1
sudo apt-get install iptables-persistent

安装好后,当前的iptebles配置信息会自动保存在

1
2
/etc/iptables/rules.v4
/etc/iptables/rules.v6

两个文件中,现在重启服务器iptables的配置信息也会继续保持啦!

No comments:

Post a Comment