IPTABLES簡介

iptables防火牆工做原理html

簡介:iptables防火牆工做在網絡層,針對TCP/IP數據包實施過濾和限制,iptables防火牆基於內核編碼實現,具備很是穩定的性能和高效率;linux

   iptables屬於「用戶態」的防火牆管理體系。web

 

 

 

規則表                                                                                 shell

filter表:filter表用來對數據包進行過濾,根據具體的規則要就決定如何處理一個數據包。對應內核模塊:iptable_fileter。共包含三個鏈。vim

nat表:nat(Network Address Translation,網絡地址轉換)表主要用於修改數據包 ip地址,端口號等信息。對應的內核模塊爲iptable_nat,共包含三個鏈。後端

mangle表:mangle表用來修改數據包的TOS(Type Of Service,服務類型),TTL(Time To Live,生存週期)值,或者爲數據包設置Mark標記,以實現流量整形,策略路由等高級應用。對應的內核模塊爲      iptable_mangle,共包含五個鏈。安全

raw表:raw表示自1.2.9之後版本的iptables新增的表,主要來決定是否對數據包進行狀態跟蹤。對應的內核模塊爲iptable_raw,共包含兩個鏈。服務器

 

規則鏈                                                                                            網絡

INPUT鏈:當收到訪問防火牆本機地址的數據包(入站)時,應用此鏈中的規則。併發

OUTPUT鏈:當防火牆本機向外發送數據包(出站)時,應用此鏈中的規則。

FORWARD鏈:當接收到須要經過防火牆中轉發送給其餘地址的數據包(轉發)是,應用測鏈中的規則。

PREROUTING鏈:在對數據包作路由選擇以前,應用測鏈中的規則。

POSTROUTING鏈:在對數據包作路由選擇以後,應用此鏈中的規則。

簡要說明:其中INPUT,OUTPUT鏈主要用在「主機防火牆」中。即主要針對服務器本機驚醒保護的防火牆;而FORWARD,PREROUTING,POSTROUTING鏈多用在「網絡型防火牆」中,例如使用Linux防火牆做爲網關     服務器在公司與Inetnet之間進行安全控制。

 

數據包過濾工做流程                                                                          

規則表應用優先級:raw→mangle→nat→filter

各條規則的應用順序:鏈內部的過濾遵循「匹配即中止」的原則,若是對比完整個鏈也沒有找到和數據包匹配的規則,則會按照鏈的默認策略進行處理。

 

入站數據流向:數據包到達防火牆後首先被PREROUTING鏈處理(是否修改數據包地址等),而後進行路由選擇(判斷數據包發往何處),若是數據包的目標地址是防火牆本機(如:Internet用戶訪問網關的Web服務端口),那麼內核將其傳遞給INPUT鏈進行處理(決定是否容許經過等)。

轉發數據流向:來自外界的數據包到達防火牆後首先被PREROUTTING鏈處理,而後再進行路由選擇;若是數據包的目標地址是其餘的外部地址(如局域網用戶經過網關訪問QQ服務器),則內核將其傳遞給FORWARD鏈進行處理(容許轉發,攔截,丟棄),最後交給POSTROUTING鏈(是否修改數據包的地址等)進行處理。

出站數據流向:防火牆本機向外部地址發送的數據包(如在防火牆主機中測試公網DNS服務時),首先被OUTPUT鏈處理,而後進行路由選擇,再交給POSTROUTING鏈(是否修改數據包的地址等)進行處理。

 

命令實戰                                                                                               

語法:

iptables [ - t 表名 ]  管理選項  [鏈名]  [匹配條件]  [-j 控制類型]

未指定表名時將默認使用filter表。

 

控制類型:

 ACCEPT:容許數據包經過。

 DROP:直接丟棄數據包,不給出任何迴應信息。

 REJECT:拒絕數據包經過,會給數據發送端一個響應信息。 

 

拒絕發給本機使用ICMP協議的數據包:iptable -t filter -I INPUT -p icmp -j REJECT

  • -A   在指定鏈的末尾添加(--append)一條新的規則
  • -D   刪除(--delete)指定鏈中的某一條規則,可指定規則須要或具體內容。
  • -I    在指定鏈中插入(--insert)-條新的規則,未指定序號時默認做爲第一條規則。
  • -R   修改,替換(--replace)指定鏈中的某一條規則,可指定規則序號或具體內容。
  • -L   列出(--list)指定鏈中的全部規則,若未指定鏈名,則清空表中的全部鏈。
  • -P   設置指定鏈的默認策略(--policy)。
  • -n   使用數字形式(--numeric)顯示輸出結果,如顯示ip地址而不是主機名
  • -v   查看規則列表時顯示詳細(--verbose)的信息。
  • -line-numbers   查看規則列表時,同時顯示規則在鏈中的順序號。

 

 

