iptables(17)

本節大綱:
前端

1.iptables簡介
mysql

2.防火牆介紹
linux

3.iptables的優勢
web



1.iptables簡介
算法

iptables是Linux下的配置防火牆的工具,用於配置Linux內核集成的IP信息包過濾系統,使增刪改查信息包過濾表中的規則更加簡單。
sql

 

iptables是與最新的3.5版本Linux內核集成的IP信息包過濾系統。若是Linux系統鏈接到因特網或LAN、服務器或鏈接LAN和因特網的代理服務器,則該系統有利於在Linux系統上更好地控制IP信息包過濾和防火牆配置。
apache


  防火牆在作信息包過濾決定時,有一套遵循和組成的規則,這些規則存儲在專用的信息包過濾表中,而這些表集成在Linux內核中。在信息包過濾表中,規則被分組放在咱們所謂的鏈(chain)中。而netfilter/iptables IP信息包過濾系統是一款功能強大的工具,可用於添加、編輯和移除規則。
vim


  雖然netfilter/iptables IP信息包過濾系統被稱爲單個實體,但它實際上由兩個組件netfilter和iptables組成。
windows

  netfilter組件也稱爲內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
centos

  iptables組件是一種工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。除非您正在使用Red Hat Linux 7.1或更高版本,不然須要下載該工具並安裝使用它。


2.防火牆介紹

Firewall,防火牆,也稱防禦牆,,是一種隔離工具。其工做於主機或網絡的邊緣,對於進出本主機或網絡的報文根據事先定義好的檢測規則做匹配檢測,對於可以被規則匹配到的報文作出相應處理。

  防火牆有主機防火牆和網絡防火牆,主機防火牆主要用來監測和處理流經本主機的數據包;網絡防火牆則是用來監測和處理流經本防火牆的數據包。


  與Linux內核各版本集成的防火牆歷史版本:

    2.0.x內核:ipfwadm

    2.2.x內核:ipchains

    2.4.x內核:iptables


3.iptables的優勢

netfilter/iptables的最大優勢是它能夠配置有狀態的防火牆,這是ipfwadm和ipchains等之前的工具都沒法提供的一種重要功能。


有狀態的防火牆可以指定並記住爲發送或接收信息包所創建的鏈接的狀態。防火牆能夠從信息包的鏈接跟蹤狀態得到該信息。在決定新的信息包過濾時,防火牆使用的這些狀態信息能夠增長其效率和速度。這裏有四種有效狀態,名稱分別爲ESTABLISHED、INVALID、NEW和RELATED。

ESTABLISHED:指出該信息包屬於已創建的鏈接,該鏈接一直用於發送和接收信息包而且徹底有效。

INVALID:指出該信息包與任何已知的流或鏈接都不相關聯,它可能包含錯誤的數據或頭。

NEW:意味着該信息包已經或將啓動新的鏈接,或者它與還沒有用於發送和接收信息包的鏈接相關聯。

RELATED:表示該信息包正在啓動新鏈接,以及它與已創建的鏈接相關聯。


netfilter/iptables的另外一個重要優勢是,它使用戶能夠徹底控制防火牆配置和信息包過濾。用戶能夠定製本身的規則來知足特定需求,從而只容許想要的網絡流量進入系統。


另外,netfilter/iptables是免費的,這對於那些想要節省費用的人來講十分理想,它能夠代替昂貴的防火牆解決方案。


4.防火牆的類型


包過濾防火牆:

包過濾是IP層實現,包過濾根據在網絡層對數據包的源IP、目的IP、協議類型(TCP/UDP/ICMP)、源端口、目的端口等包頭信息及數據包傳輸方向燈信息來判斷是否容許數據包經過。


應用層防火牆:

也稱爲應用層代理防火牆,基於應用層協議的信息流檢測,能夠攔截某應用程序的全部封包,提取包內容進行分析。有效防止SQL注入或者XSS(跨站腳本***)之類的惡意代碼。實現七層的包過濾


狀態檢測防火牆:

TCP有三次握手的階段,經常使用的WEB,文件下載,發送和接收郵件等等都是TCP。結合包過濾和應用層防火牆優勢,基於鏈接狀態檢測機制,將屬於同一鏈接的全部包做爲一個總體的數據流看待,構成鏈接狀態表(通訊信息,應用程序信息等),經過規則表與狀態表共同配合,對錶中的各個鏈接狀態判斷。


5.iptables數據包過濾匹配流程

默認防火牆規則


拒絕與禁止一個數據包

IP防火牆的數據包傳輸

在IP防火牆中,有三個內建的過濾規則鏈被使用。全部到達接口的數據包都按照輸入規則鏈被過濾。若是數據包被接受,它會被送到路由模塊。路由功能決定數據包是被送到本地仍是轉發到另外一個出站接口。

若是被轉發,數據包會由轉發規則鏈進行第二次過濾。若是數據包被接受,它會被送到輸出規則鏈。

本地產生的出站數據包和將被轉發的數據包都要通過輸出規則鏈。若是數據包被接受,它會被送出接口。

迴環路徑包括兩個規則鏈,如圖示。每個迴環數據包在出迴環接口以前須要經過輸出規則鏈,在那裏它會被送到迴環的輸入接口,而後輸入規則鏈被應用。


iptables添加規則的考量點

 添加規則的考量點:

 a) 要實現哪一種功能:判斷添加在哪張表上

 b) 報文流經的路徑:判斷添加在哪一個鏈上


iptables處理的優先級次序

 鏈:鏈上規則的次序,即爲檢查的次序,所以隱含必定的法則

 a) 同類規則(訪問同一應用),匹配範圍小的放上面

 b)不一樣類規則(訪問不一樣應用),匹配到報文頻率較大的放上面

 c) 將那些可由一條規則描述的多個規則合併爲一個

 d) 設置默認策略


功能的優先級次序:raw --> mangle --> nat --> filter



6.iptables規則

6.1.iptables規則的組成

  iptables規則的組成部分:報文的匹配條件,匹配到以後的處理動做

    匹配條件:根據協議報文特徵指定

      基本匹配條件:源IP,目標IP,源端口,目標端口

      擴展匹配條件:鏈接追蹤,狀態追蹤

    處理動做:

      內建處理機制

      自定義處理機制

    注意:報文不會通過自定義鏈,只能在內置鏈上經過規則進行引用後生效


6.2 iptables規則管理工具

  iptables是一種規則管理工具,可實現iptables規則的添加、修改、刪除和顯示等功能。

  規則和鏈有計數器:

    pkts:表示由規則或鏈所匹配到的報文的個數

    bytes:表示由規則或鏈所匹配到的全部報文大小之和


  iptables命令:

  說明:

    iptables是用來設置、維護和檢查Linux內核的IP包過濾規則的。

    能夠定義不一樣的表,每一個表都包含幾個內部的鏈,也能包含用戶定義的鏈。每一個鏈都是一個規則列表,對對應的包進行匹配;每條規則指定應當如何處理與之相匹配的包。這被稱做「target」,也能夠跳向同一個表內的用戶定義的鏈。


    targets:

    防火牆的規則指定所檢查包的特徵和目標。若是包不匹配,將送往該鏈中下一條規則檢查;若是匹配,則下一條規則由目標值肯定。該目標值能夠是用戶定義的鏈名,或是某個專用值,如ACCEPT,DROP,QUEUE或者RETURN。


語法:

 

iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name

iptables分爲四表五鏈,表是鏈的容器,鏈是規則的容器,規則指定動做。

四表:

解釋 表中的鏈

filter

用於包過濾 

INPUT、OUTPUT和FORWARD

nat

網絡地址轉發

PREROUTING、POSTROUTING和OUTPUT

mangle

對特定數據包修改

PREROUTING、POSTROUTING、INPUT、OUTPUT和FORWARD

raw

不作數據包連接跟蹤,對原始數據包的處理

PREROUTING和OUTPUT

說明:nat說白了就是容許一個內網地址塊,經過NAT轉換成公網IP,實現對公網的訪問,解決IP地址不足


五鏈:

INPUT

本機數據包入口

OUTPUT

本機數據包出口

FORWARD

通過本機轉發的數據包

PREROUTING

防火牆以前,修改目的地址(DNAT)

POSTROUTING

防火牆以後,修改源地址(SNAT)

數據包的處理方式不一樣,流經的鏈也不一樣:

數據流入時要通過的鏈:PREROUTING --> INPUT

數據流出時要通過的鏈:OUTPUT --> POSTROUTING

數據轉發時要通過的鏈:PREROUTING --> FORWARD --> POSTROUTING


命令格式:iptables [-t table] 命令 [chain] 匹配條件 動做



規則管理選項:

命令

描述

-A,append

追加一條規則

-I,insert

插入一條規則,默認鏈頭,就是最前面出入一條規則後跟編號,指定第幾條

-D,delete

刪除一條規則

-F,flush

清空規則

-L,list

列出規則

-P,policy

設置鏈缺省規則

-m,module

模塊,好比state、multiport

-n 以數值顯示
-v 顯示統計數據,與-L一塊兒用,看到的信息更多
-z 清空計數器
-x 清空自定義鏈

匹配條件

描述

-i

入口網卡接口

-o

出口網卡接口

-s,source

源地址

-d,destination

目標地址

-p,policy

默認策略

-P, protocol 後接協議名,協議類型

--sport

源端口

--dport

目的端口

-t 後接表名
-j 後接動做

動做

描述

ACCEPT

容許數據包經過

DROP

丟棄數據包不作處理

REJECT

拒絕數據包,並返回報錯信息,這就是和DROP的區別

SNAT

通常用於nat表的POSTROUTING鏈,進行源地址轉換

DNAT

通常用於nat表的PREROUTING鏈,進行目的地址轉換

