iptables_原理理解_DNAT&SNAT實踐應用

  1. 我們都知道iptables 是防火牆,但是實際上 iptables只是配置防火牆的一種工具,真正在工作的是neifilter,netfilter存在於kernel,也就是說是kernel在處理進去出來的數據包;

    直接看圖,看看kernel是如何處理這些數據包的,並且能幹什麼:

    wKiom1Zf6Prws3gnAAC0pbsL51w942.png

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

wKiom1Zf8PfAnHAcAABJPS-M7Ag896.png看上圖,我將外網IP 的80,8080 端口都映射到了內網IP的80端口:
看第一張圖,

經過PREROUTING 鏈後還需要經過FORWARD 鏈,需要在FORWARD這開放提供web服務的80 端口:

iptables  -A FORWARD  -p tcp  -m tcp  --dport 80  -j ACCEPT

wKioL1Zf8pOTlrQBAAA8syWB5bw702.png

理論上還需要開放一下--sport 80  , 但是如果已經有下面這個規則了,就不需要了:這個規則是允許已有連接直接通過;但有大量數據包經過時,可以提高速度!

iptables- I  FORWARD –p tcp  -m state -- state RELADE,RSTABLISHED - j
ACCEPT

看看實際的效果:
80端口
wKioL1Zf84qRy--KAAAqzlqWZgM939.png


8080端口

wKioL1Zf9IHgXV0yAAAw8jB29Dc834.png

B. 當然FORWARD鏈處,可以對轉發進行數據包的過濾,比如我想通過公網服務器的ip,遠程ssh連接局域網內的服務器,就可以使用DNAT進行轉換內網主機的22端口,但是爲了安全,我想限制可以遠程的IP地址:我只想讓我一個人可以 遠程,我的ip192.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

wKioL1Zf-ifTK1kJAABCMdPUHfc659.png

FORWARD:

iptables -A  FORWARD -s 192.168.1.154  -d 192.168.122.0/24 -p tcp -m tcp --dport 22 -j  ACCEPT

wKioL1Zf-AST4kWHAABCaRsyZGQ306.png

看效果:

我的ip地址
wKiom1Zf-iyRnsA1AABmCi1HEAs250.png

在192.168.1.154上 ssh遠程一下看看
wKioL1Zf-vXAjOc4AAB8xmHplmc527.png

再到其他的主機上ssh試試看,這個主機ip是192.168.1.20
wKioL1Zf-1izVNs7AABdUsNCj2E340.png

看的出來FORWARD 上的那個規則生效了。
C. 當內網的主機或本地的虛擬機需要通過本機上網時,需要做SNAT規則:我的環境是虛擬機要通過宿主機上網,虛擬機以宿主機爲網關,虛擬機的網段是192.168.122.0/24,宿主機的網段是192.168.1.0/24,相對來說宿主機網段就是外網,虛擬機就是內網。-j  MASQUERADE 是當外網ip不固定時,這個配置 可以自動獲取外網ip

iptables -t nat -A POSTROUTING  -o br0   -s 內網段/24  -j MASQUERADE

-s配置不是必須的,在真實局域網環境中,也許會有多個局域網段,這時就可以通過-s 配置,指定那個網段可以上網

wKioL1Zf_WrgOnXsAAAm3tPqiRQ211.png

wKiom1Zf_S-iv1pPAACG2iqKr0I887.png


一直都在用iptables,但是知識非常零碎,每次用起來需要很長時間梳理,於是就寫下這個,寫這個主要目的是爲了能把我所知道的分享給大家,以及能以後能夠幫自己快速的回憶起來這些知識,不耽誤正常的工作。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章