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