MASQUERADE

動態源地址轉換,動態IP時使用

LOG 記錄日誌

模塊

描述

state

包狀態,有四個:NEW、RELATED、ESTABLISHED和INVALID

mac

源MAC地址

limit

包速率限制

multiport

多端口,以逗號分隔

iprange

端口範圍,以逗號分隔



 

經常使用options:
-t table:
  filter,nat,mangle,raw

鏈管理選項:
-F:flush,清空規則鏈,若省略鏈則表示清空指定表上的全部的鏈
-N:new,建立新的自定義規則鏈
-X:drop,刪除用戶自定義的空的規則鏈
-Z:zero,清零,置零規則計數器,讓計數器從新開始計數
-P:Policy,爲指定鏈設置默認策略,對filter表中的鏈而言,默認策略一般有ACCEPT,DROP,REJECT
-E:rEname,重命名自定義鏈,引用計數不爲0的自定義鏈沒法更名也沒法刪除

規則管理選項:
-A:append,將新規則追加於指定鏈的尾部
-I:insert,將新規則插入至指定鏈的指定位置,不指定位置則默認插入爲第一條
-D:delete,刪除指定鏈上的指定規則
#  有兩種指定方式:
#  a) 指定匹配條件
#  b) 指定規則編號
-R:replace,替換指定鏈上的指定規則

查看選項:
-L:list,列出指定鏈上的全部規則
-n:numberic,以數字格式顯示地址和端口號
-v:verbose,顯示詳細信息,支持-vv,-vvv
--line-numbers:顯示規則編號
-x:exactly,顯示計數器計數結果的精確值

匹配條件選項:
基本匹配:
[!] -s,--src,--source IP|Netaddr:檢查報文中源IP地址是否符合此處指定的地址範圍
[!] -d,-dst,--destination IP|Netaddr:檢查報文中目標IP地址是否符合此處指定的地址範圍
-p,--protocol {tcp|udp|icmp}:檢查報文中的協議,即IP首部中的protocols所標識的協議
-i,--in-interface IFACE:數據報文的流入接口,僅能用於PREROUTING,INPUT及FORWARD鏈上
-o,--out-interface IFACE:數據報文的流出接口,僅能用於FORWARD,OUTPUT及POSTROUTING鏈上

擴展匹配:-m match_name --spec_options
    例如:-m tcp --dport 22
    隱式擴展:對-p protocol指明的協議進行的擴展,可省略-m選項
-p tcp
  --dport PORT[-PORT]:目標端口,能夠是單個端口或連續多個端口
  --sport PORT[-PORT]:源端口,能夠是單個端口或連續多個端口
  --tcp-flags LIST1 LIST2:檢查LIST1所指明的全部標誌位,且這其中,LIST2所表示出的全部標記位必須爲1,而餘下的必須爲0;沒在LIST1中指明的不做檢查
    SYN,ACK,FIN,RST,PSH,URG
如:
  --tcp-flags SYN,ACK,FIN,RST SYN表示匹配三次握手中的第一次握手,SYN必須爲1,其他的必須爲0
  --syn:表示匹配三次握手中的第一次握手
  
-p udp
  --dport
  --sport
  
-p icmp
  --icmp-type:可用數字表示其類型
    0:echo-reply,響應
    8:echo-request,請求
如:
  iptables -A OUTPUT -s 192.168.1.1 -p icmp --icmp-type 8 -j ACCEPT
  iptables -A INPUT -d 192.168.1.1 -p icmp --icmp-type 0 -j ACCEPT

顯式擴展:必須使用-m選項指定使用的擴展
multiport擴展:以離散方式定義多端口匹配,最多指定15個端口
[!] --source-ports,--sports port[,port |,port:port]...:指定多個源端口
[!] --destination-ports,--dports port[,port |,port:port]...:指定多個目標端口
[!] --ports port[,port |,port:port]...:指定特定端口
如:
iptables -I INPUT -s 192.168.1.0/24 -d 192.168.1.250 -p tcp -m multiport --dports 22,80 -j ACCEPT

iprange擴展:指明連續的(但通常是不能擴展爲整個網絡)ip地址範圍時使用
[!] --src-range from[-to]:指明連續的源IP地址範圍
[!] --dst-range from[-to]:指明連續的目標IP地址範圍
如:
iptables -I INPUT -d 192.168.1.250 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.1.1-192.168.1.249 -j ACCEPT

string擴展:檢查報文中出現的字符串
--algo {bm|kmp}:指定字符串比對算法
[!] --string pattern
[!] --hex-string pattern
如:
iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT表示不管是誰訪問的,只要響應報文中包含movie字符串的所有拒絕掉

time擴展:基於時間作檢查,根據報文到達的時間與指定的時間範圍進行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定起始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定結束日期
--timestart hh:mm[:ss]:指定起始時間
--timestop hh:mm[:ss]:指定結束時間
[!] --monthdays day[,day...]:指定一個月內具體哪幾天
[!] --weekdays day[,day...]:指定一週內具體周幾
如:
-m time --weekdays Sa,Su
-m time --datestart 2007-12-24 --datestop 2007-12-27
-m time --datestart 2007-01-01T17:00 --datestop 2007-01-01T23:59:59
-m time --timestart 12:30 --timestop 13:30
-m time --weekdays Fr --monthdays 22,23,24,25,26,27,28

connlimit擴展:鏈接限制,根據每客戶端IP(也能夠是地址塊(僅centos7支持))作併發鏈接數數量匹配
[!] --connlimit-above n:鏈接的數量大於n
[!] --connlimit-upto n:鏈接的數量小於等於n,centos7上新版的iptables纔有此選項
--connlimit-mask prefix_length
如:
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT

limit擴展:基於收發報文的速率作檢查
--limit rate[/second|/minute|/hour|/day]:指定速率
--limit-burst number:指定峯值

state擴展:狀態擴展,根據鏈接追蹤機制檢查鏈接的狀態
調整鏈接追蹤功能所可以容納的最大鏈接數量:併發量很大的狀況下建議把值調大點
/proc/sys/net/nf_conntrack_max

iptables的連接跟蹤表最大容量爲/proc/sys/net/nf_conntrack_max文件設定的值,連接碰到各類狀態的超時後就會從表中刪除
因此解決方法通常有兩個:
a) 加大ip_conntrack_max值
vim /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216

b) 下降ip_conntrack timeout時間
vim /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait =  60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n

已經追蹤到並記錄下的鏈接:
/proc/net/nf_conntrack

