我們都知道iptables 是防火牆,但是實際上 iptables只是配置防火牆的一種工具,真正在工作的是neifilter,netfilter存在於kernel,也就是說是kernel在處理進去出來的數據包;
直接看圖,看看kernel是如何處理這些數據包的,並且能幹什麼:
2. 先說收DNAT
DNAT目標地址轉換在PREROUTING鏈上做;可以將虛擬機的服務映射到宿主機的ip上,達到訪問宿主的 ip就等於訪問虛擬機的效果;
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.2:80 -d 物理機的ip --dport 端口 DNAT 被映射的內網主機ip:端口
應用場景:
這樣主要是爲了 能讓內網的主機能夠對外提供服務:數據包的第一站 PREROUTING ,匹配到規則就執行規則進行DNAT轉發,經過FORWARD ,到達POSTROUTING出站。沒有匹配到就進入INPUT,進行匹配
3.再說SNAT
SNAT源地址轉換在POSTROUTING鏈上做; 可以爲局域網提供上網服務
iptables -t nat -A PORTROUTING -o br0 -j MASQUERADE
應用場景:
主機上的NAT 虛擬機需要訪問物理網路,虛擬機直接通過先 經過FORWARD,然後通過POSTROUTING 將源地址轉換
4. 再說說不需要經過轉換的數據包,如圖示綠色的部分,直接到達INPUT-->OUTPUT-->POSTROUTING出來了,比如說我要ssh遠程這個主機,走的就是這個流向;
5. 再來做幾個實驗,來加固一下知識
A. 如果想讓相對的局域網內服務器對外提供web服務,需要做DNAT規則:
iptables -t nat -A PREROUTING -d 公網IP -p tcp –m tcp --dport 公網端口 -j DNAT --to-destination 內網IP:80
看上圖,我將外網IP 的80,8080 端口都映射到了內網IP的80端口:
看第一張圖,
經過PREROUTING 鏈後還需要經過FORWARD 鏈,需要在FORWARD這開放提供web服務的80 端口:
iptables -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT
理論上還需要開放一下--sport 80 , 但是如果已經有下面這個規則了,就不需要了:這個規則是允許已有連接直接通過;但有大量數據包經過時,可以提高速度!
iptables- I FORWARD –p tcp -m state -- state RELADE,RSTABLISHED - j ACCEPT
8080端口
B. 當然FORWARD鏈處,可以對轉發進行數據包的過濾,比如我想通過公網服務器的ip,遠程ssh連接局域網內的服務器,就可以使用DNAT進行轉換內網主機的22端口,但是爲了安全,我想限制可以遠程的IP地址:我只想讓我一個人可以
遠程,我的ip是192.168.1.154,內網網段是192.168.122.0/24
DNAT:
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 8081 --to-destination 192.168.122.2:22
FORWARD:
iptables -A FORWARD -s 192.168.1.154 -d 192.168.122.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
看效果:
再到其他的主機上ssh試試看,這個主機ip是192.168.1.20
看的出來FORWARD 上的那個規則生效了。
C. 當內網的主機或本地的虛擬機需要通過本機上網時,需要做SNAT規則:我的環境是虛擬機要通過宿主機上網,虛擬機以宿主機爲網關,虛擬機的網段是192.168.122.0/24,宿主機的網段是192.168.1.0/24,相對來說宿主機網段就是外網,虛擬機就是內網。-j
MASQUERADE 是當外網ip不固定時,這個配置 I 可以自動獲取外網ip。
iptables -t nat -A POSTROUTING -o br0 -s 內網段/24 -j MASQUERADE
-s配置不是必須的,在真實局域網環境中,也許會有多個局域網段,這時就可以通過-s 配置,指定那個網段可以上網
一直都在用iptables,但是知識非常零碎,每次用起來需要很長時間梳理,於是就寫下這個,寫這個主要目的是爲了能把我所知道的分享給大家,以及能以後能夠幫自己快速的回憶起來這些知識,不耽誤正常的工作。