linux随机端口转发和iptables的持久化

linux随机端口转发和iptables的持久化

port forwarding

图文无关(滑稽

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

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

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

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

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

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

## 连续的端口: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四个端口:

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的端口转发的信息:

iptables -L -t nat

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

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

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

sudo apt-get install iptables-persistent

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

/etc/iptables/rules.v4
/etc/iptables/rules.v6

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

COMMENTS (1)

  • comment-avatar

    有大神能够知道windows怎么实现以上的功能请告诉我?