無錫 網(wǎng)站建設(shè)公司廣州做seo整站優(yōu)化公司
私網(wǎng)地址訪問公網(wǎng)地址的問題,請求時,目標(biāo)地址是公網(wǎng)地址,可以在公網(wǎng)路由器中進(jìn)行路由,但是響應(yīng)報文的目的地址是私網(wǎng)地址,此時在公網(wǎng)路由器上就會出現(xiàn)問題。公網(wǎng)地址訪問私網(wǎng)地址的問題,需要先訪問一個公網(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:只修改請求報文的源地址;
? DNAT:只需改請求報文的目標(biāo)地址;
iptables中的nat表三個鏈:
? PREROUTING:DNAT在這個鏈上,否則目標(biāo)地址是nat服務(wù)器本身,直接到INPUT去了,所以一進(jìn)入就要進(jìn)行地址轉(zhuǎn)換。
? OUTPUT:
? POSTROUTING:只有確定了路由后,才進(jìn)行地址轉(zhuǎn)換(如果是訪問NAT服務(wù)器本身,則不需要轉(zhuǎn)換),所以SNAT在這個鏈上。
關(guān)于SNAT與DNAT:
SNAT是源地址轉(zhuǎn)換,DNAT是目標(biāo)地址轉(zhuǎn)換,都是從請求報文方面來說的,因為對于一個SNAT,都會對應(yīng)一個響應(yīng)報文的DNAT,對于一個DNAT,都會有一個響應(yīng)報文的SNAT。上圖中實線是請求報文流,虛線是響應(yīng)報文流。
對于SNAT,主要用于內(nèi)網(wǎng)主機(jī)訪問外網(wǎng)服務(wù)器,從上圖可以看出,如果不經(jīng)過地址轉(zhuǎn)換,請求報文是可以到達(dá)外網(wǎng)服務(wù)器的,但是外網(wǎng)服務(wù)器的響應(yīng)報文,因為其目的地址是內(nèi)網(wǎng)地址CIP,所以是無法在外網(wǎng)中路由的,無法返回響應(yīng)報文,這就是需要SNAT的原因;另一個關(guān)鍵問題是對于防火墻來說,這個地址轉(zhuǎn)換的位置在哪?如果是在PREROUTING轉(zhuǎn)換,那如果這個請求報文就是給NATServer本身的,就會出現(xiàn)問題,此時根本不需要轉(zhuǎn)換,都在一個內(nèi)網(wǎng)中,所以,SNAT是在路由之后,在發(fā)出報文前進(jìn)行地址轉(zhuǎn)換,即在POSTROUTING將CIP轉(zhuǎn)換為NATServer的外網(wǎng)地址FIP;此時的響應(yīng)報文,其目的地址就是轉(zhuǎn)換后的源地址FIP,可以到達(dá)NATServer,在到達(dá)NATServer后,第一步要進(jìn)行目的地址轉(zhuǎn)換,將FIP轉(zhuǎn)換為CIP,即在PREROUTING轉(zhuǎn)換,否則,進(jìn)行路由后在轉(zhuǎn)換,路由的結(jié)果可能就是錯誤的。
對于DNAT,主要用于內(nèi)網(wǎng)主機(jī)提供服務(wù)的情景,外網(wǎng)主機(jī)訪問內(nèi)網(wǎng)主機(jī)服務(wù)器,從上圖可以看出,內(nèi)網(wǎng)主機(jī)提供的服務(wù)是映射在NATServer上,外網(wǎng)主機(jī)訪問NATServer,如果不進(jìn)行目的地址轉(zhuǎn)換,請求報文達(dá)到NATServer后,NATServer根本就沒有這個服務(wù),請求失敗,所以要在請求報文達(dá)到NATServer時,根據(jù)轉(zhuǎn)換規(guī)則,先進(jìn)行目的地址轉(zhuǎn)換,即將請求報文的目的地址FIP轉(zhuǎn)換為CIP,轉(zhuǎn)換位置在PREROUTING上,然后通過路由達(dá)到內(nèi)網(wǎng)主機(jī)CIP,而響應(yīng)報文,其源地址是內(nèi)網(wǎng)主機(jī)的地址CIP,在路由之后,響應(yīng)報文發(fā)出NATServer前,要進(jìn)行源地址的轉(zhuǎn)換,由CIP轉(zhuǎn)換為FIP,如果不轉(zhuǎn)換,響應(yīng)報文是能夠到達(dá)外網(wǎng)主機(jī)的,但是因為其響應(yīng)報文的源地址是CIP,外網(wǎng)主機(jī)根本沒給這個地址發(fā)過請求,這個響應(yīng)報文會被作為異常報文,可能就丟棄了。
所以,源地址轉(zhuǎn)換都是在POSTROUTING,目的地址轉(zhuǎn)換都是在PREROUTING。
proxy:代理,工作于應(yīng)用層,獲取客戶端的請求報文,完全拆解報文后,獲取請求內(nèi)容,在自己構(gòu)建一個請求,發(fā)送給服務(wù)器,然后接收服務(wù)器的響應(yīng)報文,拆解報文,在重新構(gòu)建一個響應(yīng)報文給客戶端。
NAT實現(xiàn)方式:
還是使用前面的拓?fù)?#xff1a;
SNAT實現(xiàn):
F2上有httpd服務(wù)器,將其假設(shè)為外網(wǎng)服務(wù)器,F1為內(nèi)網(wǎng)主機(jī),F1要訪問F2上的服務(wù)。
F1(內(nèi)網(wǎng)主機(jī))上的路由:
7.9(NATServer)上的路由:
F2(外網(wǎng)服務(wù)器)上的路由:
從F1訪問F2的WEB服務(wù),在F2上抓包:
訪問的結(jié)果是在F1上無法訪問F2上的httpd服務(wù)的頁面:
F2上的抓包:
從抓包的結(jié)果可以看到,F1的請求報文到達(dá)了F2,F2也向F1發(fā)送了響應(yīng)報文,但是因為F2沒有F1的路由,即沒有192.168.61.0的路由,送給了默認(rèn)網(wǎng)關(guān)192.168.147.2,響應(yīng)報文無法返回。這里要注意的是請求報文的源地址是192.168.61.129,響應(yīng)報文的目的地址是192.168.61.129。
想要能夠訪問,需在F2上增加路由:
route add -net 192.168.61.0/24 gw 192.168.147.128
此時訪問成功。
從F2的httpd日志中也能看到請求訪問的主機(jī)地址:
現(xiàn)在將F2上的路由去掉:route del -net 192.168.61.1/24 gw 192.168.147.128
此時,F1又無法訪問了,請求報文能夠到達(dá)F2,F2的響應(yīng)報文無法返回。
在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
此時,在F1上又可以訪問F2的WEB服務(wù)了,但是在F2上抓包:
訪問的源地址變?yōu)镹ATServer的地址192.168.147.128,而不是F1的地址,響應(yīng)報文的目的地址也變?yōu)?92.168.147.128,而不是F1的地址。這就是SNAT。
DNAT測試:
清空nat表規(guī)則:
現(xiàn)在假定F2是內(nèi)網(wǎng)的主機(jī),提供web服務(wù),而外網(wǎng)的主機(jī)F1要訪問內(nèi)網(wǎng)的服務(wù),F1是無法通過內(nèi)網(wǎng)的IP地址直接訪問F2的服務(wù)。此時需要進(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
此時,F1可以訪問F2的服務(wù),即外網(wǎng)訪問內(nèi)網(wǎng)的服務(wù)。curl http://192.168.61.128,在F2上抓包:
可以看到,訪問的目的地址是192.168.147.129,而不是192.168.61.128。這就是DNAT,目的地址轉(zhuǎn)換。
因為我們只是對80端口進(jìn)行了轉(zhuǎn)換,所以如果F1上訪問ssh服務(wù):ssh 192.168.61.128,則訪問的是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
再次訪問:
這個應(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
對于源地址轉(zhuǎn)換,有時候外網(wǎng)的地址經(jīng)常變動,如ADSL撥號上網(wǎng),此時可以使用MASQUEREAD,進(jìn)行地址偽裝,此時NATServer會找到合適的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包裝器
對基于tcp協(xié)議開發(fā)并提供服務(wù)的應(yīng)用程序,提供的一層訪問控制工具;tcp_wrapper是基于庫調(diào)用實現(xiàn)其功能:libwrap庫。
只能對本機(jī)內(nèi)部程序(服務(wù))進(jìn)行訪問控制。
判斷服務(wù)是否能夠由tcp_wrapper進(jìn)行訪問控制:
? 1)動態(tài)編譯:ldd命令;
? 2)靜態(tài)編譯:strings命令查看應(yīng)用程序文件,其結(jié)果中如果出現(xiàn):hosts.allow和hosts.deny
在配置文件在為各服務(wù)分別定義訪問控制規(guī)則實現(xià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
配置文件語法:
? daemon_list:client_list [:options]
? daemon_list:
? ??應(yīng)用程序的文件名稱,而非服務(wù)名;
? ? 用用程序文件名稱列表,彼此間使用逗號分隔;
? ? ? 例如:sshd,vsftpd;? ALL表示所有服務(wù);
? client_list:
? ? IP地址;
? ? 主機(jī)名;
? ? 網(wǎng)絡(luò)地址:必須使用完整格式的掩碼,不使用前綴格式掩碼;類似192.168.0.0/16不合法;
? ? 簡短格式的網(wǎng)絡(luò)地址:如192.168.? 表示192.168.0.0/255.255.0.0
? ? ALL:所有主機(jī);
? ? KNOWN:
? ? UNKNOWN:
? ? PARANOID:
例如:vsftpd服務(wù)不允許192.168.147.129訪問:在/etc/hosts.deny中,
vsftpd:192.168.147.129
在hosts.allow中匹配到的,允許訪問,沒有匹配到的,默認(rèn)拒絕,然后在hosts.deny中進(jìn)行匹配,deny中匹配到,則拒絕,否則,允許訪問,即默認(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文件中,實現(xiàn)deny的功能
? allow:允許,用于hosts.deny文件中,實現(xiàn)allow的功能
? spawn:啟動額外應(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
對于telnet服務(wù),因為在CentOS6上,是xinetd超級服務(wù)控制的,使用的deamon即不是xinetd,也不是telnetd,而是in.telnetd,是程序名。