最常用的幾個端口轉發的例子
很多情況下,我們往往需要通過對某個端口進行轉發(端口映射)實現某些特殊功能,比如堡壘機和負載均衡什么的。在這里我就稍微總結了幾種最常用的端口轉發方式供大家參考。
Linux防火墻模式——反向NAT
這種模式大多是要求用戶很快速的實現將外網的某個端口eth0 1.1.1.1:80的流量引流到內網的一臺主機10.0.0.1:8080中,本機內網IP eth1 10.0.0.2這種模式性能是毋庸置疑的,但相對來說穩定性和可控性不佳,往往用于臨時過渡。
sysctl net.ipv4.ip_forward=1 #這個配置非常重要!
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.1
iptables -t nat -A POSTROUTING -s 10.0.0.1/255.0.0.0 -d 10.0.0.1 -p tcp -m tcp --dport 8080 -j SNAT --to-source 10.0.0.2
Haproxy
這個方式其實根防火墻模式很相似,不過經過HAproxy的封裝,增加了很多方便的配置,你可以很方便的配置出簡單的負載均衡規則,狀態監控,日志方式甚至于配置心跳等,適合作為中等以上規模的負載均衡集群。
具體的配置大家可以參考官方文檔或者直接修改安裝包內的默認配置文件,非常淺顯易懂!
SSH tunnel
不得不說,SSH是一個很強大的工具。它完全可以應付簡單的端口轉發和鏈路加密。適用于低流量的兩臺互信主機之間的信息加密,它還有個特點是它支持帶寬壓縮,可以節約部分帶寬資源。
配置方式:
通過ssh的tunnel達到郵件在傳輸的過程中不會受到中間人攻擊造成數據泄露。
故名思義,tunnel就是在郵件服務器和企業防火墻之后設置一條邏輯上的隧道。這條隧道一方面為了數據安全,另一方面,由于ssh的壓縮功能也能在一定程度上減少郵件這類純文本傳輸的網絡需求。
先決條件:
Unix like的郵件系統,并安裝了ssh-server,本例中假定郵件服務器ip為1.2.3.4
企業路由器和內網:路由最好有vpn和防火墻功能。
內網的 一臺主機,配置不必太高(我用了虛擬機,64M內存已經足夠近百人使用),安裝有ssh-client,如果是win主機,推薦使用putty的安裝版本。經過測試,個人覺得FreeBSD下的性能較好。考慮到安全,這臺主機盡量不要安裝遠程控制臺并盡可能上鎖。本例假定ip 192.168.1.1。
注意整個系統的安全策略,賬戶策略等,相比中間人攻擊這樣的“高級”黑客行為,破解密碼,利用漏洞永遠是成本最低的方法。
SSH隧道實現安全Mail系統示意
第一步:設置公鑰方式登錄:
內網主機上運行mkdir -p ~/.ssh;cd ~/.ssh;ssh-keygen –d,如果變態一點可以使用ssh-keygen -b 4096 -d增加強度,之后 不要輸入任何信息,一律回車帶過,很多人不能實現ssh的無驗證通過,大多是因為這里沒有弄好。這樣~/.ssh目錄下將會出現id_dsa 和id_dsa.pub兩個文件。
將內網主機的id_dsa.pub文件拷貝郵件服務器,并在郵件服務器上執行cat id_dsa.pub >> ~/.ssh/authorized_keys 。嘗試在內網主機上執行 ssh A主機的IP ,成功地話應該沒有提示密碼(即直接得到A主機的控制臺)。
如果經常來小站做客的朋友會覺得這段很熟,沒錯它貼自這里,如果你用了windows作為內網主機,請參考這里的內容。
第二步:配置管道:
寫個腳本 vi /usr/sbin/ssh_tunnel
#!/bin/sh localIP='192.168.1.1' removteIP='1.2.3.4' ports='25 80 110' #3個端口,smtp http pop3 for port in $ports do /usr/bin/ssh -C -N -f -L $localIP:$port:$removteIP:$port root@$removteIP & done chmod 755 /usr/sbin/ssh_tunnel
修改rc.local文件,在其中加入 /usr/sbin/ssh_tunnel,當然要放在exit那條之前。
windows不是很熟,寫個笨蛋批處理吧ssh_tunnel.cmd
start /min cmd /c 'C:\Program Files\PuTTY\plink.exe' -C -N -f -L 192.168.1.1:25:1.2.3.4:25 root@1.2.3.4 start /min cmd /c 'C:\Program Files\PuTTY\plink.exe' -C -N -f -L 192.168.1.1:80:1.2.3.4:80 root@1.2.3.4 start /min cmd /c 'C:\Program Files\PuTTY\plink.exe' -C -N -f -L 192.168.1.1:110:1.2.3.4:110 root@1.2.3.4
其實putty的那個plink效果完全等同于ssh,當然,win下面主要是用里面的窗口程序,大多數人不怎么用而已。win下比較煩的是每次重起后都要手工加載key,執行這個批處理。希望對win熟的朋友可以提供自動解決方法。
第三步:設置郵件服務器防火墻
通過郵件服務的防火墻關閉除25和22之外的所有端口。這樣做是最安全的,但這樣的后果是在企業局域網之外只能發不能收郵件。VPN是比較好的折中方案。當然,如果你的郵件系統只需要內部收發郵件(那還要什么郵件系統?),你盡可以連25號也封上。
第四步:設置本地郵件客戶端
將局域網內所有郵件客戶端的smtp和pop都設置為192.168.1.1即可。我這里由于用了webmail,webmail同樣也通過192.168.1.1訪問
如果企業有自己的DNS服務器,甚至整個公司都在域管理模式之下。不妨通過本地的DNS服務器用本地IP覆蓋掉外網真實IP。這樣即便沒有vpn,只要不封郵件服務器的110端口,在郵件客戶端中設置域名,對用戶來說在任何地方都是透明的。
總結:
這種模式,從郵件服務器到企業局域網內的傳輸是加密透明的,外部很難竊取,如果定期為兩邊的ssh更換強化的秘鑰,效果幾乎可以達到變態的要求。據說4096位的秘鑰的破解成本已經到了天文數字。
這種方式相對成本較低,不需要太多的投入,特別是在多個分支機構之間成本優勢更加突出。本想通過smtp的tls和pop的SSL進行加密,可outlook下對沒有根秘證書簽名的秘鑰會彈出討厭的警告框,反而增加了用戶的不安。申請根證書的簽名價格也不菲。
由于企業的郵件系統最多的郵件往往來自于內部,這種方式可以減少差不多一半以上的互聯網帶寬。把帶寬留給更重要的應用。
同理,利用此種方式可以實現其他多種安全方案,達到雙宿主機或者多機虛擬的效果,進而可以為企業節約寶貴的外網IP資源。
netcat
工具幾乎所有的linux都默認安裝了netcat工具(部分Linux的版本用的是OpenBSD-nc,與netcat略有不同,盡管名字一致),這可是一個強大的tcp/ip工具哦。感覺這樣的操作有點黑科技的意思了,建議做調試的時候可以用用。
這個例子是把本地的81號端口的訪問轉移到80號
mknod tunnel p #創建一個臨時的管道文件tunnel
netcat -l -p 81 0 < tunnel | netcat -l -p 80 | tee tunnel
socat
其實這個命令根上一個非常類似,從名字上就看得出這個是針對于linux下socket文件的netcat。多數Linux都可以通過默認源來安裝。由于是直接建立本地的socket文件,就不需要像上例那樣創建管道文件了。
把所有本地的80號轉移到10.0.0.1的8080上
socat -d -d -l TCP4-LISTEN:80,reuseaddr,fork,su=nobody TCP4:10.0.0.1:8080
Windows 的netsh
說到底我們用的最多的還是windows,盡管裝一個cygwin可以實現幾乎上面所有的操作,但最佳的解決方案還是用原生的吧。netsh是windows的一個網絡工具,只要你愿意,你在命令行下可以通過它實現幾乎所有的windows網絡操作。
還是把本地80轉移到10.0.0.1的8080
netsh interface portproxy add listenport=80 connectaddress=10.0.0.1 connectport=8080