咱們來配置一個filter表的防火牆.
(1)查看本機關於IPTABLES的設置狀況
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        
Chain RH-Firewall-1-INPUT (0 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255 
ACCEPT     esp  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     ah   --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     udp  --  0.0.0.0/0            224.0.0.251         udp dpt:5353 
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:631 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:25 
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
能夠看出我在安裝linux時,選擇了有防火牆,而且開放了22,80,25端口.
若是你在安裝linux時沒有選擇啓動防火牆,是這樣的
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  
什麼規則都沒有.
(2)清除原有規則.
無論你在安裝linux時是否啓動了防火牆,若是你想配置屬於本身的防火牆,那就清除如今filter的全部規則.
[root@tp ~]# iptables -F      清除預設表filter中的全部規則鏈的規則
[root@tp ~]# iptables -X      清除預設表filter中使用者自定鏈中的規則
咱們在來看一下
[root@tp ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination     
什麼都沒有了吧,和咱們在安裝linux時沒有啓動防火牆是同樣的.(提早說一句,這些配置就像用命令配置IP同樣,重起就會失去做用),怎麼保存.
[root@tp ~]# /etc/rc.d/init.d/iptables save
 
這樣就能夠寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起做用.
[root@tp ~]# service iptables restart
 
如今IPTABLES配置表裏什麼配置都沒有了,那咱們開始咱們的配置吧
(3)設定預設規則
[root@tp ~]# iptables -P INPUT DROP
[root@tp ~]# iptables -P OUTPUT ACCEPT
[root@tp ~]# iptables -P FORWARD DROP
上面的意思是,當超出了IPTABLES裏filter表裏的兩個鏈規則(INPUT,FORWARD)時,不在這兩個規則裏的數據包怎麼處理呢,那就是DROP(放棄).應該說這樣配置是很安全的.咱們要控制流入數據包
而對於OUTPUT鏈,也就是流出的包咱們不用作太多限制,而是採起ACCEPT,也就是說,不在着個規則裏的包怎麼辦呢,那就是經過.
能夠看出INPUT,FORWARD兩個鏈採用的是容許什麼包經過,而OUTPUT鏈採用的是不容許什麼包經過.
這樣設置仍是挺合理的,固然你也能夠三個鏈都DROP,但這樣作我認爲是沒有必要的,並且要寫的規則就會增長.但若是你只想要有限的幾個規則是,如只作WEB服務器.仍是推薦三個鏈都是DROP.
注:若是你是遠程SSH登錄的話,當你輸入第一個命令回車的時候就應該掉了.由於你沒有設置任何規則.
怎麼辦,去本機操做唄!
(4)添加規則.
首先添加INPUT鏈,INPUT鏈的默認規則是DROP,因此咱們就寫須要ACCETP(經過)的鏈
爲了能採用遠程SSH登錄,咱們要開啓22端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT  (注:這個規則,若是你把OUTPUT 設置成DROP的就要寫上這一部,好多人都是望了寫這一部規則致使,始終沒法SSH.在遠程一下,是否是好了.
其餘的端口也同樣,若是開啓了web服務器,OUTPUT設置成DROP的話,一樣也要添加一條鏈:
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ,其餘同理.)
若是作了WEB服務器,開啓80端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
若是作了郵件服務器,開啓25,110端口.
[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
若是作了FTP服務器,開啓21端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
若是作了DNS服務器,開啓53端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
若是你還作了其餘的服務器,須要開啓哪一個端口,照寫就好了.
上面主要寫的都是INPUT鏈,凡是不在上面的規則裏的,都DROP
容許icmp包經過,也就是容許ping,
[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT設置成DROP的話)
[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT  (INPUT設置成DROP的話)
容許loopback!(否則會致使DNS沒法正常關閉等問題)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (若是是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(若是是OUTPUT DROP)
下面寫OUTPUT鏈,OUTPUT鏈默認規則是ACCEPT,因此咱們就寫須要DROP(放棄)的鏈.
減小不安全的端口鏈接
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些些特洛伊木馬會掃描端口31337到31340(即黑客語言中的 elite 端口)上的服務。既然合法服務都不使用這些非標準端口來通訊,阻塞這些端口可以有效地減小你的網絡上可能被感染的機器和它們的遠程主服務器進行獨立通訊的機會
還有其餘端口也同樣,像:3133五、2744四、2766五、20034 NetBus、970四、137-139(smb),2049(NFS)端口也應被禁止,我在這寫的也不全,有興趣的朋友應該去查一下相關資料.
 
固然出入更安全的考慮你也能夠包OUTPUT鏈設置成DROP,那你添加的規則就多一些,就像上邊添加
容許SSH登錄同樣.照着寫就好了.
 
下面寫一下更加細緻的規則,就是限制到某臺機器
如:咱們只容許192.168.0.3的機器進行SSH鏈接
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
若是要容許,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的全部IP.
24表示子網掩碼數.但要記得把 /etc/sysconfig/iptables 裏的這一行刪了.
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 由於它表示全部地址均可以登錄.
或採用命令方式:
[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
而後保存,我再說一邊,反是採用命令的方式,只在當時生效,若是想要重起後也起做用,那就要保存.寫入到/etc/sysconfig/iptables文件裏.
[root@tp ~]# /etc/rc.d/init.d/iptables save
這樣寫 !192.168.0.3 表示除了192.168.0.3的ip地址
其餘的規則鏈接也同樣這麼設置.
 
在下面就是FORWARD鏈,FORWARD鏈的默認規則是DROP,因此咱們就寫須要ACCETP(經過)的鏈,對正在轉發鏈的監控.
開啓轉發功能,(在作NAT時,FORWARD默認規則是DROP時,必須作)
[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丟棄壞的TCP包
[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
處理IP碎片數量,防止攻擊,容許每秒100個
[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
設置ICMP包過濾,容許每秒1個包,限制觸發條件是10個包.
[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只因此容許ICMP包經過,就是由於我在這裏有限制.
二,配置一個NAT表放火牆
1,查看本機關於NAT的設置狀況
[root@tp rc.d]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.0.0/24       anywhere            to:211.101.46.235
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   
個人NAT已經配置好了的(只是提供最簡單的代理上網功能,尚未添加防火牆規則).關於怎麼配置NAT,參考個人另外一篇文章
固然你若是尚未配置NAT的話,你也不用清除規則,由於NAT在默認狀況下是什麼都沒有的
若是你想清除,命令是
[root@tp ~]# iptables -F -t nat
[root@tp ~]# iptables -X -t nat
[root@tp ~]# iptables -Z -t nat
 
2,添加規則
添加基本的NAT地址轉換,(關於如何配置NAT能夠看個人另外一篇文章),
添加規則,咱們只添加DROP鏈.由於默認鏈全是ACCEPT.
防止外網用內網IP欺騙
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
[root@tp sysconfig]# iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
  若是咱們想,好比阻止MSN,QQ,BT等的話,須要找到它們所用的端口或者IP,(我的認爲沒有太大必要)
例:
禁止與211.101.46.253的全部鏈接
 [root@tp ~]# iptables -t nat -A PREROUTING  -d 211.101.46.253 -j DROP
禁用FTP(21)端口 
[root@tp ~]# iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
這樣寫範圍太大了,咱們能夠更精確的定義.
[root@tp ~]# iptables -t nat -A PREROUTING  -p tcp --dport 21 -d 211.101.46.253 -j DROP
這樣只禁用211.101.46.253地址的FTP鏈接,其餘鏈接還能夠.如web(80端口)鏈接.
按照我寫的,你只要找到QQ,MSN等其餘軟件的IP地址,和端口,以及基於什麼協議,只要照着寫就好了.
 
最後:
drop非法鏈接
[root@tp ~]# iptables -A INPUT   -m state --state INVALID -j DROP
[root@tp ~]# iptables -A OUTPUT  -m state --state INVALID -j DROP
[root@tp ~]# iptables-A FORWARD -m state --state INVALID -j DROP
容許全部已經創建的和相關的鏈接
[root@tp ~]# iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@tp ~]# iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

[root@tp ~]# /etc/rc.d/init.d/iptables save

這樣就能夠寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起做用.

[root@tp ~]# service iptables restart


別忘了保存,不行就寫一部保存一次.你能夠一邊保存,一邊作實驗,看看是否達到你的要求, 

上面的全部規則我都試過,沒有問題.
寫這篇文章,用了我將近1個月的時間.查找資料,本身作實驗,但願對你們有所幫助.若有不全及不完善的地方還請提出.
由於本篇文章以配置爲主.關於IPTABLES的基礎知識及指令命令說明等我會盡快傳上,固然你能夠去網上搜索一下,仍是不少的.
 
 
1、概要
一、防火牆分類
      ①包過濾防火牆(pack filtering)在網絡層對數據包進行選擇過濾,採用訪問控制列表(Access control table-ACL)檢查數據流的源地址,目的地址,源和目的端口,IP等信息。
      ②代理服務器型防火牆
二、iptables基礎
      ①規則(rules):網絡管理員預約義的條件
      ②鏈(chains): 是數據包傳播的路徑
      ③表(tables):內置3個表filter表,nat表,mangle表分別用於實現包過濾網絡地址轉換和包重構的功能
      ④filter表是系統默認的,INPUT表(進入的包),FORWORD(轉發的包),OUTPUT(處理本地生成的包),filter表只能對包進行授受和丟棄的操做。
      ⑤nat表(網絡地址轉換),PREROUTING(修改即將到來的數據包),OUTPUT(修改在路由以前本地生成的數據包),POSTROUTING(修改即將出去的數據包)
      ⑥mangle表,PREROUTING,OUTPUT,FORWORD,POSTROUTING,INPUT
三、其它
   iptables是按照順序讀取規則
   防火牆規則的配置建議
    Ⅰ 規則力求簡單
    Ⅱ 規則的順序很重要
    Ⅲ 儘可能優化規則
    Ⅳ 作好筆記
2、配置
一、iptables命令格式
     iptables [-t 表] -命令 匹配 操做 (大小寫敏感)
   動做選項
     ACCEPT          接收數據包
     DROP             丟棄數據包
     REDIRECT      將數據包從新轉向到本機或另外一臺主機的某一個端口,一般功能實現透明代理或對外開放內網的某些服務
     SNAT             源地址轉換
     DNAT             目的地址轉換
     MASQUERADE       IP假裝
     LOG               日誌功能
二、定義規則
   ①先拒絕全部的數據包,而後再容許須要的數據包
      iptalbes -P INPUT DROP
      iptables -P FORWARD DROP
      iptables -P OUTPUT ACCEPT
   ②查看nat表全部鏈的規則列表
      iptables -t nat -L
   ③增長,插入,刪除和替換規則
     iptables [-t 表名] <-A|I|D|R> 鏈名 [規則編號] [-i|o 網卡名稱] [-p 協議類型] [-s 源ip|源子網] [--sport 源端口號] [-d 目的IP|目標子網] [--dport 目標端口號] [-j 動做]
    參數:-A 增長
               -I 插入
               -D 刪除
               -R 替換

3、例子
①iptables -t filter -A INPUT -s 192.168.1.5 -i eth0 -j DROP
禁止IP爲192.168.1.5的主機從eth0訪問本機②iptables -t filter -I INPUT 2 -s 192.168.5.0/24 -p tcp --dport 80 -j DROP
禁止子網192.168.5.0訪問web服務③iptables -t filter -I INPUT 2 -s 192.168.7.9 -p tcp --dport ftp -j DROP
禁止IP爲192.168.7.9訪問FTP服務
④iptables -t filter -L INPUT
查看filter表中INPUT鏈的規則
⑤iptables -t nat -F
刪除nat表中的全部規則
⑥iptables -I FORWARD -d wwww.playboy.com -j DROP
禁止訪問 www.playboy.com網站
⑦iptables -I FORWARD -s 192.168.5.23 -j DROP
禁止192.168.5.23上網
 
 

iptables經常使用命令

iptables -nv -L 查看iptables列表

iptables -F 清空iptables規則

iptables-save > /etc/sysconfig/iptables 保存iptables規則到文件

service iptables restart 重啓iptables

 

如下是我服務器的iptables配置

複製代碼
# Generated by iptables-save v1.4.7 on Tue Jul  5 12:06:29 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4:4940]
-A INPUT -i lo -j ACCEPT #容許本地迴環
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #容許服務器訪問外網,例如curl,wget
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #容許全部IP訪問網站
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT #容許ping請求
-A INPUT -s 61.149.47.34/32 -p tcp -m tcp --dport 3306 -j ACCEPT #容許公司IP訪問MySQL
-A INPUT -s 61.149.47.34/32 -p tcp -m tcp --dport 6379 -j ACCEPT #容許公司IP訪問Redis
-A INPUT -p tcp -m multiport --dports 8081,10050,65008 -j ACCEPT #容許全部IP訪問8081,10050,65008端口,ps:65008是個人ssh端口
-A INPUT -j REJECT --reject-with icmp-port-unreachable #拒絕全部的IP訪問全部的端口
COMMIT
# Completed on Tue Jul  5 12:06:29 2016
複製代碼

 

 

防止攻擊

複製代碼
防範DDOS攻擊腳本
#防止DOS太多鏈接進來,能夠容許外網網卡每一個IP最多15個初始鏈接,超過的丟棄 
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP 
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

防範CC攻擊
(1)控制單個IP的最大併發鏈接數
iptables -I INPUT -p tcp --dport 80 -m connlimit  --connlimit-above 50 -j REJECT #容許單個IP的最大鏈接數爲 30
(2)控制單個IP的某段時間的鏈接數
iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j REJECT
iptables -A INPUT -p icmp -j DROP
複製代碼

 

 

 

如下轉載

 

一:前言
 
防火牆,其實說白了講,就是用於實現Linux下訪問控制的功能的,它分爲硬件的或者軟件的防火牆兩種。不管是在哪一個網絡中,防火牆工做的地方必定是在網絡的邊緣。而咱們的任務就是須要去定義到底防火牆如何工做,這就是防火牆的策略,規則,以達到讓它對出入網絡的IP、數據進行檢測。
 
目前市面上比較常見的有三、4層的防火牆,叫網絡層的防火牆,還有7層的防火牆,實際上是代理層的網關。
 
對於TCP/IP的七層模型來說,咱們知道第三層是網絡層,三層的防火牆會在這層對源地址和目標地址進行檢測。可是對於七層的防火牆,無論你源端口或者目標端口,源地址或者目標地址是什麼,都將對你全部的東西進行檢查。因此,對於設計原理來說,七層防火牆更加安全,可是這卻帶來了效率更低。因此市面上一般的防火牆方案,都是二者結合的。而又因爲咱們都須要從防火牆所控制的這個口來訪問,因此防火牆的工做效率就成了用戶可以訪問數據多少的一個最重要的控制,配置的很差甚至有可能成爲流量的瓶頸。
 
二:iptables 的歷史以及工做原理
 
1.iptables的發展:
 
iptables的前身叫ipfirewall (內核1.x時代),這是一個做者從freeBSD上移植過來的,可以工做在內核當中的,對數據包進行檢測的一款簡易訪問控制工具。可是ipfirewall工做功能極其有限(它須要將全部的規則都放進內核當中,這樣規則纔可以運行起來,而放進內核,這個作法通常是極其困難的)。當內核發展到2.x系列的時候,軟件改名爲ipchains,它能夠定義多條規則,將他們串起來,共同發揮做用,而如今,它叫作iptables,能夠將規則組成一個列表,實現絕對詳細的訪問控制功能。
 
他們都是工做在用戶空間中,定義規則的工具,自己並不算是防火牆。它們定義的規則,可讓在內核空間當中的netfilter來讀取,而且實現讓防火牆工做。而放入內核的地方必需要是特定的位置,必須是tcp/ip的協議棧通過的地方。而這個tcp/ip協議棧必須通過的地方,能夠實現讀取規則的地方就叫作 netfilter.(網絡過濾器)
 
    做者一共在內核空間中選擇了5個位置,
    1.內核空間中:從一個網絡接口進來,到另外一個網絡接口去的
    2.數據包從內核流入用戶空間的
    3.數據包從用戶空間流出的
    4.進入/離開本機的外網接口
    5.進入/離開本機的內網接口
        
2.iptables的工做機制
 
從上面的發展咱們知道了做者選擇了5個位置,來做爲控制的地方,可是你有沒有發現,其實前三個位置已經基本上能將路徑完全封鎖了,可是爲何已經在進出的口設置了關卡以後還要在內部卡呢? 因爲數據包還沒有進行路由決策,還不知道數據要走向哪裏,因此在進出口是沒辦法實現數據過濾的。因此要在內核空間裏設置轉發的關卡,進入用戶空間的關卡,從用戶空間出去的關卡。那麼,既然他們沒什麼用,那咱們爲何還要放置他們呢?由於咱們在作NAT和DNAT的時候,目標地址轉換必須在路由以前轉換。因此咱們必須在外網然後內網的接口處進行設置關卡。        
 
 這五個位置也被稱爲五個鉤子函數(hook functions),也叫五個規則鏈。
1.PREROUTING (路由前)
2.INPUT (數據包流入口)
3.FORWARD (轉發管卡)
4.OUTPUT(數據包出口)
5.POSTROUTING(路由後)
        這是NetFilter規定的五個規則鏈,任何一個數據包,只要通過本機,必將通過這五個鏈中的其中一個鏈。       
 
3.防火牆的策略
 
防火牆策略通常分爲兩種,一種叫「通」策略,一種叫「堵」策略,通策略,默認門是關着的,必需要定義誰能進。堵策略則是,大門是洞開的,可是你必須有身份認證,不然不能進。因此咱們要定義,讓進來的進來,讓出去的出去,因此通,是要全通,而堵,則是要選擇。當咱們定義的策略的時候,要分別定義多條功能,其中:定義數據包中容許或者不容許的策略,filter過濾的功能,而定義地址轉換的功能的則是nat選項。爲了讓這些功能交替工做,咱們制定出了「表」這個定義,來定義、區分各類不一樣的工做功能和處理方式。
 
咱們如今用的比較多個功能有3個:
1.filter 定義容許或者不容許的
2.nat 定義地址轉換的 
                3.mangle功能:修改報文原數據
 
咱們修改報文原數據就是來修改TTL的。可以實現將數據包的元數據拆開,在裏面作標記/修改內容的。而防火牆標記,其實就是靠mangle來實現的。
 
小擴展:
對於filter來說通常只能作在3個鏈上:INPUT ,FORWARD ,OUTPUT
對於nat來說通常也只能作在3個鏈上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle則是5個鏈均可以作:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
 
iptables/netfilter(這款軟件)是工做在用戶空間的,它可讓規則進行生效的,自己不是一種服務,並且規則是當即生效的。而咱們iptables如今被作成了一個服務,能夠進行啓動,中止的。啓動,則將規則直接生效,中止,則將規則撤銷。 
iptables還支持本身定義鏈。可是本身定義的鏈,必須是跟某種特定的鏈關聯起來的。在一個關卡設定,指定當有數據的時候專門去找某個特定的鏈來處理,當那個鏈處理完以後,再返回。接着在特定的鏈中繼續檢查。
 
注意:規則的次序很是關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。
 
三.規則的寫法:
 
 iptables定義規則的方式比較複雜:
 格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
 -t table :3個filter nat mangle
 COMMAND:定義如何對規則進行管理
 chain:指定你接下來的規則究竟是在哪一個鏈上操做的,當定義策略的時候,是能夠省略的
 CRETIRIA:指定匹配標準
 -j ACTION :指定如何進行處理
 
 好比:不容許172.16.0.0/24的進行訪問。
 iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
 固然你若是想拒絕的更完全:
 iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT
 
 iptables -L -n -v #查看定義規則的詳細信息
 
四:詳解COMMAND:
 
1.鏈管理命令(這都是當即生效的)
-P :設置默認策略的(設定默認門是關着的仍是開着的)
默認策略通常只有兩種
iptables -P INPUT (DROP|ACCEPT)  默認是關的/默認是開的
好比:
iptables -P INPUT DROP 這就把默認規則給拒絕了。而且沒有定義哪一個動做,因此關於外界鏈接的全部規則包括Xshell鏈接之類的,遠程鏈接都被拒絕了。
        -F: FLASH,清空規則鏈的(注意每一個鏈的管理權限)
    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的全部鏈
        -N:NEW 支持用戶新建一個鏈
            iptables -N inbound_tcp_web 表示附在tcp表上用於檢查web的。
        -X: 用於刪除用戶自定義的空鏈
            使用方法跟-N相同,可是在刪除以前必需要將裏面的鏈給清空昂了
        -E:用來Rename chain主要是用來給用戶自定義的鏈重命名
            -E oldname newname
         -Z:清空鏈,及鏈中默認規則的計數器的(有兩個計數器,被匹配到多少個數據包,多少個字節)
            iptables -Z :清空
 
2.規則管理命令
         -A:追加,在當前鏈的最後新增一個規則
         -I num : 插入,把當前規則插入爲第幾條。
            -I 3 :插入爲第三條
         -R num:Replays替換/修改第幾條規則
            格式:iptables -R 3 …………
         -D num:刪除,明確指定刪除第幾條規則
        
3.查看管理命令 「-L」
 附加子命令
 -n:以數字的方式顯示ip,它會將ip直接顯示出來,若是不加-n,則會將ip反向解析成主機名。
 -v:顯示詳細信息
 -vv
 -vvv :越多越詳細
 -x:在計數器上顯示精確值,不作單位換算
 --line-numbers : 顯示規則的行號
 -t nat:顯示全部的關卡的信息
 
五:詳解匹配標準
 
1.通用匹配:源地址目標地址的匹配
 -s:指定做爲源地址匹配,這裏不能指定主機名稱,必須是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
並且地址能夠取反,加一個「!」表示除了哪一個IP以外
 -d:表示匹配目標地址
 -p:用於匹配協議的(這裏的協議一般有3種,TCP/UDP/ICMP)
 -i eth0:從這塊網卡流入的數據
流入通常用在INPUT和PREROUTING上
 -o eth0:從這塊網卡流出的數據
流出通常在OUTPUT和POSTROUTING上
        
2.擴展匹配
2.1隱含擴展:對協議的擴展
    -p tcp :TCP協議的擴展。通常有三種擴展
--dport XX-XX:指定目標端口,不能指定多個非連續端口,只能指定單個端口,好比
--dport 21  或者 --dport 21-23 (此時表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的標誌位(SYN,ACK,FIN,PSH,RST,URG)
    對於它,通常要跟兩個參數:
1.檢查的標誌位
2.必須爲1的標誌位
--tcpflags syn,ack,fin,rst syn   =    --syn
表示檢查這4個位,這4個位中syn必須爲1,其餘的必須爲0。因此這個意思就是用於檢測三次握手的第一次包的。對於這種專門匹配第一包的SYN爲1的包,還有一種簡寫方式,叫作--syn
    -p udp:UDP協議的擴展
        --dport
        --sport
    -p icmp:icmp數據報文的擴展
        --icmp-type:
echo-request(請求回顯),通常用8 來表示
因此 --icmp-type 8 匹配請求回顯數據包
echo-reply (響應的數據包)通常用0來表示
                  
2.2顯式擴展(-m)
     擴展各類模塊
      -m multiport:表示啓用多端口擴展
      以後咱們就能夠啓用好比 --dports 21,23,80
                  
        
六:詳解-j ACTION
 
 經常使用的ACTION:
 DROP:悄悄丟棄
通常咱們多用DROP來隱藏咱們的身份,以及隱藏咱們的鏈表
 REJECT:明示拒絕
 ACCEPT:接受
custom_chain:轉向一個自定義的鏈
 DNAT
 SNAT
 MASQUERADE:源地址假裝
 REDIRECT:重定向:主要用於實現端口重定向
 MARK:打防火牆標記的
 RETURN:返回
在自定義鏈執行完畢後使用返回,來返回原規則鏈。
 
練習題1:
     只要是來自於172.16.0.0/16網段的都容許訪問我本機的172.16.100.1的SSHD服務
     分析:首先確定是在容許表中定義的。由於不須要作NAT地址轉換之類的,而後查看咱們SSHD服務,在22號端口上,處理機制是接受,對於這個表,須要有一來一回兩個規則,若是咱們容許也好,拒絕也好,對於訪問本機服務,咱們最好是定義在INPUT鏈上,而OUTPUT再予以定義就好。(會話的初始端先定義),因此加規則就是:
     定義進來的: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
     定義出去的: iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
     將默認策略改爲DROP:
  iptables -P INPUT DROP
  iptables -P OUTPUT DROP
  iptables -P FORWARD DROP
        
七:狀態檢測:
 
是一種顯式擴展,用於檢測會話之間的鏈接關係的,有了檢測咱們能夠實現會話間功能的擴展
        什麼是狀態檢測?對於整個TCP協議來說,它是一個有鏈接的協議,三次握手中,第一次握手,咱們就叫NEW鏈接,而從第二次握手之後的,ack都爲1,這是正常的數據傳輸,和tcp的第二次第三次握手,叫作已創建的鏈接(ESTABLISHED),還有一種狀態,比較詭異的,好比:SYN=1 ACK=1 RST=1,對於這種咱們沒法識別的,咱們都稱之爲INVALID沒法識別的。還有第四種,FTP這種古老的擁有的特徵,每一個端口都是獨立的,21號和20號端口都是一去一回,他們之間是有關係的,這種關係咱們稱之爲RELATED。
因此咱們的狀態一共有四種:
        NEW
        ESTABLISHED
        RELATED
        INVALID
 
因此咱們對於剛纔的練習題,能夠增長狀態檢測。好比進來的只容許狀態爲NEW和ESTABLISHED的進來,出去只容許ESTABLISHED的狀態出去,這就能夠將比較常見的反彈式木馬有很好的控制機制。
        
對於練習題的擴展:
進來的拒絕出去的容許,進來的只容許ESTABLISHED進來,出去只容許ESTABLISHED出去。默認規則都使用拒絕
iptables -L -n --line-number  :查看以前的規則位於第幾行
    改寫INPUT
        iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
 
    此時若是想再放行一個80端口如何放行呢?
        iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 
        iptables -R INPUT 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT
 
練習題2:
假如咱們容許本身ping別人,可是別人ping本身ping不通如何實現呢?
分析:對於ping這個協議,進來的爲8(ping),出去的爲0(響應).咱們爲了達到目的,須要8出去,容許0進來
 
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在進來的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
 
小擴展:對於127.0.0.1比較特殊,咱們須要明肯定義它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
 
八:SNAT和DNAT的實現
 
因爲咱們如今IP地址十分緊俏,已經分配完了,這就致使咱們必需要進行地址轉換,來節約咱們僅剩的一點IP資源。那麼經過iptables如何實現NAT的地址轉換呢?
 
1.SNAT基於原地址的轉換
基於原地址的轉換通常用在咱們的許多內網用戶經過一個外網的口上網的時候,這時咱們將咱們內網的地址轉換爲一個外網的IP,咱們就能夠實現鏈接其餘外網IP的功能。
因此咱們在iptables中就要定義到底如何轉換:
定義的樣式:
好比咱們如今要將全部192.168.10.0網段的IP在通過的時候全都轉換成172.16.100.1這個假設出來的外網地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
這樣,只要是來自本地網絡的試圖經過網卡訪問網絡的,都會被通通轉換成172.16.100.1這個IP.
那麼,若是172.16.100.1不是固定的怎麼辦?
咱們都知道當咱們使用聯通或者電信上網的時候,通常它都會在每次你開機的時候隨機生成一個外網的IP,意思就是外網地址是動態變換的。這時咱們就要將外網地址換成 MASQUERADE(動態假裝):它能夠實現自動尋找到外網地址,而自動將其改成正確的外網地址。因此,咱們就須要這樣設置:
         iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
         這裏要注意:地址假裝並不適用於全部的地方。
 
2.DNAT目標地址轉換
對於目標地址轉換,數據流向是從外向內的,外面的是客戶端,裏面的是服務器端經過目標地址轉換,咱們可讓外面的ip經過咱們對外的外網ip來訪問咱們服務器不一樣的服務器,而咱們的服務卻放在內網服務器的不一樣的服務器上。
 
    如何作目標地址轉換呢?:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
        目標地址轉換要作在到達網卡以前進行轉換,因此要作在PREROUTING這個位置上
 
九:控制規則的存放以及開啓
 
注意:你所定義的全部內容,當你重啓的時候都會失效,要想咱們可以生效,須要使用一個命令將它保存起來
1.service iptables save 命令
它會保存在/etc/sysconfig/iptables這個文件中
    2.iptables-save 命令
iptables-save > /etc/sysconfig/iptables
 
    3.iptables-restore 命令
開機的時候,它會自動加載/etc/sysconfig/iptabels
若是開機不能加載或者沒有加載,而你想讓一個本身寫的配置文件(假設爲iptables.2)手動生效的話:
iptables-restore < /etc/sysconfig/iptables.2
則完成了將iptables中定義的規則手動生效
 
 

防火牆之地址轉換SNAT DNAT

 

1、SNAT源地址轉換。

一、原理:在路由器後(PSOTROUTING)將內網的ip地址修改成外網網卡的ip地址。

二、應用場景:共享內部主機上網。

三、設置SNAT:網關主機進行設置。

 (1)設置ip地址等基本信息。

 (2)開啓路由功能:

 sed -i '/ip-forward/s/0/1/g'

 sysctl -p 

 (3)編寫規則:

 iptables -t nat -I POSTROUTING -o 外網網卡 -s 內網網段 -j SNAT --to-source 外網ip地址  #適用於外網ip地址固定場景

 iptables -t nat -I POSTROUTING -o 外網網卡 -s 內網網段 -j MASQUERADE  #適用於共享動態ip地址上網(如adsl撥號,dhcp獲取外網ip)

(4)作好安全控制:使用FORWARD時機進行控制,嚴格設置INPUT規則。

 

2、DNAT目的地址轉換:

一、原理:在路由前(PREROUTING)未來自外網訪問網關公網ip及對應端口的目的ip及端口修改成內部服務器的ip及端口,實現發佈內部服務器。

二、應用場景:發佈內部主機服務。

三、設置DNAT:網關主機上設置。

(1)設置ip、開啓路由、設置SNAT

(2)編寫防火牆規則:

iptables -t nat -I PREROUTING -i 外網網卡 -d 外網ip tcp --dport 發佈的端口 -j DNAT --to-destination 內網服務ip:端口

 

wKiom1Zf6Prws3gnAAC0pbsL51w942.png

 

NAT network address translation

 

僅從報文請求來看,能夠分爲:

 

  SNAT 源地址轉換

  DNAT 目標地址轉換

  PNAT 端口轉換

 

NAT server:能根據須要實現SNAT DNAT PNAT

 

並不是是用戶空間的進程完成轉換功能,靠的是內核中的地址轉換規則

 

私有IP客戶端訪問互聯網的方法

 

SNAT 、PROXY

 

SNAT:主要用於實現內網客戶端訪問外部主機時使用(局域網上網用)

 

定義在POSTROUTING鏈上

 

  iptables -t nat -A postrouting -s 內部網絡地址或主機地址 -j SNAT --to-source NAT服務器上的某外部地址

 

另一個target

 

MASQUERADE地址假裝(適用於PPPOE撥號上網,假設eth1是出口)

 

iptables -t nat -A postrouting -s 內部網絡或主機地址 -o eth1 -j MASQUERADE

 

DNAT:主要用於內部服務器被外網訪問(發佈服務)

 

 

定義在PREROUTING

 

iptables -t nat -A PREROUTING -d NAT服務器的某外部地址 -p 某協議 --dport 某端口 -j DNAT --to-destination 內網服務器地址[:port]

 

 

注意:NAT服務器須要打開數據轉發

 

echo 1 > /proc/sys/net/ipv4/ip_forward

 

或者修改/etc/sysctl.conf net.ipv4.ip_forward = 1

 

實驗操做

SNAT、DNAT

 

 

 

實驗一:

SNAT

 

規劃主機A 做爲SNAT server

 

eth0 ip地址172.20.1.10(外部地址),eth1 192.168.1.1(內部地址)

 

主機B當作局域網內主機

 

eth0 ip地址192.168.1.2 默認路由要指向192.168.1.1

 

SNAT server:

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.20.1.10

 

 

#上面和咱們實例操做相同

 

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

 

主機B ping外部的其它主機(172.20.1.20模擬互聯網上的主機)

 

 

DNAT

wKioL1hDdNSjHZSiAABNgMvOK4I566.png-wh_50

 

 

[root@nat ~]# iptables -t filter -F 

[root@nat ~]# iptables -t nat -F

[root@nat ~]# iptables -t nat -A PREROUTING -d 10.1.249.125 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.4

Chain PREROUTING (policy ACCEPT)

target     prot opt source               destination         

DNAT       tcp  --  0.0.0.0/0            10.1.249.125        tcp dpt:80 to:192.168.2.4

 

[root@nat ~]# netstat -tln | grep "\<80\>"  此時本機上並無開放80端口

 

[root@wai ~]# curl http://10.1.249.125

hello  --> 此時咱們訪問爲 nat 主機上的80端口  由上面可知,此服務器上並無開放80,而是將請求送往 後端服務器

 

 

 

實體案例

 

咱們有一臺機器A能夠上外網,配置eth0=192.168.1.1,eth1=222.13.56.192

 

有6臺機器只有內網IP ,分別是192.168.1.102~192.168.1.108,想讓這6臺機器經過機器A上網

 

在機器A 防火牆上配置以下便可

 

/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.101 -j SNAT --to-source 222.13.56.192

/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.102 -j SNAT --to-source 222.13.56.192

/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.103 -j SNAT --to-source 222.13.56.192

/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.104 -j SNAT --to-source 222.13.56.192

/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.105 -j SNAT --to-source 222.13.56.192

/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.108 -j SNAT --to-source 222.13.56.192

 

 

在 6臺機器上路由顯示

 

route  -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 em1

169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 em1

0.0.0.0         192.168.1.1   0.0.0.0         UG    0      0        0 em1

 

 

                                                 ​iptables中DNAT轉發的配置方法​


​1.一對一流量徹底DNAT


首先說一下網絡環境,普通主機一臺作防火牆用,網卡兩塊

eth0 192.168.0.1  內網

eth1 202.202.202.1 外網

內網中一臺主機 192.168.0.101

如今要把外網訪問202.202.202.1的全部流量映射到192.168.0.101上

命令以下:

#將防火牆改成轉發模式  
echo 1 > /proc/sys/net/ipv4/ip_forward  
iptables -F  
iptables -t nat -F  
iptables -t mangle -F  
iptables -X  
iptables -t nat -X  
iptables -t mangle -X  
  
iptables -A INPUT -i lo -j ACCEPT  
iptables -A OUTPUT -o lo -j ACCEPT  
  
iptables -P INPUT ACCEPT  
iptables -P OUTPUT ACCEPT  
iptables -P FORWARD ACCEPT  
  
iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101  

iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1   

2.多對多流量徹底DNAT

說是多對多,實際上這裏的配置是指定了多個一對一

環境:
eth0 192.168.0.1  內網

eth1 202.202.202.1 、202.202.202.2 外網

內網中2臺主機 192.168.0.10一、192.168.0.102

如今要把外網訪問202.202.202.1的全部流量映射到192.168.0.101上,同時把把外網訪問202.202.202.2的全部流量映射到192.168.0.102上

這裏順便提一下如何爲網卡配置多個IP

ifconfig eth1:1 202.202.202.2 netmask 255.255.255.0 up  

#將防火牆改成轉發模式  
echo 1 > /proc/sys/net/ipv4/ip_forward  
iptables -F  
iptables -t nat -F  
iptables -t mangle -F  
iptables -X  
iptables -t nat -X  
iptables -t mangle -X  
  
iptables -A INPUT -i lo -j ACCEPT  
iptables -A OUTPUT -o lo -j ACCEPT  
  
iptables -P INPUT ACCEPT  
iptables -P OUTPUT ACCEPT  
iptables -P FORWARD ACCEPT  
  
iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101  
iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1  
  


iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102  
iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1  


3.一對多根據協議DNAT

 這個最經常使用,通常是內網或DMZ區內有多個應用服務器,能夠將不一樣的應用流量映射到不一樣的服務器上

環境:
eth0 192.168.0.1  內網

eth1 202.202.202.1  外網

內網中2臺主機 192.168.0.101(Web服務器)、192.168.0.102(郵件服務器)

如今要把外網訪問202.202.202.1的Web流量映射到192.168.0.101上,同時把把外網訪問202.202.202.1的郵件訪問流量映射到192.168.0.102上

命令以下:

#將防火牆改成轉發模式  
echo 1 > /proc/sys/net/ipv4/ip_forward  
iptables -F  
iptables -t nat -F  
iptables -t mangle -F  
iptables -X  
iptables -t nat -X  
iptables -t mangle -X  
  
iptables -A INPUT -i lo -j ACCEPT  
iptables -A OUTPUT -o lo -j ACCEPT  
  
iptables -P INPUT ACCEPT  
iptables -P OUTPUT ACCEPT  
iptables -P FORWARD ACCEPT  
  

#Web訪問設置​
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.101:80  
iptables -t nat -A POSTROUTING -d 192.168.0.101 -p tcp --dport 80 -j SNAT --to 192.168.0.1  

#郵件訪問設置
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.102:25  
iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 25 -j SNAT --to 192.168.0.1  

  
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.102:110  
iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 110 -j SNAT --to 192.168.0.1  




​SNAT:源地址轉換,代理內部客戶端訪問外部網絡

   目標地址不變,從新改寫源地址,並在本機創建NAT表項,當數據返回時,根據NAT表將目的地址數據改寫爲數據發送出去時候的源地址,併發送給主機,目前基本都是解決內網用戶用同一個公網IP地址上網的狀況。

 

DNAT:目標地址轉換,將內部服務器發佈至外部網絡

   和SNAT相反,源地址不變,從新修改目標地址,在本機創建NAT表項,當數據返回時,根據NAT表將源地址修改成數據發送過來時的目標地址,併發給遠程主機在DNAT的基礎上,能夠根據請求數據包的端口作PNAT(端口轉換,也稱爲端口映射),能夠根據請求數據包不一樣的端口改寫不一樣的目標地址,從而發送給不一樣的主機這在用一個公網地址作不一樣服務時用的比較多,並且相對來講,用NAT的方式能夠隱藏後端服務器的真實地址,比較安全。

 

 

SNAT的數據流向過程

   首先進入PREROUTING,發現不是本網段的地址,然後開始查找路由表(查找路由的過程在PREROUTING和FORWARD之間),因而通過FORWARD鏈進行轉發,在經過POSTROUTING時進行NAT轉換。在這個流程中,NAT轉換的步驟在POSTROUTING鏈上實現,之因此再也不PREROUTING上作NAT是由於數據包在進來以前,還不知道是本網段地址仍是外網地址。

 

DNAT的數據流向過程

   在DNAT中,NAT要在PREROUTING鏈上作。在數據進入主機後,路由選擇過程是在PREROUTING和FORWARD之間的,因此應該先作地址轉換以後再進行路由選擇,然後通過FORWARD鏈,最後從POSTROUTING鏈出去。

 

 

wKiom1M1KX6Bwo65AACS37wxfhE513.jpg

 

PC1地址:172.16.251.185 網關指向:172.16.251.186

 

route add default gw 172.16.251.186

 

wKioL1M1J9aBxgVzAAHumIyln7s406.jpg

route

wKiom1M1KeDBT33iAACM-fIYL6s921.jpg

NAT服務器地址:172.16.251.185

wKiom1M1KlCCWdhJAALli_xbv4U916.jpg

 

PC2地址:

wKiom1M1MVDAgX7sAAC56n2VxtY835.jpg

 

 

2、SNAT的實現:

 

   一、在咱們作NAT以前,首先要把NAT服務器的路由功能打開,否則數據包過不了FORWARD鏈

 

sysctl -w net.ipv4.ip_forward=1

 

######也可使用文件永久生效,下面值改成1便可

 

vim /etc/sysctl.conf

 

net.ipv4.ip_forward = 1

 

######執行以下命令讓其生效

 

sysctl -p

 

   二、在NAT服務器添加iptables規則如:

 

 

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.254.61

 

#在POSTROUTING鏈上面,未來自源地址爲172.16.0.0/16網段的數據包的源地址都轉換爲192.168.254.61

 

   查看iptables規則:

 

iptables -t nat -L -n -v

wKiom1M1LR3yNdGSAAFFzIGlE9g251.jpg三、下面咱們在PC1上作測試,PC1如今就能夠Ping通PC2主機了,以下圖:

wKiom1M1MbHg1DvRAAE3vMMomjQ544.jpg

 

 

四、PC1 ping PC2,在PC1主機上抓包來測試:

 

tcpdump -i eth0 -v | grep 192

wKioL1M1NT7CX5DbAADQ8tr754E611.jpg

 

3、DNAT的實現:

 

   一、在NAT服務器添加iptables規則如:

 

iptables -t nat -A PREROUTING -d 192.168.254.61 -j DNAT --to-destination 172.16.251.185

#在PREROUTING鏈上面,將請求地址NAT服務器 eth1 192.168.1.254的數據包所有轉發到PC1 172.16.251.185主機上

   查看iptables規則:

 

iptables -t nat -L -n -v

wKiom1M1Sa_jeNfKAADONRUq-os171.jpg

測試:PC1上面作了WEB服務,咱們在PC2上看是否能請求到WEB頁面:

       請求防火牆eth1地址,192.168.254.61

二、在NAT服務器添加iptables規則如:

 

iptables -t nat -A PREROUTING -d 192.168.254.61 -p tcp --dport 80 -j DNAT --to-destination 172.16.251.185:8080

 

#此條規則是將全部請求NAT服務器eth1 192.168.254.61地址的80號端口都轉發到172.16.251.185主機上8080端口,固然前提必須在PC1上面監聽8080端口

 

查看iptables規則:

 

 

基於動態IP地址來作NAT代理內部客戶端來上網

 

若是IP地址是動態獲取的ADSL寬帶來作NAT代理上網實現方式

 

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUEREADE

 

註釋:這裏最好使用"-o"選項來指定出口,MASQUEREADE會自動調用該接口的地址做爲源地址出去。

 

 

 

 

 

 

 

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遠程這個主機,走的就是這個流向;

 

 

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

 

看看實際的效果:

 

 

 

 

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

 

個人ip地址

 

在192.168.1.154上 ssh遠程一下看看

 

再到其餘的主機上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 配置,指定那個網段能夠上網

相關文章
相關標籤/搜索