公司项目中有一项业务需要将UDP的数据包接入到服务器,并给予回复,一般像类似TCP的数据包,直接通过NGINX或者自身的Socket就可以做到上下行的通路,但是UDP的消息通路及端口,在一段时间内就会被释放掉,而无法再次使用和联通;经我们测试发现,收到一个UDP的数据,当我们解析后并回复一个特定数据回去的时候,经过NGINX时,就失败了,原因就是原来的那个端口没有被保持释放掉了。。。
没办法,除了nginx似乎没有办法满足我们的需求,然后就请教了部门的Linux大佬,然后才了解到,还是自己知道的太少了,原来我们常用的Linux系统,本来就有像nginx这样功能的模块,只不过略微复杂,但是更加全面,更加能够满足各种各样的业务需求。
大佬说的就是iptables来做到udp的端口转发、回路保持、负载均衡等等。热心的大佬还给我们用白板给我们详细的介绍这几个功能到底是怎样做的,这我才理解到原来常用的linux的“水”还是很深啊,我们平时只是在这水面上“划划水”而已啊,惭愧惭愧,还以为懂很多呢。。。
好了,言归正传,先看看我们可以用iptables做点什么呢?
将本机上的5683端口流量转发到指定的服务器(如:192.168.1.2)
$ iptables -t nat -A PREROUTING -p udp -m multiport --dports 5683 -j DNAT --to 192.168.1.2 #增加一条iptables规则,实现udp端口数据转发查看下本机上有哪些已经配置好的iptables规则(如第三条就是我们使用上面命令添加的一条规则)
$ iptables -t nat -xnvL PREROUTING #查看iptables规则Chain PREROUTING (policy ACCEPT 135 packets, 7956 bytes) pkts bytes target prot opt in out source destination 640072 34743448 LOG udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 5683,5682,5681 LOG flags 0 level 4 prefix "[DNT]-->1.2 " 640072 34743448 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 5683,5682,5681 to:192.168.1.2 0 0 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 5683 to:192.168.1.2删除一条已经存在的iptables规则(我们删掉上面的第二条规则,并再次查看所、有规则)
$ iptables -t nat -D PREROUTING 2 #删除iptables规则 2$ iptables -t nat -xnvL PREROUTING #查看iptables规则Chain PREROUTING (policy ACCEPT 13 packets, 772 bytes) pkts bytes target prot opt in out source destination 640073 34743504 LOG udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 5683,5682,5681 LOG flags 0 level 4 prefix "[DNT]-->1.2 " 0 0 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 5683 to:192.168.1.2当然,有同学会问了如果当我们的服务器重启了,这些规则是不是就不存在了?
我们可以在执行新的规则或者删除规则后,使用以下两种办法来永久保存其规则;
①执行service iptables save
②$ cat /etc/rc.local #在命令行修改的同时应当同时修改该启动脚本,以保证在系统重启的时候命令行的修改跟文件内部保持一致,如:将新加的规则插入到这个文件/etc/rc.local的最后即可
至于如何使用iptables实现像nginx那样负载均衡的功能了,额(⊙o⊙)…,我还在学习研究中,等略有成果在和大家分享吧…………
微信公众号,搜索:zhangdaopin,也可方便快捷的看到本人的博客哦,谢谢~