公司項目中有一項業務需要將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,也可方便快捷的看到本人的博客哦,謝謝~