無(wú)錫 網(wǎng)站建設(shè)公司廣州做seo整站優(yōu)化公司
私網(wǎng)地址訪問(wèn)公網(wǎng)地址的問(wèn)題,請(qǐng)求時(shí),目標(biāo)地址是公網(wǎng)地址,可以在公網(wǎng)路由器中進(jìn)行路由,但是響應(yīng)報(bào)文的目的地址是私網(wǎng)地址,此時(shí)在公網(wǎng)路由器上就會(huì)出現(xiàn)問(wèn)題。公網(wǎng)地址訪問(wèn)私網(wǎng)地址的問(wèn)題,需要先訪問(wèn)一個(gè)公網(wǎng)的地址,由公網(wǎng)地址在轉(zhuǎn)換為私網(wǎng)地址。解決的方法有:nat和proxy。
NAT:Network Address Translation,此技術(shù)最初是為了安全性,隱藏本地網(wǎng)絡(luò)主機(jī)。網(wǎng)絡(luò)層+傳輸層;
proxy:代理,應(yīng)用層;
NAT:
? SNAT:只修改請(qǐng)求報(bào)文的源地址;
? DNAT:只需改請(qǐng)求報(bào)文的目標(biāo)地址;
iptables中的nat表三個(gè)鏈:
? PREROUTING:DNAT在這個(gè)鏈上,否則目標(biāo)地址是nat服務(wù)器本身,直接到INPUT去了,所以一進(jìn)入就要進(jìn)行地址轉(zhuǎn)換。
? OUTPUT:
? POSTROUTING:只有確定了路由后,才進(jìn)行地址轉(zhuǎn)換(如果是訪問(wèn)NAT服務(wù)器本身,則不需要轉(zhuǎn)換),所以SNAT在這個(gè)鏈上。
關(guān)于SNAT與DNAT:
SNAT是源地址轉(zhuǎn)換,DNAT是目標(biāo)地址轉(zhuǎn)換,都是從請(qǐng)求報(bào)文方面來(lái)說(shuō)的,因?yàn)閷?duì)于一個(gè)SNAT,都會(huì)對(duì)應(yīng)一個(gè)響應(yīng)報(bào)文的DNAT,對(duì)于一個(gè)DNAT,都會(huì)有一個(gè)響應(yīng)報(bào)文的SNAT。上圖中實(shí)線是請(qǐng)求報(bào)文流,虛線是響應(yīng)報(bào)文流。
對(duì)于SNAT,主要用于內(nèi)網(wǎng)主機(jī)訪問(wèn)外網(wǎng)服務(wù)器,從上圖可以看出,如果不經(jīng)過(guò)地址轉(zhuǎn)換,請(qǐng)求報(bào)文是可以到達(dá)外網(wǎng)服務(wù)器的,但是外網(wǎng)服務(wù)器的響應(yīng)報(bào)文,因?yàn)槠淠康牡刂肥莾?nèi)網(wǎng)地址CIP,所以是無(wú)法在外網(wǎng)中路由的,無(wú)法返回響應(yīng)報(bào)文,這就是需要SNAT的原因;另一個(gè)關(guān)鍵問(wèn)題是對(duì)于防火墻來(lái)說(shuō),這個(gè)地址轉(zhuǎn)換的位置在哪?如果是在PREROUTING轉(zhuǎn)換,那如果這個(gè)請(qǐng)求報(bào)文就是給NATServer本身的,就會(huì)出現(xiàn)問(wèn)題,此時(shí)根本不需要轉(zhuǎn)換,都在一個(gè)內(nèi)網(wǎng)中,所以,SNAT是在路由之后,在發(fā)出報(bào)文前進(jìn)行地址轉(zhuǎn)換,即在POSTROUTING將CIP轉(zhuǎn)換為NATServer的外網(wǎng)地址FIP;此時(shí)的響應(yīng)報(bào)文,其目的地址就是轉(zhuǎn)換后的源地址FIP,可以到達(dá)NATServer,在到達(dá)NATServer后,第一步要進(jìn)行目的地址轉(zhuǎn)換,將FIP轉(zhuǎn)換為CIP,即在PREROUTING轉(zhuǎn)換,否則,進(jìn)行路由后在轉(zhuǎn)換,路由的結(jié)果可能就是錯(cuò)誤的。
對(duì)于DNAT,主要用于內(nèi)網(wǎng)主機(jī)提供服務(wù)的情景,外網(wǎng)主機(jī)訪問(wèn)內(nèi)網(wǎng)主機(jī)服務(wù)器,從上圖可以看出,內(nèi)網(wǎng)主機(jī)提供的服務(wù)是映射在NATServer上,外網(wǎng)主機(jī)訪問(wèn)NATServer,如果不進(jìn)行目的地址轉(zhuǎn)換,請(qǐng)求報(bào)文達(dá)到NATServer后,NATServer根本就沒(méi)有這個(gè)服務(wù),請(qǐng)求失敗,所以要在請(qǐng)求報(bào)文達(dá)到NATServer時(shí),根據(jù)轉(zhuǎn)換規(guī)則,先進(jìn)行目的地址轉(zhuǎn)換,即將請(qǐng)求報(bào)文的目的地址FIP轉(zhuǎn)換為CIP,轉(zhuǎn)換位置在PREROUTING上,然后通過(guò)路由達(dá)到內(nèi)網(wǎng)主機(jī)CIP,而響應(yīng)報(bào)文,其源地址是內(nèi)網(wǎng)主機(jī)的地址CIP,在路由之后,響應(yīng)報(bào)文發(fā)出NATServer前,要進(jìn)行源地址的轉(zhuǎn)換,由CIP轉(zhuǎn)換為FIP,如果不轉(zhuǎn)換,響應(yīng)報(bào)文是能夠到達(dá)外網(wǎng)主機(jī)的,但是因?yàn)槠漤憫?yīng)報(bào)文的源地址是CIP,外網(wǎng)主機(jī)根本沒(méi)給這個(gè)地址發(fā)過(guò)請(qǐng)求,這個(gè)響應(yīng)報(bào)文會(huì)被作為異常報(bào)文,可能就丟棄了。
所以,源地址轉(zhuǎn)換都是在POSTROUTING,目的地址轉(zhuǎn)換都是在PREROUTING。
proxy:代理,工作于應(yīng)用層,獲取客戶端的請(qǐng)求報(bào)文,完全拆解報(bào)文后,獲取請(qǐng)求內(nèi)容,在自己構(gòu)建一個(gè)請(qǐng)求,發(fā)送給服務(wù)器,然后接收服務(wù)器的響應(yīng)報(bào)文,拆解報(bào)文,在重新構(gòu)建一個(gè)響應(yīng)報(bào)文給客戶端。
NAT實(shí)現(xiàn)方式:
還是使用前面的拓?fù)?#xff1a;
SNAT實(shí)現(xiàn):
F2上有httpd服務(wù)器,將其假設(shè)為外網(wǎng)服務(wù)器,F1為內(nèi)網(wǎng)主機(jī),F1要訪問(wèn)F2上的服務(wù)。
F1(內(nèi)網(wǎng)主機(jī))上的路由:
7.9(NATServer)上的路由:
F2(外網(wǎng)服務(wù)器)上的路由:
從F1訪問(wèn)F2的WEB服務(wù),在F2上抓包:
訪問(wèn)的結(jié)果是在F1上無(wú)法訪問(wèn)F2上的httpd服務(wù)的頁(yè)面:
F2上的抓包:
從抓包的結(jié)果可以看到,F1的請(qǐng)求報(bào)文到達(dá)了F2,F2也向F1發(fā)送了響應(yīng)報(bào)文,但是因?yàn)镕2沒(méi)有F1的路由,即沒(méi)有192.168.61.0的路由,送給了默認(rèn)網(wǎng)關(guān)192.168.147.2,響應(yīng)報(bào)文無(wú)法返回。這里要注意的是請(qǐng)求報(bào)文的源地址是192.168.61.129,響應(yīng)報(bào)文的目的地址是192.168.61.129。
想要能夠訪問(wèn),需在F2上增加路由:
route add -net 192.168.61.0/24 gw 192.168.147.128
此時(shí)訪問(wèn)成功。
從F2的httpd日志中也能看到請(qǐng)求訪問(wèn)的主機(jī)地址:
現(xiàn)在將F2上的路由去掉:route del -net 192.168.61.1/24 gw 192.168.147.128
此時(shí),F1又無(wú)法訪問(wèn)了,請(qǐng)求報(bào)文能夠到達(dá)F2,F2的響應(yīng)報(bào)文無(wú)法返回。
在7.9上(NATServer),做SNAT:
?iptables -t nat -A POSTROUTING -s 192.168.61.0/24 ! -d 192.168.61.0/24 -j SNAT --to-source 192.168.147.128
此時(shí),在F1上又可以訪問(wèn)F2的WEB服務(wù)了,但是在F2上抓包:
訪問(wèn)的源地址變?yōu)镹ATServer的地址192.168.147.128,而不是F1的地址,響應(yīng)報(bào)文的目的地址也變?yōu)?92.168.147.128,而不是F1的地址。這就是SNAT。
DNAT測(cè)試:
清空nat表規(guī)則:
現(xiàn)在假定F2是內(nèi)網(wǎng)的主機(jī),提供web服務(wù),而外網(wǎng)的主機(jī)F1要訪問(wèn)內(nèi)網(wǎng)的服務(wù),F1是無(wú)法通過(guò)內(nèi)網(wǎng)的IP地址直接訪問(wèn)F2的服務(wù)。此時(shí)需要進(jìn)行目的地址轉(zhuǎn)換,即DNAT。
在網(wǎng)關(guān)上,即NATServer上聲明
iptables -t nat -A PREROUTING -d 192.168.61.128 -p tcp --dport 80 -j DNAT --to-destination 192.168.147.129
在F2上增加默認(rèn)路由,route add default gw192.168.147.128
此時(shí),F1可以訪問(wèn)F2的服務(wù),即外網(wǎng)訪問(wèn)內(nèi)網(wǎng)的服務(wù)。curl http://192.168.61.128,在F2上抓包:
可以看到,訪問(wèn)的目的地址是192.168.147.129,而不是192.168.61.128。這就是DNAT,目的地址轉(zhuǎn)換。
因?yàn)槲覀冎皇菍?duì)80端口進(jìn)行了轉(zhuǎn)換,所以如果F1上訪問(wèn)ssh服務(wù):ssh 192.168.61.128,則訪問(wèn)的是NATServer本身:
將22端口進(jìn)行轉(zhuǎn)換:
iptables -t nat -A PREROUTING -d 192.168.61.128 -p tcp --dport 22 -j DNAT --to-destination 192.168.147.129
再次訪問(wèn):
這個(gè)應(yīng)該是安全的原因,類似中間人攻擊。在F2上抓包:
目的地址已經(jīng)進(jìn)行了轉(zhuǎn)換。
端口轉(zhuǎn)換:將第一條規(guī)則修改為192.168.61.128轉(zhuǎn)換為192.168.147.129:8080
iptables -t nat -R PREROUTING 1 -d 192.168.61.128 -p tcp --dport 80 -j DNAT --to-destination 192.168.147.129:8080
對(duì)于源地址轉(zhuǎn)換,有時(shí)候外網(wǎng)的地址經(jīng)常變動(dòng),如ADSL撥號(hào)上網(wǎng),此時(shí)可以使用MASQUEREAD,進(jìn)行地址偽裝,此時(shí)NATServer會(huì)找到合適的IP地址進(jìn)行源地址轉(zhuǎn)換:
iptables -t nat -A POSTROUTING -s?192.168.147.0/24 !-d 192.168.147.0/24 -j MASQUEREAD
自定義規(guī)則鏈及其使用,以及常用的一些規(guī)則:
iptables -N? clean_in
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
iptables -A clean_in -d 192.168.255.255 -p icmp -j DROP
iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
iptables -A clean_in -d 192.168.147.128 -j RETURN
iptables -A INPUT -d 192.168.147.128 -j clean_in
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
tcp_wrapper:tcp包裝器
對(duì)基于tcp協(xié)議開(kāi)發(fā)并提供服務(wù)的應(yīng)用程序,提供的一層訪問(wèn)控制工具;tcp_wrapper是基于庫(kù)調(diào)用實(shí)現(xiàn)其功能:libwrap庫(kù)。
只能對(duì)本機(jī)內(nèi)部程序(服務(wù))進(jìn)行訪問(wèn)控制。
判斷服務(wù)是否能夠由tcp_wrapper進(jìn)行訪問(wèn)控制:
? 1)動(dòng)態(tài)編譯:ldd命令;
? 2)靜態(tài)編譯:strings命令查看應(yīng)用程序文件,其結(jié)果中如果出現(xiàn):hosts.allow和hosts.deny
在配置文件在為各服務(wù)分別定義訪問(wèn)控制規(guī)則實(shí)現(xiàn)訪問(wèn)控制:
? /etc/hosts.allow
? /etc/hosts.deny
先檢查hosts.allow,后檢查hosts.deny;
服務(wù)檢查邏輯:
? client --> /etc/hosts.allow --> (Y) --> ALLOW
? client --> /etc/hosts.allow --> (N) --> /etc/hosts.deny --> (Y) --> DENY
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--> (N) --> ALLOW
配置文件語(yǔ)法:
? daemon_list:client_list [:options]
? daemon_list:
? ??應(yīng)用程序的文件名稱,而非服務(wù)名;
? ? 用用程序文件名稱列表,彼此間使用逗號(hào)分隔;
? ? ? 例如:sshd,vsftpd;? ALL表示所有服務(wù);
? client_list:
? ? IP地址;
? ? 主機(jī)名;
? ? 網(wǎng)絡(luò)地址:必須使用完整格式的掩碼,不使用前綴格式掩碼;類似192.168.0.0/16不合法;
? ? 簡(jiǎn)短格式的網(wǎng)絡(luò)地址:如192.168.? 表示192.168.0.0/255.255.0.0
? ? ALL:所有主機(jī);
? ? KNOWN:
? ? UNKNOWN:
? ? PARANOID:
例如:vsftpd服務(wù)不允許192.168.147.129訪問(wèn):在/etc/hosts.deny中,
vsftpd:192.168.147.129
在hosts.allow中匹配到的,允許訪問(wèn),沒(méi)有匹配到的,默認(rèn)拒絕,然后在hosts.deny中進(jìn)行匹配,deny中匹配到,則拒絕,否則,允許訪問(wèn),即默認(rèn)允許。
EXCEPT:除了
? hosts.allow
? ? vsftpd:172.16. EXCEPT 192.16.100.1
? ? vsftpd:172.16. EXCEPT 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1
[:options]
? deny:拒絕,主要用于hosts.allow文件中,實(shí)現(xiàn)deny的功能
? allow:允許,用于hosts.deny文件中,實(shí)現(xiàn)allow的功能
? spawn:啟動(dòng)額外應(yīng)用程序;
vsftp:ALL :spawn /bin/echo `date` login attempt from %c to %s,%d >>/var/log/vsftpd.log
? ? %c:client ip? 、%s:server ip 、%d:daemon name
對(duì)于telnet服務(wù),因?yàn)樵贑entOS6上,是xinetd超級(jí)服務(wù)控制的,使用的deamon即不是xinetd,也不是telnetd,而是in.telnetd,是程序名。