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