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