防火墻
-
主機間通信大致過程:
- 請求報文由客戶端IP+PORT和服務器端IP+PORT構成。當客戶端網絡地址和服務端地址在同一網段時,不需要經由路由轉發,可以直接到目標服務器,再經由服務器端口請求道所需資源;
-
當服務器端和客戶端不在同一網段時。目標IP和源IP是不會改變的,會經由互聯網中的路由器,按照其的路由表,指向該路由器的下一跳主機,知道找到服務器端所在網段。
- 當Linux主機充當路由器時,接收到報文請求之后,判斷目標IP是不是本地的IP地址,如果是,則發往內核空間拆開IP封裝,再拆開端口地址封裝,交由目標端口,有監聽該端口的進程進行處理。
- 當不是本地的IP,并且打開了核心轉發功能(ip_forward),那么,就會交給其他網卡,并且根據相應的路由表進行轉發
-
防火墻的工作原理:
- 由于主機之間的通信,需要IP和端口兩個數據,那么我們可以在端口之外,將端口封起來,不允許隨意訪問,這樣就可以實現防火墻功能呢個
- 但是,作為服務器而言,需要向外提供服務;作為客戶端而言,需要向外請求服務。所以,純粹的封閉主機的端口,來達到防火墻功能,并不現實。需要在防火墻上添加規則,并且給出相應的處理動作,與規則條件不匹配的,做出什么樣的處理動作,符合的又該做出什么動作。
- 根據主機間的通信過程,我們可以了解到,一個請求進入一臺Linux主機,有兩個方向可以通過,一個是進入內核空間,另外一個是通過核心轉發功能轉發出去:
1. 請求報文進入主機內部,先經由prerouting,input鏈進入內核空間,到目標端口,進行處理
2. 處理完之后,用過output,postrouting,由本機發出 2. 請求報文進入主機內部,從prerouting,到forward,再到postrouting,由本機轉發
3. 請求報文進入內核空間,經由ouput,postrouting,再到網卡,由本機發出 4. 對Linux而言,這五個能實現包進行處理的位置,是在內核中安置的一個框架,任何一個報文只要達到這個位置,都會被審核(根據檢查規則作出相應處理動作。如何添加規則就是由管理員所定義的) 5. 通過iptables這個工具,將編寫的規則通過這個工具發送給上述的框架
-
iptables:
- 功能:(4表)
filter:過濾,防火墻;
nat:network address translation nat會話的連接追蹤表;用于修改源IP或目標IP,也可以改端口;(功能是地址轉換,保護服務器一側,就將它放置在服務器里,向外提供服務;保護客戶端一側,放置在客戶端,代表客戶端訪問互聯網。保護客戶端的時候做源地址轉換;保護服務端做目標地址轉換)
mangle:拆解報文,做出修改,并重新封裝起來;(修改地址(源IP,目標IP)之外的其他屬性,比如報文中的其他信息 ttl 協議版本等。)
raw:關閉nat表上啟用的連接追蹤機制- 5鏈
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING -
state
它是coontrack模塊(連接追蹤)的子集;可以基于連接追蹤功能去查看某一報文的當前所處的狀態
連接追蹤:在內核內存中打開一段空間,這段空間可以記錄下來,此前哪些客戶端訪問過。(給內核內存中添加了記錄某個IP基于什么協議通過什么端口訪問了哪些東西等信息)
連接追蹤功能需要激活后才能使用,需要裝載(-m state –state
對于一個非常繁忙的主機而言,要么調大這個空間,要么不開啟追蹤-
[!] –state state
INVALID,ESTABLSHED,NEW,RELATED or UNTRACKED.
NEW:新連接請求;
ESTABLISHED:已經建立的連接;
RELATED:相關聯的連接,當前連接是一個新請求,但附屬于某個已存在的連接; UNTRACKED:未追蹤的連接;
INVALID:無法識別的連接; -
state擴展:
內核模塊裝載:
nf_conntrack
nf_conntrack_ipv4 -
手動裝載:
nf_conntarck_ft
-
-
SNAT:源地址轉換。用于將IP數據包的源地址轉換成另外一個地址,實現隱藏客戶端源IP,順帶著解決了IPv4地址不夠使用的問題
-
DNAT:目標地址轉換。實現了隱藏服務器地址,和解決IPv4地址不夠使用的問題
#環境: A:eth0:inet 192.168.2.128/24 B:eth0: inet 192.168.3.129/24; eth1: inet 192.168.2.129/24 C:eth0:inet 192.168.3.128/24 #B機器eth1為A機器的網關 ip route add default via 192.168.2.129 #B機器eth0為C機器網關 ip route add default via 192.168.3.129 #B機器添加規則: iptables -t nat -A PREROUTING -d 192.168.2.129 -j DNAT --to-destination 192.168.3.128 #構建DNAT iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.0.6 #構建SNAT
萬能規則示例:
#在B機器(開啟了核心轉發功能的Linux主機)添加一下規則 iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT #對所有已經建立的報文,都放行 iptables -I FOWARD 2 -s 192.168.2.0/24 -m state --state NEW -j ACCEPT #開放內網主機(A),訪問服務端(外網主機C),放行NEW請求;表示放行內網去訪問外網。 #注意,無法放行ftp這種半連接狀態的協議,需要額外添加RELATED的規則 modprobe nf_conntrack_ftp vim /etc/sysconfig/iptables-config IPTBLES_MODULES="nf_conntrack_ftp" #firewalld文件,自動加載這個模塊,CentOS6中自動啟動可以使用腳本 iptables -I FORWARD 5 -d 192.168.2.128 -p tcp -m state --state RELATED -j ACCEPT
原創文章,作者:半斤八兩,如若轉載,請注明出處:http://www.www58058.com/78172