不一樣協議或鏈接類型追蹤的時長:
/proc/sys/net/netfilter/*
可追蹤的鏈接狀態:
NEW:新發出的請求,鏈接追蹤模板中不存在此鏈接相關的信息條目,所以,將其識別爲第一次發來的請求
ESTABLISHED:NEW狀態以後,鏈接追蹤模板中爲其創建的條目失效以前期間內所進行的通訊的狀態
RELATED:相關的鏈接,如ftp協議的命令鏈接與數據鏈接之間的關係
追蹤RELATED狀態的專用模塊:/lib/modules/KERNEL-VERSION/kernel/net/netfilter/nf_conntrack*.ko
INVALIED:沒法識別的鏈接

--state STATE1,STATE2,...:指明要檢查的狀態
例:開放被動模式的ftp服務須要如下幾步:
a) 裝載FTP追蹤時的專用模塊(nfconntrack_ftp.ko)
modprobe nfcontrack_ftp

b) 放行請求報文
命令鏈接:NEW,ESTABLISHED
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED  -j ACCEPT
數據鏈接:RELATED,ESTABLISHED
iptables -I INPUT -d LocalIP -m state --state RELATED,ESTABLISHED -j ACCEPT
c) 放行響應報文
iptables -I OUTPUT -s LocalIP  -m state --state ESTABLISHED -j ACCEPT

目標選項:
-j TARGET:跳轉至指定的TARGET
經常使用的TARGET:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
RETURN:返回調用鏈
REDIRECT:端口重定向
LOG:記錄日誌
MARK:作防火牆標記
DNAT:目標地址轉換
iptables -t nat -A PREROUTING -d ExternalIP -p tcp|udp --dport PORT -j DNAT --to-destination InterServerIP[:PORT]
SNAT:源地址轉換
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j SNAT --to-source ExternalIP
MASQUERADE:地址假裝
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNET -j MASQUERADE
自定義鏈:由自定義鏈上的規則進行匹配檢查
保存及重載規則:
保存規則至指定文件:
iptables-save > /PATH/TO/SOMEFILE
從指定文件重載規則:
iptables-restore < /PATH/FROM/SOMEFILE

CentOS6:
service iptables save    #至關於iptables-save > /etc/sysconfig/iptables
service iptables restore    #至關於iptables-restore < /etc/sysconfig/iptables

CentOS7:引入了新的iptables前端管理服務工具:firewalld
firewall-cmd
firewalld-config

7.示例


 

#!/bin/bash
#防火牆過濾腳本(主機型防火牆)
iptables -t filter -P INPUT ACCEPT    // 首先給2個鏈 的默認策略改爲容許 防止遠程操做斷開
iptables -t filter -P OUTPUT ACCEPT
iptables -F INPUT    //而後清除全部內容
iptables -F OUTPUT
#清除全部內容,上面的能夠合成一個命令iptables -F,默認是filter表
iptables -t nat -F    //清空nat表
iptables -I INPUT -p tcp -m multiport --dport 22,25,80,21,110,143 -j ACCEPT  //填寫規則
iptables -I INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -t filter -P INPUT DROP    //再把默認策略改爲拒絕
iptables -I OUTPUT -p udp --sport 53 -j ACCEPT
iptables -I OUTPUT -p tcp -m multiport --sport 22,25,80,21,110,143 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -t filter -P OUTPUT DROP
#從MAC地址匹配
#根據MAC地址封鎖主機
#iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP

測試各類服務

首先測試www服務

 咱們開放80端口在嘗試,執行上面的腳本

[root@hao ~]# sh fang.sh   //運行腳本

Web服務前面搭建好了

例如:禁止從其餘主機ping主機,可是容許本機ping其餘主機

[root@hao ~]# ping 192.168.129.1

PING 192.168.129.1 (192.168.129.1) 56(84) bytes of data.

64 bytes from 192.168.129.1: icmp_seq=1 ttl=128 time=0.150 ms

64 bytes from 192.168.129.1: icmp_seq=2 ttl=128 time=0.190 ms

64 bytes from 192.168.129.1: icmp_seq=3 ttl=128 time=0.127 ms

64 bytes from 192.168.129.1: icmp_seq=4 ttl=128 time=0.150 ms

64 bytes from 192.168.129.1: icmp_seq=5 ttl=128 time=0.136 ms

64 bytes from 192.168.129.1: icmp_seq=6 ttl=128 time=0.289 ms

64 bytes from 192.168.129.1: icmp_seq=7 ttl=128 time=0.131 ms

64 bytes from 192.168.129.1: icmp_seq=8 ttl=128 time=0.175 ms

可是客戶端ping主機就是不通

這時查看下腳本原件

 默認就是 filter表

 在來測試 dns服務器

 

 加入規則表後 就能夠了

 

能夠正常訪問了!主機型防火牆 安全級別最高 由於 INPUT和OUTPUT  默認策略是拒絕全部!這樣能夠防止防彈******! 

DNAT(Destination Network Address Translation,目的地址轉換) 一般被叫作目的映謝。而SNAT(Source Network Address Translation,源地址轉換)一般被叫作源映謝。

SNAT

 內網訪問 外網

客戶端ip地址

網關指向server的eth0 網卡

 

server的2塊網卡ip地址

 server0的網卡ip地址

 ping測試

 不通

 作防火牆規則

而後作SNAT策略

Nat表裏POSTROUTING鏈 的網卡eth1 (出) 的源目標地址 192.168.80.0/24 轉成 目標ip地址 192.168.90.33

下面一條命令 打開網關路由的轉發 必定要打開

 必定要清空

Filter表

 nat 表

 在來測試

DNAT測試

 讓pc 能訪問內網的ssh 22端口

結果以下

 

 防火牆策略

Nat表裏 PREROUTING鏈 的網卡eth0 的源目標地址 192.168.80.33 tcp 協議 的端口22 轉成 目標ip地址 192.168.90.44 的22端口

[root@jack ~]# iptables -t nat -A PREROUTING -i eth0 -d 192.168.80.33 -p tcp --dport 22 -j DNAT --to 192.168.90.44:22

 

 必定要給內網服務器 加上默認路由

打開網關路由的轉發 必定要打開

 


 

其餘規則示例:
iptables-restore < 規則文件 # 導入防火牆規則
/etc/init.d/iptables save # 保存防火牆設置
/etc/init.d/iptables restart # 重啓防火牆服務
iptables -L -n # 查看規則
iptables -t nat -nL # 查看轉發
iptables -L INPUT # 列出某規則鏈中的全部規則
iptables -X allowed # 刪除某個規則鏈 ,不加規則鏈,清除全部非內建的
iptables -Z INPUT # 將封包計數器歸零
iptables -N allowed # 定義新的規則鏈
iptables -P INPUT DROP # 定義過濾政策

開啓與刪除端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 容許TCP的22端口訪問
# 若是OUTPUT 設置成DROP的,要寫上下面一條
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
# 注:不寫致使沒法SSH.其餘的端口同樣,OUTPUT設置成DROP的話,也要添加一條鏈
# 若是開啓了web服務器,OUTPUT設置成DROP的話,一樣也要添加一條鏈
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
# 作WEB服務器,開啓80端口 ,其餘同理
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 作郵件服務器,開啓25,110端口
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# 容許icmp包經過,容許ping
iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT設置成DROP的話)
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)
iptables -I INPUT -p udp --dport 53 -j ACCEPT # 容許UDP的53端口訪問,插入在第一條
iptables -A INPUT -p tcp --dport 22:25 -j ACCEPT # 容許端口範圍訪問
iptables -D INPUT -p tcp --dport 22:25 -j ACCEPT # 刪除這條規則

# 容許多個TCP端口訪問
iptables -A INPUT -p tcp -m multiport --dports 22,80,8080 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 容許192.168.1.0段IP訪問
iptables -A INPUT -s 192.168.1.10 -j DROP # 對1.10數據包丟棄
iptables -A INPUT -i eth0 -p icmp -j DROP # eth0網卡ICMP數據包丟棄,也就是禁ping

# 容許來自lo接口,若是沒有這條規則,將不能經過127.0.0.1訪問本地服務
iptables -A INPUT -i lo -j ACCEPT

# 限制併發鏈接數,超過30個拒絕
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j REJECT

# 限制每一個IP每秒併發鏈接數最大3個
iptables -I INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

# iptables服務器做爲網關時,內網訪問公網
iptables –t nat -A POSTROUTING -s [內網IP或網段] -j SNAT --to [公網IP]

# 訪問iptables公網IP端口,轉發到內網服務器端口
iptables –t nat -A PREROUTING -d [對外IP] -p tcp --dport [對外端口] -j DNAT --to [內網IP:內網端口]

# 本地80端口轉發到本地8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

添加網段轉發
# 例如經過***上網
echo 1 > /proc/sys/net/ipv4/ip_forward # 在內核裏打開ip轉發功能
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE # 添加網段轉發
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.0.0.0 -o eth0 -j SNAT --to 192.168.10.158 # 原IP網段通過哪一個網卡IP出去
iptables -t nat -nL # 查看轉發

# 容許已創建及該連接相關聯的數據包經過
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ASDL撥號上網
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o pppo -j MASQUERADE
iptables -P INPUT DROP # 設置INPUT鏈缺省操做丟棄全部數據包,只要不符合規則的數據包都丟棄。注意要在最後設置

#端口映射
# 內網經過有外網IP的機器映射端口
# 內網主機添加路由
route add -net 10.10.20.0 netmask 255.255.255.0 gw 10.10.20.111 # 內網須要添加默認網關,而且網關開啓轉發
# 網關主機
echo 1 > /proc/sys/net/ipv4/ip_forward # 在內核裏打開ip轉發功能
iptables -t nat -A PREROUTING -d 外網IP -p tcp --dport 9999 -j DNAT --to 10.10.20.55:22 # 進入
iptables -t nat -A POSTROUTING -s 10.10.20.0/24 -j SNAT --to 外網IP # 轉發回去
iptables -t nat -nL # 查看轉發
封單個IP的命令:iptables -I INPUT -s 124.115.0.199 -j DROP
封IP段的命令:iptables -I INPUT -s 124.115.0.0/16 -j DROP
封整個段的命令:iptables -I INPUT -s 194.42.0.0/8 -j DROP
封幾個段的命令:iptables -I INPUT -s 61.37.80.0/24 -j DROP
只封80端口:iptables -I INPUT -p tcp –dport 80 -s 124.115.0.0/24 -j DROP
解封:iptables -F
清空:iptables -D INPUT 數字

列出 INPUT鏈 全部的規則:iptables -L INPUT --line-numbers
刪除某條規則,其中5表明序號(序號可用上面的命令查看):iptables -D INPUT 5
開放指定的端口:iptables -A INPUT -p tcp --dport 80 -j ACCEPT
禁止指定的端口:iptables -A INPUT -p tcp --dport 80 -j DROP
拒絕全部的端口:iptables -A INPUT -j DROP

centos6的iptables基本配置
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 222.186.135.61 -p tcp -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

# 容許某段IP訪問任何端口
iptables -A INPUT -s 192.168.0.3/24 -p tcp -j ACCEPT
# 設定預設規則 (拒絕全部的數據包,再容許須要的,如只作WEB服務器.仍是推薦三個鏈都是DROP)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 注意: 直接設置這三條會掉線

*filter
:INPUT ACCEPT [637:58967]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [5091:1301533]
# 容許的IP或IP段訪問 建議多個
-A INPUT -s 127.0.0.1 -p tcp -j ACCEPT
-A INPUT -s 192.168.0.0/255.255.0.0 -p tcp -j ACCEPT
# 開放對外開放端口
-A INPUT -p tcp --dport 80 -j ACCEPT
# 指定某端口針對IP開放
-A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT
# 拒絕全部協議(INPUT容許)
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP
# 容許已創建的或相關連的通行
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 拒絕ping
-A INPUT -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Fri Feb 9 12:10:37 2007

ptables -A INPUT -s 192.168.1.1 # 比對封包的來源IP # ! 192.168.0.0/24 ! 反向對比
iptables -A INPUT -d 192.168.1.1 # 比對封包的目的地IP
iptables -A INPUT -i eth0 # 比對封包是從哪片網卡進入
iptables -A FORWARD -o eth0 # 比對封包要從哪片網卡送出 eth+表示全部的網卡
iptables -A INPUT -p tcp # -p ! tcp 排除tcp之外的udp、icmp。-p all全部類型
iptables -D INPUT 8 # 從某個規則鏈中刪除一條規則
iptables -D INPUT --dport 80 -j DROP # 從某個規則鏈中刪除一條規則
iptables -R INPUT 8 -s 192.168.0.1 -j DROP # 取代現行規則
iptables -I INPUT 8 --dport 80 -j ACCEPT # 插入一條規則
iptables -A INPUT -i eth0 -j DROP # 其它狀況不容許
iptables -A INPUT -p tcp -s IP -j DROP # 禁止指定IP訪問
iptables -A INPUT -p tcp -s IP --dport port -j DROP # 禁止指定IP訪問端口
iptables -A INPUT -s IP -p tcp --dport port -j ACCEPT # 容許在IP訪問指定端口
iptables -A INPUT -p tcp --dport 22 -j DROP # 禁止使用某端口
iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP # 禁止icmp端口
iptables -A INPUT -i eth0 -p icmp -j DROP # 禁止icmp端口
iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP # 阻止全部沒有通過你係統受權的TCP鏈接
iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT # IP包流量限制
iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT # 除192.168.62.1外,禁止其它人ping個人主機
iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m recent --update --seconds 5 --hitcount 20 --rttl --name WEB --rsource -j DROP # 可防護cc***(未測試)

例1,列規則

   


 

iptables -L --默認看的就是filter表
iptables -L -t filter
iptables -L -t nat
iptables -L -t mangle
iptables -L -t raw

例2,控制ping


 

ICMP協議傳輸過程是雙向的,能夠對其INPUT或OUTPUT均可以控制
172.16.0.0/16網段ping本機,會被拒絕(客戶端會收到拒絕信息)
# iptables -t filter -A INPUT -p icmp -s 172.16.0.0/16 -j REJECT
# iptables -t filter -D INPUT -p icmp -s 172.16.0.0/16 -j REJECT --刪除上一條規則
# iptables -t filter -A INPUT -p icmp -s 172.16.0.0/16 -j DROP
# iptables -t filter -D INPUT -p icmp -s 172.16.0.0/16 -j DROP
# iptables -t filter -A OUTPUT -p icmp -d 172.16.0.0/16 -j REJECT
# iptables -t filter -D OUTPUT -p icmp -d 172.16.0.0/16 -j REJECT
# iptables -t filter -A OUTPUT -p icmp -d 172.16.0.0/16 -j DROP
# iptables -t filter -D OUTPUT -p icmp -d 172.16.0.0/16 -j DROP
--上面四種方法均可以控制拒絕172.16.0.0/16網段ping本機
# iptables -t filter -A INPUT -p icmp -j REJECT --若是不寫-s或-d,默認表明全部人
擴展
我想實現全部人都ping不通我,可是172.16.X.X(X你自定義)這個IP能ping通我
--提示:iptables的匹配規則:讀取的順序是從上往下一條一條匹配,匹配一條就不繼續往下匹配,都沒有匹配,則最後匹配默認策略
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -A INPUT -p icmp -s 172.16.X.X -j ACCEPT
--此寫法錯誤的
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -I INPUT -p icmp -s 172.16.X.X -j ACCEPT
--正確寫法,把第二條加到第一條前面
# iptables -t filter -I INPUT 2 -p icmp -s 172.16.X.X -j ACCEPT
--鏈後面接數字2,表示插入到原來第二條的上面,成爲新的第2條
刪除的方法:
方法一:
# iptables -t filter -D INPUT -s 10.1.1.9 -p icmp -j ACCEPT
--加的時候怎麼寫,刪除時就要怎麼寫 A 參數換成 D就能夠
方法二;
# iptables -L -n --line
# iptables -D INPUT 2
--在規則比較多或者很差寫規則的狀況下,能夠先用--line或者--line-number列出行號,再用行號刪除
方法三:
# iptables -F
--直接清空filter表的全部規則
iptables -X
iptables -Z --清除計數器,自定義鏈

例3,規則的保存與還原


 

# /etc/init.d/iptables save --這樣是默認保存到/etc/sysconfig/iptables
# iptables-save > /etc/sysconfig/iptables --將當前規則保存到這個文件,文件能夠自定義
# iptables -F
# iptables -X
# iptables -Z --使用這三條來清空filter表,若是別的表也要清空的話,就加-t 表名都清一次
# iptables-restore < /etc/sysconfig/iptables --把保存的規則還原回去
--/etc/sysconfig/iptables文件爲默認保存文件,重啓iptables服務會默認把此文件裏的規則還原。固然也能夠手工保存到另外一個文件,就須要iptables-restore手工還原了。
擴展,如何徹底關閉rhel6的iptables服務
由於rhel6在安全性有不少增強,就算是你把iptables服務關閉,並chkconfig iptables off,重啓仍是有可能會有規則
因此能夠用下面的方法
# iptables -F
# iptables -F -t nat
# iptables -F -t mangle
# /etc/init.d/iptables save --保存爲空規則
# chkconfig iptables on
或者用下面的方法
# echo > /etc/sysconfig/iptables
# /etc/init.d/iptables restart
# chkconfig iptables on

例4,每一個鏈的默認策略的修改


 

# iptables -P INPUT DROP --INPUT鍵默認策略改成DROP,改回來把DROP換成ACCEPT就好了
# iptables -P OUTPUT DROP --OUTPUT鍵默認策略改成DROP

例5,實現容許ssh過來(表明本機爲服務器身份),ssh出去(表明本機爲客戶端身份),別的任何訪問都拒絕  (要求,INPUT和OUTPUT雙鏈默認策略都爲DROP)

         


 

OUTPUT INPUT
客戶端 隨機端口 ---》 服務器 22
客戶端 隨機端口 《--- 服務器 22
INPUT OUTPUT
實現容許10.1.1.0/24網段來ssh本機(服務器),其它任何訪問都拒絕(在雙鏈拒絕的狀況下)
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A INPUT -p tcp --dport 22 -s 10.1.1.0/24 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 22 -d 10.1.1.0/24 -j ACCEPT
實現容許從本機(客戶端)ssh到10.1.1.0/24網段的服務器,其它任何訪問都拒絕(在雙鏈拒絕的狀況下)
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A OUTPUT -p tcp --dport 22 -d 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --sport 22 -s 10.1.1.0/24 -j ACCEPT

例6,在例五的基礎上容許ping本身的IP,本地迴環127.0.0.1和10.1.1.8


 

下面兩條定義能ping本身和127本地迴環
# iptables -A INPUT -i lo -p icmp -j ACCEPT
# iptables -A OUTPUT -o lo -p icmp -j ACCEPT
--這裏用lo設備是127網段的全部迴環地址均可以。若是指定ip127.0.0.1的話,只能控制這一個IP。在控制的範圍上仍是有區別的
下面兩條定義此服務器和35這臺機器能夠互ping
# iptables -A INPUT -p icmp -s 10.1.1.8 -j ACCEPT
# iptables -A OUTPUT -p icmp -d 10.1.1.8 -j ACCEPT

例7,

在上面的基礎上再加上只容許10.1.1.0/24這個網段訪問你的httpd服務,和你只能訪問10.1.1.0/24網段的httpd服務

例8

在上面的基礎上再加上容許別人訪問本臺服務器的DNS

只須要作udp的53端口就能夠了,不用寫tcp 53(由於tcp 53主要是用於主從DNS服務器同步的)

-------------------------------


 

一些特殊的寫法
連續端口或多端口寫法
iptables -A INPUT -p tcp --dport 1:1000 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 25,110 -j ACCEPT
硬件地址
iptables -A INPUT -m mac --mac-source 00:23:CD:95:DA:0B -p all --dport 80 -j ACCEPT

例9 郵件服務器


 

25 smtp 110 pop3 143 imap
客戶端 郵件服務器
隨機 -------》 25,110,143
隨機 《------ 25,110,143
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A INPUT -p tcp -m multiport --dport 25,110,143 -s 10.1.1.0/24 -j ACCEPT
# iptables -A OUTPUT -p tcp -m multiport --sport 25,110,143 -d 10.1.1.0/24 -j ACCEPT

例10    dhcp

   iptables 對dhcp端口控制無效

應用層

表示層

會話層

傳輸層

網絡層

數據鏈路層

物理層


例11

samba

139   445


例12

nfs


 

--由於nfs用到rpc調用,端口不固定,因此須要把端口給固定起來.nis服務也會用到rpc調用,也須要作端口綁定
vim /etc/sysconfig/nfs --在此文件里加上下面四句
LOCKD_TCPPORT=3000
LOCKD_UDPPORT=3000
MOUNTD_PORT=3001
STATD_PORT=3002
/etc/init.d/nfs restart
/etc/init.d/rpcbind restart --這裏先把默認策略改爲ACCEPT,再啓動就能夠啓動起來,而後再把默認策略改回成DROP,再繼續作下面的實驗
netstat -ntl |grep 300 去查看,看到rpc.的守護進程的端口爲本身綁定的端口
iptables -A INPUT -p tcp --dport 3000:3002 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3002 -j ACCEPT
iptables -A INPUT -p udp --dport 3000:3002 -j ACCEPT
iptables -A OUTPUT -p udp --sport 3000:3002 -j ACCEPT
還要加上2049(nfs)和111(rpcbind)的端口的規則
iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 2049 -j ACCEPT
iptables -A INPUT -p udp --dport 2049 -j ACCEPT
iptables -A OUTPUT -p udp --sport 2049 -j ACCEPT
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A OUTPUT -p udp --sport 111 -j ACCEPT
--如今就能夠用另外一臺機showmount -e 查看並進行掛載了

--練習:把上面的3000,3001,3002,2049,111合起來來作


 

[root@localhost ~]# iptables -A INPUT -p all -m multiport --dport 111,2049,3000,3001,3002 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p all -m multiport --sport 111,2049,3000,3001,3002 -j ACCEPT

練習:上面四條作的是爲NFS服務器的身份容許別人訪問

若是你作爲NFS客戶端去訪問別人的NFS服務器,又應該如何寫?


例13: yum

視你作的yum類型而定

file

ftp

http


例14

mysql

3306


例15

oracle 監聽

1521


例16

rsync

873

還加一個22


練習:

ftp實現雙鏈拒絕的狀況下,客戶端經過主動和被動都能訪問進來

服務器端準備:


 

# yum install vsftpd -y
# vim /etc/vsftpd/vsftpd.conf
pasv_min_port=3000
pasv_max_port=3005
# /etc/init.d/vsftpd restart
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP

客戶端測試方法:

1,命令鏈接測試,能成功鏈接上就表示命令端口鏈接沒問題

# ftp 10.1.1.9

2,數據傳輸測試,用上面的命令登陸成功後,在客戶端使用passive指令轉換你的主動和被動模式,

(服務器端不用轉換,由於服務器端默認就是主動和被動都支持的)

而後使用ls指令能看到裏面的pub子目錄就表示數據傳輸OK了(由於默認是登陸到服務器的/var/ftp/目錄,裏面有一個pub子目錄)

ftp有主動和被動的鏈接兩種

1,爲何有主動和被動兩種鏈接方式呢?

由於這是一種比較古老的設計方式,它是假設客戶端用戶有防火牆而且還不會配置防火牆的狀況下,才設計出兩種模式。

防火牆默認只會拒絕進來的包,而不會拒絕出去或出去回來的包。

2,通常用主動好仍是被動好?

用被動比較常見,(緣由參考問題一)

3,主動和被動在使用時的區別?

沒有防火牆,那麼使用起來沒什麼區別,只是底層傳輸包的方式不同

有防火牆,那麼防火牆的規則寫法也不同

主動:


 

server client
20 21 n m
<-------------
-------------->
---------------------------------------->
<---------------------------------------
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
被動:
server client
隨機端口 21 n m
3000-3005 <---------------
---------------->
<--------------------------------------------
--------------------------------------------->
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3005 -j ACCEPT
iptables——路由
什麼是路由,什麼是路由表?
路由就是跨網絡訪問(路徑選擇)
路由表是記錄路由信息的表(能夠單路由表,也能夠多路由表)
咱們如今討論的是單路由表,你在linux下用route -n查看
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet8
1.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet1
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 172.16.1.1 0.0.0.0 UG 0 0 0 eth0


問題1:按上面的路由表來看,若是我ping一個公網IP(如ping 14.215.177.38),應該怎麼走?

答案:

我在本機訪問一個IP,先找路由表裏是否有你訪問的網段,有的話則從這個路由條目後面指定的網卡出去;若是路由表裏沒有你訪問的網段,則會找默認路由(也就是網關);若是網關也沒有的話,則會報錯網絡不可達。

問題2:按上面的路由表來看,若是我ping一個公網IP(如ping 1.1.1.1),會怎麼走?

答案:

按上面問題的答案來說,我ping 1.1.1.1應該不會走網關,而是走本地路由從vmnet1網卡出去(由於路由表裏有1.1.1.0/24的路由)。可是1.1.1.1實際應該是一個真正的公網IP.這樣其實會影響你訪問公網的1.1.1.0/24.因此通常來講,不要在內網網卡上配置公網IP,我這裏配置1.1.1.1只是爲了方便而已(另外一個目的就是爲了說明這個問題)

問題3:如何加網關和刪除網關,加網關有什麼要求?

route add default gw  x.x.x.x    --臨時加網關,立刻生效

route del default gw  x.x.x.x     --臨時刪網關,立刻生效

永久加網關的方法

在網卡配置文件裏/etc/sysconfig/network-scripts/ifcfg-eth0

加一句GATEWAY=x.x.x.x

加網關只能加你已經有的路由網段裏的一個IP才行(此IP不必定存在)

問題4:一個linux上能有幾個有效網關?

準確來講:一個路由表上能夠加多個網關,但只有一個生效。但一臺linux是能夠作多路由表的,一個路由表一個有效網關,多路由表就是多個網關了。

問題5:我一臺linux上若是有雙物理網卡,請問可不能夠兩個網卡配置同網段的不一樣IP呢?

假設個人eth0 10.1.1.11/24

      eth1 10.1.1.11/24

若是兩個網卡同網段,則會有下面兩條路由

10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0

10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1

它會實現從兩張網卡進來的包,卻從一張網卡出去,問題就產生了。

也有解決方法(好比多路由表)

靜態路由

以下圖的實驗:

用真實機虛擬的hostonly網絡vmnet1模擬IP爲1.1.1.1,三臺虛擬機都是雙網卡(全鏈接hostonly的vmnet1網絡),IP分配以下(掩碼假設全爲24位),作實驗的話使用iptables -F把全部的防火牆規則清空

宿主機          VM1         VM2        VM3

        eth1     -->     eth0        eth1

               2.2.2.2  《--     2.2.2.3    4.4.4.4

       ip_forward    ip_forward

vmnet1         eth0          eth1            eth0

1.1.1.1    --》   1.1.1.2         3.3.3.3 《--     3.3.3.4

從1.1.1.1 ping 1.1.1.2

在宿主機上ping 1.1.1.2,能通

從1.1.1.1 ping 2.2.2.2

ping 2.2.2.2 不能通

解決方法:

1,在宿主機上加路由

route add -net 2.2.2.0 netmask 255.255.255.0 dev vmnet1

或者

route add -net 2.2.2.0/24 dev vmnet1

2,加網關

route del -net 2.2.2.0 netmask 255.255.255.0 dev vmnet1  --先刪除上面的路由

route add default gw 1.1.1.2

在宿主機加了一個網關指向1.1.1.2的基礎上,我再繼續在宿主機上ping 2.2.2.3 不能ping

解決方法:

在vm2上加網關指向2.2.2.2

route add default gw 2.2.2.2

還要在VM1上打開ip_forward,打開方法有兩種

1,# echo 1 > /proc/sys/net/ipv4/ip_forward    --立刻生效,但重啓後就不生效了

2,# vim /etc/sysctl.conf  

net.ipv4.ip_forward = 1        --改成1

# sysctl -p            --保存後,使用此命令讓它永久生效

繼續ping 3.3.3.3    不通

解決:再在VM1上route add default gw 2.2.2.3

繼續ping 3.3.3.4    不通

解決:在VM2上打開ip_forward

還要在VM3上route add default gw 3.3.3.3

繼續ping 4.4.4.4  不通

解決:若是在VM2上加一個網關指向3.3.3.4,實際上是有問題的,由於VM2上這樣就有兩個網關了。若是你不使用多路由表的作法,這兩個網關只能有一個網關有效。

因此加網關的方式不可行,只能在VM2加路由

route add -net 4.4.4.0 netmask 255.255.255.0 dev eth1

上面終於從1.1.1.1ping到4.4.4.4

若是我把上面的全部網關和ip_forward去掉,而後手動加上路由(也就是說四臺機都有四個網段的路由),你會發現也同樣從1.1.1.1能ping通4.4.4.4

那麼若是還有5網段,6網段,7網段,甚至更多(相似因特網),手動把全世界全部的路由加上也是不可能的事。實際的作法就是使用路由協議(rip,ospf,bgp等)來作,這就是動態路由了。

linux下能夠安裝相似zebra這樣的軟路由軟件,能夠把linux模擬成一臺cisco路由器來進行配置。

注意:上面全部網卡都在同網絡,你能夠換一種方式再去嘗試:1網段用vmnet1來模擬,2網段用vmnet2來模擬,3網段用vmnet3來模擬,4網段用vmnet4來模擬

=======================================================================

補充一點虛擬機的網段知識:

問題1:vmware虛擬機的bridge,host-only,NAT這三種網絡有什麼區別?

bridge:與宿主機的物理網卡在同一個交換機

host-only:私有網絡.與宿主機的物理網卡不在同一個交換機,而是虛擬出獨立的一個交換機。兩個虛擬機的網卡連在同一個host-only(如vmnet1),那麼這兩個網卡就至關在同一個虛擬交換機。

NAT:私有網絡。能夠把它看做是作了NAT的host-only.

       10.1.1.9        10.1.1.11

       eth0         橋接    eth0  

       宿主機            宿主機

       vmnet1            vmnet1

       1.1.1.1            2.2.2.1

1.1.1.128                        2.2.2.128

問題2:vmware虛擬機能夠有幾個bridge網絡,幾個host-only網絡,幾個NAT網絡?

有幾個bridge網絡是與宿主機有幾張物理網卡有關。

host-only和NAT網絡能夠虛擬無數個。

使用vmware-netcfg去圖形配置

問題3:若是個人電腦是windows,安裝了windows版本的vmware虛擬機,虛擬機裏安裝的是linux系統。請問怎麼讓linux虛擬機在有路由器和無路由器須要拔號上網這兩種狀況下能實現上外網?

               網絡

                |              

               modem  (俗稱"貓")

                |

               路由器( dhcp + snat)

                |

           |-----------|

              交換機1         交換機2

               |  

       |--------------|

         電腦1         電腦2

=====================================================================

準備兩臺虛擬機和真實機一塊兒三臺機作實驗

--下面圖中10.1.1.0/24網段爲外網,1.1.1.0/24網段爲內網(雖然實際環境裏10.1.1.0/24網段是內網保留網段,1.1.1.0/24網段是公網網段,但我這裏只是內網模擬實驗爲了方便而已,你本身也能夠定義本身的網段都行)

 內網(VM1)        iptables網關(宿主機)            外網(VM2)

1.1.1.128  ---》       1.1.1.1  vmnet1  

eth0        

             ip_forward              

                10.1.1.9 eth0  《----      10.1.1.11

--注意:模擬上面的環境時,宿主機能夠模擬中間的雙網卡網關,但不能模擬內網或外網其中一臺(緣由是宿主機原本就是與虛擬的全部網段是直通的,你若是把它作爲內網,則它會直接鏈接外網而不會走中間的網關)

--因此兩種模擬方法:1,宿主機模擬網關,兩臺虛擬機分別模擬內外網;2,不要宿主機,三臺虛擬機來模擬,中間的雙網卡網關使用一臺雙網關的虛擬機模擬,另兩臺用單兩卡來模擬

把gateway加上路由功能

# echo "1" > /proc/sys/net/ipv4/ip_forward   --臨時生效

# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

# sysctl -p    --改完後使用此命令,使之修改永久生效

路由功能加了後,網關都指向了gateway這臺物理機,那麼  兩個網段的這兩臺機就能互相ping通

例一:禁止內網1.1.1.128和外網10.1.1.11互ping

iptables -A FORWARD -p icmp -s 1.1.1.128 -j DROP

或者

iptables -A FORWARD -p icmp -s 10.1.1.11 -j DROP

例二:禁止內網1.1.1.128上外網的10.1.1.11這個網站

iptables -A FORWARD -p tcp --dport 80 -s 1.1.1.128 -d 10.1.1.11 -j DROP

--這樣的作法,若是要作網絡管理(控制內部員工上網的行爲,用iptables來作就比較繁鎖,能夠選用squid這種代理網關)

======================================================================

問題:這裏咱們模擬內外網的訪問,網關互指,中間網關打開ip_forward,但實際的網絡訪問環境中,外網客戶會把網關指向你公司的網關嗎?

 內網              iptables網關               外網

1.1.1.128     ---->  1.1.1.1  vmnet1  

          網關指向  

             打開ip_forward          

                10.1.1.9 eth0               10.1.1.11

把上圖先去掉外網上的網關(由於實際狀況下,別人公司的外網服務器不可能把網關指向你),去掉這個網關後,內外網就不能通了,要靠作NAT才能通

張三        李四            王五

發信人:張三    發信人:李四        發信人:王五  

收信人:王五 --->    收信人:王五  -----------> 收信人:李四

                         |

       發信人:王五           |

    <-----    收信人:張三  <---------------|  

SIP:1.1.1.128     DIP:10.1.1.11

到達中間iptables網關,須要作SNAT

SIP:10.1.1.9    DIP:10.1.1.11

到達外網服務器,而後返回

SIP:10.1.1.11    DIP:10.1.1.9

回到中間iptables網關,會自動作DNAT

SIP:10.1.1.11    DIP:1.1.1.128

解決方法:在中間網關機器上寫規則

實現內網能夠上外網的web

iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth0 -j SNAT --to-source 10.1.1.9

實現內網能夠ping外網

iptables -t nat -A POSTROUTING -p icmp -o eth0 -j SNAT --to-source 10.1.1.9

下面這條不寫協議,也就表示全部內網上外網的都會作SNAT成10.1.1.9這個IP地址

iptables -t nat -A POSTROUTING  -o eth0 -j SNAT --to-source 10.1.1.9

iptables -t nat -A POSTROUTING  -o eth0 -j MASQUERADE    --這條命令和上條命令實現的效果是同樣的,但區別在於MASQUERADE能夠動態SNAT成你的公網IP(用於公網IP不固定的狀況,好比家用的ADSL拔號上網)

作了SNAT後,而且能夠10.1.1.11的/var/log/httpd/access_log裏驗證獲得:在你作NAT以前,靠雙網關互指訪問網站,它的訪問日誌裏全是你內網的IP。而作了NAT以後,日誌裏是你公網的IP。

===========================================================

題目1:

如今個人172.16.2.9(網段爲172.16.0.0/16)是經過公司路由器172.16.1.1能夠實際上外網的

請問,我一個hostonly網段的虛擬機1.1.1.128(這裏1.1.1.0/24網絡模擬的是內網)如何才能經過NAT上外網

虛擬機上DNS和網關要不要指,怎麼指?

hostonly虛擬機          宿主機                  公司路由器   公司外網IP

          vmnet1      eth0              

1.1.1.128 ---》  1.1.1.1   172.16.2.9 --> 172.16.1.1  121.15.27.169

DNS指向8.8.8.8

在虛擬機上把網關指向1.1.1.1,把DNS指向8.8.8.8;那麼包的過程以下

DNS包

SIP:1.1.1.128    DIP:8.8.8.8

到達真實機

SIP:1.1.1.128    DIP:8.8.8.8

到達路由器SNAT

SIP:121.15.27.169    DIP:8.8.8.8

到達DNS服務器返回

SIP:8.8.8.8    SIP:121.15.27.169

返回路由器自動DNAT

SIP:8.8.8.8    DIP:1.1.1.128

--經過分析獲得DNS數據包從路由器沒法回到虛擬機(他這裏是回到1.1.1.128,若是這是一個公網IP,則回到公網去了;就算是你是一個內網IP,他也沒法回到你的內網)

解決方法:

在中間的真實機上作    SNAT  --to-source 172.16.2.8

而且打開ip_forward

作完以後,數據包過程以下

DNS包

SIP:1.1.1.128    DIP:8.8.8.8

到達真實機

SIP:172.16.2.9    DIP:8.8.8.8

到達路由器SNAT

SIP:121.15.27.169    DIP:8.8.8.8

到達DNS服務器返回

SIP:8.8.8.8    SIP:121.15.27.169

返回路由器自動DNAT

SIP:8.8.8.8    DIP:172.16.2.9

返回到真實機自動DNAT

SIP:8.8.8.8    DIP:1.1.1.128

總結:

知足四個條件,這個hostonly虛擬機就能夠上外網

1,虛擬機網關指向宿主機的同網段IP(我這個例子裏是指向1.1.1.1)

2,DNS指向公網DNS服務器(我這裏是指向8.8.8.8);這裏DNS也能夠指向1.1.1.1,可是要在宿主機上多作一條DNAT,把udp的53端口目標地址DNAT成8.8.8.8

3,宿主機打開ip_forward(由於寫NAT規則都須要這個要求)

4,宿主機上寫一條SNAT把虛擬機上網的全部數據包SNAT成宿主機上外網的IP(我這裏爲172.16.2.9)

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.16.2.9

或者

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

===================================================================

DNAT  目的地址轉換

   也就是外網是客戶端,要訪問咱們內網的服務器,客戶端只是訪問外網IP,內網裏不一樣的服務器不一樣的IP,可使用DNAT把不一樣的請求轉換到不一樣的內網服務器

           客戶端  elinks www.abc.com

            |  

       外網IP     |

           網關 (打開ip_forward)

       內網IP     |

                |

            |

         郵件           web          DNS

   1.1.1.127    1.1.1.128    1.1.1.129

iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport --dport 25,110 -j DNAT --to-destination 1.1.1.127

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 1.1.1.128

iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 1.1.1.129

============================================================

NPT 網絡端口轉換

           客戶端    10.1.1.10

            |

                  |

           web    10.1.1.9

默認狀況web是監聽80端口,若是我把web改爲監聽8080.那麼客戶端在elinks 10.1.1.9時就訪問不到,除非elinks 10.1.1.9:8080

在web服務器上寫上一條端口轉換的iptables規則,把訪問80的轉成8080.而後客戶端再去elinks 10.1.1.9不用寫端口也能夠訪問成功

# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

=======================================================================

題目2:

要求:寫出這個電信用戶訪問到雙線web服務器時並返回的IP變化過程(只寫源IP,目標IP,和作SNAT仍是DNAT等)

你以爲架構會不會有問題?

192.168.1.100                       192.168.2.100

       電信用戶        網通用戶

         |           |  

192.168.1.1      |          |            192.168.2.1

       電信用戶家裏路由器  網通用戶家裏路由器    

51.1.2.3      |         |        61.1.2.3

         |www.abc.com     |                

         |            |

71.1.2.3          |          |        81.1.2.3

        公司電信路由器   公司網通路由器

10.1.1.1      |              |        172.16.2.1

         |         |

         |         |

10.1.1.100     eth0 雙線web服務器 eth1        172.16.2.100

這裏應該有智能DNS(DNS服務器會經過SIP是電信仍是網通,來智能的解析同一個網站的DIP;在此例中,電信用戶會被解析訪問71.1.2.3,網通用戶會被解析訪問81.1.2.3)

SIP:192.168.1.100    DIP:71.1.2.3

--

基於狀態的iptables

若是按照tcp/ip來劃分鏈接狀態,有11種之多(課後能夠本身去讀一下相關知識)

但iptables裏只有4種狀態;ESTABLISHED、NEW、RELATED及INVALID

這兩個分類是兩個不相干的定義。例如在TCP/IP標準描述下UDP及ICMP數據包是沒有鏈接狀態的,但在state模塊的描述下,任何數據包都有鏈接狀態。

   一、ESTABLISHED

   (1)與TCP數據包的關係:首先在防火牆主機上執行SSH Client,而且對網絡上的SSH服務器提出服務請求,而這時送出的第一個數據包就是服務請求的數據包,若是這個數據包可以成功的穿越防火牆,那麼接下來SSH Server與SSH Client之間的全部SSH數據包的狀態都會是ESTABLISHED。

   (2)與UDP數據包的關係:假設咱們在防火牆主機上用firefox應用程序來瀏覽網頁(經過域名方式),而瀏覽網頁的動做須要DNS服務器的幫助才能完成,所以firefox會送出一個UDP數據包給DNS Server,以請求名稱解析服務,若是這個數據包可以成功的穿越防火牆,那麼接下來DNS Server與firefox之間的全部數據包的狀態都會是ESTABLISHED。

   (3)與ICMP數據包的關係:假設咱們在防火牆主機ping指令來檢測網絡上的其餘主機時,ping指令所送出的第一個ICMP數據包若是可以成功的穿越防火牆,那麼接下來剛纔ping的那個主機與防火牆主機之間的全部ICMP數據包的狀態都會是ESTABLISHED。

   由以上的解釋可知,只要第一個數據包可以成功的穿越防火牆,那麼以後的全部數據包(包含反向的全部數據包)狀態都會是ESTABLISHED。

   二、NEW

   首先咱們知道,NEW與協議無關,其所指的是每一條鏈接中的第一個數據包,假如咱們使用SSH client鏈接SSH server時,這條鏈接中的第一個數據包的狀態就是NEW。

   三、RELATED

   RELATED狀態的數據包是指被動產生的數據包。並且這個鏈接是不屬於如今任何鏈接的。RELATED狀態的數據包與協議無關,只要迴應回來的數據包是由於本機送出一個數據包致使另外一個鏈接的產生,而這一條新鏈接上的全部數據包都是屬於RELATED狀態的數據包。

   四、INVALID

   INVALID狀態是指狀態不明的數據包,也就是不屬於以上三種狀態的封包。凡是屬於INVALID狀態的數據包都視爲惡意的數據包,所以全部INVALID狀態的數據包都應丟棄掉,匹配INVALID狀態的數據包的方法以下:

   iptables -A INPUT -p all -m state INVALID -j DROP

   咱們應將INVALID狀態的數據包放在第一條。

           隨機        |     80

           --------- |---》      

       client            |       server      

           《------------- | -----

           隨機        |     80  

client訪問server過去

第一個數據包(new狀態),若是拒絕,那麼後續包都會被拒絕(由於後面來的都會是第一個,都爲new狀態)

第一個數據包若是容許過去,那麼後續包的狀態爲established

server返回給client

返回的全部包都爲established

例1:

有下面兩臺機

10.1.1.9        10.1.1.10

10.1.1.9是能夠ssh訪問10.1.1.10,也能夠elinks訪問10.1.1.10

1,在10.1.1.10上

iptables -P INPUT DROP

iptables -P OUTPUT DROP

這裏就把雙鏈都關掉,10.1.1.9任何訪問都過不來了

2,

按之前的作法

在10.1.1.10上容許別人ssh進來

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

在10.1.1.10上容許別人elinks進來

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

或者把上面四條合下面兩條

iptables -A INPUT -p tcp -m multiport  --dport 22,80 -j ACCEPT

iptables -A OUTPUT -p tcp -m multiport  --sport 22,80 -j ACCEPT

把上面的兩條再換成

iptables -A INPUT -p tcp -m multiport  --dport 22,80 -j ACCEPT

iptables -A OUTPUT -p tcp -m state --state established -j ACCEPT

(後面一句能夠翻譯成tcp協議的鏈接只要你進得來,你就回得去)

(不管他是用哪一個隨機端口訪問進來的;由於只要能進來,那麼後續的包都屬於ESTABLISHED狀態了)

例2:

--有些服務器,可能但願你ping不通他,可是他能夠ping通你

一種:

修改proc的內核參數,禁ping

二種:使用狀態iptables

有下面兩臺機

10.1.1.9        10.1.1.10

實現10.1.1.10這個IP能ping通全部人.但全部人不能ping通10.1.1.10

                   |

           ---------》|

       client            |  server      

         10.1.1.9            |  10.1.1.10

               <-------|  <--------            

                new    established

           INPUT    拒絕    容許

           OUTPUT   容許    容許

1,在10.1.1.10上

iptables -P INPUT DROP

iptables -P OUTPUT DROP

這裏就把雙鏈都關掉,10.1.1.9任何訪問都過不來了

2,在10.1.1.10上

iptables -A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED -j ACCEPT

--重點是INPUT那條不能容許NEW狀態的;

--注意第二步的第二條(也就是output這條),若是隻寫了NEW狀態,那麼10.1.1.10ping全部人,都只能通第一個包;加上ESTABLISHED狀態,全部包都能通

例3:

1,在雙鏈默認策略爲drop的狀況下,只有10.1.1.x(IP你本身自定義)能夠ssh訪問我

2, 在上面的基礎上加上需求:實現我想訪問別人的服務(任何服務),均可以成功;

3,繼續加需求:但別人想訪問個人服務,只容許能夠訪問個人80端口

4,繼續加需求:容許我ping任何人,但只容許10.1.1.x(IP你本身自定義)這一個IP能ping通我

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -A INPUT -p tcp --dport 22 -s  10.1.1.x -j ACCEPT

iptables -A OUTPUT -m state new,established,related -j ACCEPT

iptables -A INPUT -m state established,related -j ACCEPT

iptables -A INPUT -p tcp --dport 80  -j ACCEPT

iptables -A INPUT -p icmp -s 10.1.1.x -j ACCEPT

========================================================================

tcpdump          

   tcpdump - dump traffic on a network

   參數的分類:

   協議 tcp udp arp icmp

   數據內容 端口,Ip  :

       src port 80    --源

       dst port 22    --目標

   tcpdump tcp dst port 80 -n

   tcpdump -i eth1 tcp dst port 80 -n   --小寫i參數指定哪一個網卡

   tcpdump tcp dst port 80 -n -w tcpdump.txt  --把dump出來的信息保存到tcpdump.txt文件

   tcpdump -r tcpdump.txt --而後須要使用tcpdump -r去讀取

   關係參數 :  !   and   or

   tcpdump tcp dst port 80 -n and src 10.2.2.4

   tcpdump tcp dst port 80 -n and ! src 10.2.2.4

   tcpdump tcp dst port 80 -n and  host  10.2.2.4

   -vv <---把數據包的詳細內容都記錄下來

   -w <---把數據保存到某個文件

======================================================================

   練習:

捕捉全部訪問本機ftp服務器的鏈接,而且數據包是來自10.2.2.4

tcpdump tcp dst port 21 and src 10.2.2.4 -n

捕捉全部來自10.2.2.1的arp協議的數據包,而且捕捉的顯示要求輸出以太網數據幀的信息 -e  

tcpdump arp and src 10.2.2.1 -n -e

捕捉全部本機web服務迴應10.2.2.4的數據包

tcpdump tcp src port 80 and dst 10.2.2.4

圖形的抓包工具:wireshark

yum install wireshark*

============================================================

linux 高級路由  策略路由

lartc(linux advanced routing and traffic control)

http://www.lartc.org

# rpm -qa |grep iproute        --iproute2工具包軟件

iproute-2.6.32-31.el6.x86_64

ip命令就屬於iproute2軟件包

ip addr

ip neigh

ip rule

ip route

ip tunnel

=============================================================

# ip rule list

0:    from all lookup local

32766:    from all lookup main

32767:    from all lookup default

# cat /etc/iproute2/rt_tables  

--上面的local對應數字255,在rhel5.7裏ip rule list看到的不是local,而是255;這只是對應的兩種名稱而已

#

# reserved values

#

255    local

254    main

253    default

0    unspec

#

# local

#

#1    inr.ruhep

# ip route list/show table local/255

# ip route list/show table main/254

# ip route list/show table default/253

=====================================================================

基本家用網絡拓撲圖

               線

                   |

                  modem

               |

               |

                  路由器 (幫你拔號,dhcp,nat,安全,上網控制)

               |

           |---------|

           交換機        交換機

             |  

       |------|

          電腦1      電腦2

==============================================================

應用實例1:                  

               ----------》路由器1--》 貓1  (快網絡)

               |  

               |  

     內網用戶  ----linux路由

               |  

               |          

                ---------》路由器2 --》 貓2  (慢網絡)

linux路由器有兩條上網線路,一個快,一個慢

有這樣的需求:內網用戶須要給錢共享上網,有人給錢多,須要快線路,有人給錢少,須要快線路,這樣的話,咱們就可使用策略路由了

模擬的話使用下面的圖:

                       10.1.1.10

               ----------》VM2(bridge)

               |  

   1.1.1.128        |        10.1.1.9  eth0  

     VM1(hostonly1)----linux路由1.1.1.1   vmnet1        公網

               |        2.2.2.1   vmnet2  

               |

                ---------》VM3 (hostonly2)  

                       2.2.2.128

上圖架構中:

1.把VM1網關指向1.1.1.1

2,把linux路由器的網關指向10.1.1.10

3.linux路由打開ip_forward

先測試:在VM1上ping一個外網IP(如 ping 8.8.8.8),這個時候只能在VM2上抓到相關的包,表示數據包從VM2出去

下面就是在linux路由上進行操做來實現:

操做命令:

echo 200 t1 >> /etc/iproute2/rt_tables

ip rule add from 1.1.1.128  table t1

ip route add default via 2.2.2.128 dev vmnet2 table t1

ip route flush cache

--若是加錯了規則,想刪掉,就使用ip rule del table t1刪除規則,再ip route del table t1刪除t1路由表

操做完後,測試

1,在內網ping 8.8.8.8

2,在兩個模擬外網路由器的機器上抓包

# tcpdump -i eth0 -p icmp

3,結果此次只能在VM3上抓到包,OK

應用實例2:

                       10.1.1.10    線路一

               ----------》VM2(bridge)

               |  

   1.1.1.128        |        10.1.1.9  eth0  

     VM1(hostonly)----linux路由1.1.1.1   vmnet1        公網

               |        2.2.2.1   vmnet2  

               |

                ---------》VM3 (hostonly2)  

                       2.2.2.128    線路二

要實現不一樣類型的包走不一樣的線路:如80的訪問走一條線,其它的走另一條線路

實現不一樣類型的包的策略路由,就要藉助於iptables的mangle表的set mark功能

1,在linux路由器上使用策略路由實現

# iptables -t mangle -A PREROUTING -i vmnet1 -p tcp --dport 80 -j MARK --set-mark 1        --把從內網進來要出去的80的包打標記爲1

# echo 100 http.out >> /etc/iproute2/rt_tables    --建一張叫http.out的表,表編號100

# ip rule add fwmark 1 table http.out pref 20000  --指定打了標記爲1的全部包都走http.out這張路由表,並指定優先級爲20000(這裏優先級能夠不指,由於只有這一條策略)

# ip route add default via 2.2.2.128 dev vmnet2 table http.out  --指定http.out表從vmnet8出去找2.2.2.128

# ip route flush cache        --刷新路由緩存

2,測試

測試一:在內網1.1.1.128客戶端上

elinks 8.8.8.8

在模擬兩個線路的機器上都執行下面的命令

tcpdump -i eth0 tcp port 80

--只有線路二上能抓到包,OK

測試二:在內網1.1.1.128客戶端上

ping 8.8.8.8

在模擬兩個線路的機器上都執行下面的命令

tcpdump -i eth0 -p icmp

--只有線路一上能抓到包,OK

--從上面就能夠看到出去的80端口的包和其它的包走的路線不一致

==========================================================

問題:

要求:寫出這個電信用戶訪問到雙線web服務器時的IP變化過程(只寫源IP,目標IP,和作SNAT仍是DNAT等)

你以爲有沒有問題?

192.168.1.100                       192.168.2.100

       電信用戶        網通用戶

         |           |  

192.168.1.1      |          |            192.168.2.1

       電信用戶家裏路由器  網通用戶家裏路由器    

51.1.2.3      |         |        61.1.2.3

         |         |                

         |           |

71.1.2.3          |          |        81.1.2.3

        公司電信路由器   公司網通路由器

10.1.1.1      |              |        172.16.2.1

         |         |

         |         |

10.1.1.100     eth0 雙線web服務器 eth1        172.16.2.100

電信用戶和網通用戶經過智能DNS分別去訪問電信或網通線路

SIP:192.168.1.100    DIP:71.1.2.3

到達電信用戶家用路由器手動SNAT

SIP:51.1.2.3        DIP:71.1.2.3

到達公司電信路由器手動DNAT

SIP:51.1.2.3        DIP:10.1.1.100

到達web服務器返回(網關指向10.1.1.1)

SIP:10.1.1.100        DIP:51.1.2.3

返回到公司電信路由器自動SNAT

SIP:71.1.2.3        DIP: 51.1.2.3

到達電信用戶家用路由器自動DNAT

SIP:71.1.2.3        DIP:192.168.1.100

問題是:

電信的用戶回去時,把雙線web服務器網關要指向10.1.1.1

網通的用戶回去時,把雙線web服務器網關要指向172.16.2.1

那麼按前面所學的知識,同一個路由表只能有一個可用網關,若是可用網關爲電信路由器內網IP;那麼實現的是電信進來的包從電信回,網通進來的包也從電信回.問題出現了

若是在雙線web服務器上不加網關,用加路由的方式來作的話,

那麼

route add -net 51的網段 netmask  x.x.x.x dev eth0

route add -net 61的網段 netmask  x.x.x.x dev eth1

同理還得加網通的,可是這也有一個問題,實際狀況電信和網通的用戶網段太多了,

你不可能全加上去

應用實例3:

實際狀況下的圖示,若是作實現得須要七臺虛擬機

192.168.1.100                       192.168.2.100

       電信用戶        網通用戶

         |           |  

192.168.1.1      |          |            192.168.2.1

       電信用戶家裏路由器  網通用戶家裏路由器    

51.1.2.3      |         |        61.1.2.3

         |www.abc.com   |                

         |           |

71.1.2.3          |          |        81.1.2.3

        公司電信路由器   公司網通路由器

10.1.1.1      |              |        172.16.2.1

         |         |

         |         |

10.1.1.100     eth0 雙線web服務器 eth1        172.16.2.100

精簡一點可使用下面的四臺虛擬來作,而且要注意宿主機(真實機)不能在這裏扮演角色,由於宿主機和任何虛擬機都是能夠直接通的

下圖中,電信客戶端和網通客戶端就沒有使用去模擬路由器NAT,直接用一臺虛擬機用兩個網卡來模擬兩個角色

172.16.2.51         bridge  客戶端 hostonly2    91.1.1.129

         |         |

         |         |                

         |           |

172.16.2.41    bridge        hostonly2    91.1.1.128

        電信路由器1           網通路由器2

2.2.2.230    hostonly1     vmnet8        71.1.1.131

         |         |

         |         |

2.2.2.236    hostonly1 雙線服務器 vmnet8    71.1.1.132

SIP:172.16.2.51

DIP:172.16.2.41

DNAT

SIP:172.16.2.51

DIP:2.2.2.236

回來

SIP:2.2.2.236

DIP:172.16.2.51

SNAT

sip:172.16.2.41

dip:172.16.2.51

進來

電信客戶端

SIP:192.168.1.100

DIP:172.16.2.41

被客戶端家裏的路由器SNAT

SIP:172.16.2.51

DIP:172.16.2.41

被服務器端的電信路由器DNAT

SIP:172.16.2.51

DIP:2.2.2.236

咱們下面所作的就是回去時,由兩個不一樣ISP運營商進來的包,從兩個不一樣的網關回去

回去:

SIP:2.2.2.236

DIP:172.16.2.51

被服務器端的電信路由器SNAT

SIP:172.16.2.41

DIP:172.16.2.51

被電信客戶端家裏的路由器DNAT

SIP:172.16.2.41

DIP:192.168.1.100

上圖中:

客戶端用虛擬機(linux或xp均可以,但不能使用真實機,由於真實機能夠直接訪問到上圖中的服務器)

   eth0    172.16.2.51    bridge

   eth1    91.1.1.129    hostonly2  

電信路由器1用虛擬機

   eth0    172.16.2.41    bridge

   eth1    2.2.2.230    hostonly1

網通路由器2用虛擬機

   eth0    91.1.1.128    hostonly2

   eth1    71.1.1.131    nat

服務器用虛擬機

   eth0    2.2.2.236    hostonly1

   eth1    71.1.1.132    nat

--假設上圖裏的客戶端爲內網用戶,服務器爲公網服務器;

--由於是模擬環境,因此這裏兩個路由器打開ip_forward,但上面四臺都不用指網關

--咱們實現的是當客戶端用電信線路訪問,也只能從電信線路返回;網通線路訪問,也只能從網通線路返回

先在電信路由器和網通路由器上作好SNAT和DNAT,這樣就不用把電信客戶端的外網IP的網關指向電信路由器的外網IP了

(由於實際的公網IP,不會把網關指向你的,這個在講iptables的SNAT就討論過)

電信路由器上寫兩條(還要打開ip_forward) --也能夠只寫DNAT,SNAT那條不寫它包會自動回來SNAT的

iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 2.2.2.236

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.16.2.41

網通路由器上寫兩條(還要打開ip_forward)  --也能夠只寫DNAT,SNAT那條不寫它包會自動回來SNAT的

iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 71.1.1.132

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 91.1.1.128

--上面四條當中的eth0本身換成對應的網卡名;電信路由器上的網卡名應該都爲172.16.2.41的網卡名;網通路由器上的網卡名應該都爲91.1.1.128的網卡名

作好上面四條和打開路由器的ip_forward後,而且默認上圖全部的機器裏如今都沒有網關

在雙線web服務器這臺啓動apache,隨便作一個主頁測試

驗證:

1,在客戶端elinks 172.16.2.41,得不到結果

 在客戶端elinks 91.1.1.128,得不到結果

2,上面兩個線路都得不到結果,是由於能到web服務器,但回不來

因此把web服務器網關指向2.2.2.230的話,則再測試,只有elinks 172.16.2.41能獲得結果

   把web服務器網關指向71.1.1.131的話,則再測試,只有elinks 91.1.1.128能獲得結果

3,也就是說,如今沒法實現電信線路和網通線路都能訪問成功;因此咱們要藉助於策略路由

1,在雙線web服務器上使用策略路由實現

# ip rule

0:    from all lookup local

32766:    from all lookup main

32767:    from all lookup default

# echo 100 dianxin >> /etc/iproute2/rt_tables

# echo 200 wangtong >> /etc/iproute2/rt_tables

--下面這四條是告訴dianxin路由表找2.2.2.230出去;告訴wangtong路由表找71.1.1.131出去;eth0就是2.2.2.236的網卡;eth1就是71.1.1.132的網關

# ip route add 2.2.2.0 dev eth0 src 2.2.2.236 table dianxin

# ip route add default via 2.2.2.230 table dianxin

# ip route add 71.1.1.0 dev eth1 src 71.1.1.132 table wangtong

# ip route add default via 71.1.1.131 table wangtong

--下面這兩條是加規則,指定從2.2.2.236回去的包找dianxin表;從71.1.1.132出去的包找wangtong表

# ip rule add from 2.2.2.236 table dianxin

# ip rule add from 71.1.1.132 table wangtong

# ip rule

0:    from all lookup local

32764:    from 71.1.1.132 lookup wangtong

32765:    from 2.2.2.236 lookup dianxin

32766:    from all lookup main

32767:    from all lookup default

測試:

再在客戶端

elinks 172.16.2.41,能訪問到web

elinks 91.1.1.128,也能訪問到web

說明電信線路的包只走電信線路,網通線路的包只走網通線路

若是要深刻測試的話,能夠在客戶端elinks電信線路的172.16.2.41時,去雙線web服務器上雙線路網卡都去tcpdump,會發現只有電信的網卡有包;網通的沒有

反之,亦然

==================================

應用實例4:

有些狀況一個服務器多張網卡配置成同一個網段(這種作法是不正確的),

由於同一個網段,那麼這多張網卡使用的路由是同一條,沒法將他們區分開來

(從不一樣網卡進來的包,通常都會從eth0出去)

若是你想要實現從哪裏進,從哪裏去,使用iproute2對多張網卡設定不一樣的網關就能夠(優先級要高於main表,也就是route -n看到的)

相關文章
相關標籤/搜索