1. 程式人生 > >Linux防火墻詳解(二)

Linux防火墻詳解(二)

iptables netfilter linux防火墻詳解 nat dnat

一、iptables命令基本語法 二、iptables語法進階 三、iptables顯示擴展 四、iptables簡單案例 五、iptables之forward 六、iptables之NAT

一、iptables命令基本語法

iptables [-t table] {-A|-C|-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
    rule-specification = [matches...] [target]
    match = -m matchname [per-match-options        //匹配使用的模塊,模塊具有參數
    target = -j targetname [per-target-options]    //執行的動作
    -t:指定表
    -A:append,追加,默認最後
    -I:插入,默認插入為第一條
    -C:check,檢查該條目是否存在
    -D:delete:刪除,
        1.rule specification
        2.rule number
    -R:replace替換,和-D用法類似,但是必須指定rule lumber
        
    -S:顯示命令行的命令格式,類似於iptables-save,-S輸出結果然後重定向到配置那文件中
        iptables-restor 恢復配置
    -F:flush,清空規則
    -L:list 查看
        -n:numeric,以數字格式顯示地址和端口
        -v:verbose,顯示詳細信息
        -vv:更詳細
        -x:exactily,顯示計算器的精確值,而不是換算後的結果
        --line-numbers:顯示行號
        iptables -nvL //L應該寫到右邊,放在前面不能用
    -Z:zero,置0
        iptables的每條規則都有兩個計數器
            1.由本規則匹配到的所有的packets
            2.由本規則匹配到的所有的bytes之和
    -P:policy,設置鏈的默認策略
        ACCEPT:接受
        DROP:丟棄
        REJECT:拒絕
    -E:rename,重命名自定義的未被引用(引用計數為0)的鏈
        iptables -E testchain mychain //重命名空鏈
    -N:new 新增一條自定義鏈
    -X:刪除自定義鏈空鏈

CentOS7:
systemctl stop firewalld.service
systemctl disable firewlld.service

允許ssh登錄:默認為DROP
iptables -A INPUT -s 192.168.4.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d 192.168.4.0/24 -p tcp -m tcp --sport 22 -j ACCEPT

操作:設置filter的所有表默認DROP
CentOS7,刪除默認自定義鏈:for i in `iptables -L -n | grep "Chain" | cut -n -d' ' -f2 | tail -17`; do iptables -X $i;done

iptables -t filter -P INPUT DROP

註:寫規則的時候,需要同時考慮到INPUT和OUTPUT接口

二、iptables語法進階
1.iptables/netfilter表和鏈
表[按優先級]:raw-->mangle-->nat-->filter
鏈: PREROUTING-->INPUT-->OUTPUT--->POSTROUTING
PREROUTING-->FORWARD--->POSTROUTING
raw:PREROUTING,OUTPUT
mangle:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD
nat:PREROUTING,OUTPUT,POSTROUTING
filter:INPUT,OUTPUT,FORWARD

iptables [-t table] SUBCOMMAND chain [matches...] [target]
2.iptables/netfilter匹配和動作
匹配條件:
基本匹配:netfilter自帶的匹配機制
[!]-s,--source address/prefix[,..]; 原地址匹配,!表示不被匹配
[!]-d,--destination,目標地址匹配
[!]-i,--in-interface name,限制數據流入的接口,只能用於PREROUTING,INPUT,FORWARD
[!]-o,--out-interface name,限制報文流出的接口,只能用於OUTPUT,FORWARD,POSTROUTING
[!]-p,傳輸層協議,{tcp,udp,icmp}
tcp擴展:
擴展匹配:經由擴展模塊引入的匹配機制,-m matchname //man iptables-extension查看所有的擴展
隱式擴展:可以不用-m選項加載相應模塊,前提是使用-p,選項匹配何種協議
顯示擴展:必須-m選項專門加載相應模塊
隱式擴展:
[!]-p,--protocol PROTOCOL
協議:tcp,udp,icmp,icmpv6,esp,ah,sctp,mh,all
tcp:隱含指明了-m tcp

            [!] --source-port,--sport port[:port] //匹配報文中的tcp首部地址,可以使端口範圍,10:1024,10,:1024,1024://冒號在前:0到該端口,冒號在後:該端口到最大端口
            [!] --destination-port,--dport port[:port]
            [!] --tcp-flags mask comp//tcp標誌位,檢查報文中的tcp標誌位,檢查報文中comp指明的tcp標誌位,要求comp必須為1
                --tcp-flags syn,fin,ack,rst syn //檢查四個,但是syn必須為1,其他必須為0,這是第一次握手
            [!] --syn //tcp第一次握手,相當於-tcp-flags syn,fin,ack,rst syn 
            [!] --tcp-option number

udp:隱式擴展//tftp,named有用到
-sport
-dport
icmp:
[!] --icmp-type {type[/code]|typename}
請求的是8,回應的是0
type/code;
0/0 :echo reply ,ping回答
8/0 ;echo request ,ping請求
別人ping me:入:8,出:0
me ping別人:出:8,入:0

處理動作:
-j targetname
RETURN:返回調用的鏈
REDIRECT:端口重定向
LOG:日誌
MARK:防火墻標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址偽裝

三、iptables顯示擴展:
1.multiport:多端口匹配,以離散方式定義多端口匹配,可以指定多個離散端口

        [!] --source-ports,--sports port[,port|,port:port]...
        [!] --destination-ports,--dports port[,port|,port:port]...
        [!] --ports port[,port|,port:port]... //同時匹配,s和d
        iptables -I INPUT -s 0/0 -d 192.168.4.118 -p tcp -m multiport --dports 22,80 -j ACCEPT
        iptables -I INPUT -s 192.168.4.118 -d 0/0  -p tcp -m multiport --sports 22,80 -j ACCEPT

2.iprange:指明一段連續的IP地址範圍

       [!] --src-range from[-to]
        [!] --dst-range from[-to]
        iptables -A INPUT -d 192.168.4.118 -p tcp --dport 23 -m iprange --src-range  192.168.4.1-192.168.4.120 -j ACCEPT

3.string:

        --algo {bm|kmp} //對於子串匹配是基於某種算法進行的,需要指定算法
        --from offset    //報文的偏移位置
        --to offset            //
        [!] --string pattern    //給定要檢查的字符串模式
        [!] --hex-string pattern //16進制編碼的子串
        //匹配到的子串
        iptables -I OUTPUT -s 192.168.4.118  -d 0/0 -p tcp --sport 80 -m string --algo bm --string "h7n9" -j REJECT

4.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...],1-31
        [!] --weekdays day[,day...],Mon,Tue,Thu,Web,Fri,SAT,Sun
        iptables -R INPUT 4 -d 192.168.4.118 -p tcp --dport 23 -m iprange -src-range 192.168.4.1-192.168.4.120 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT

5.connlimit:限制單個ip對s的連接數,即每個客戶端的並發數量

        --connlimit-above n //下限,最低多少個,小於等於
        --connlimit-upto n //上限大於n,就采取某種動作
        iptables -A INPUT -s 0/0 -d 192.168.4.118 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
            //最多只允許兩個用戶登錄
        iptables -R OUTPUT 4 -s 192.168.4.118 -d 0/0 -p tcp --sport 23 -j ACCEPT

6.limit //基於令牌桶算法,對報文的速率做匹配

        --limit rate[/second|/minute|/hour|/day] //0
        --limit-burst number //同一時刻最多多少個請求,默認為5,並發個數,最多保持個數
        
        iptables -A INPUT -d 192.168.4.118 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 3 -j ACCEPT
        iptables -A OUTPUT -s 192.168.4.118 -p icmp --icmp-type 0 -j ACCEPT

7.state //實現連接追蹤的,對報文的狀態做連接追蹤

       [!] --state state    //INVALID, ESTABLISHED,NEW,RELATED,UNTRACKED.
        //記錄了源地址基於什麽協議訪問了哪個目標地址,以及sport和dport
        //記錄經過我,後者我處理過的進程



NEW:連接追蹤模板中不存在的連接請求
ESTABLISHED:連接追蹤模板中存在記錄的模板
RELATED:例如ftp命令連接和數據連接,
INVALID:無法識別的連接,例如ACK,FIN,RST都是1
UNTRACKED:未追蹤的連接,沒有記錄到模板中,在raw.PREROUTING可以設定
//鏈接追蹤,在負載均衡器上,建議關閉,因為會大大降低性能
/proc/net/nf_contrack :鏈接追蹤到的信息查看
鏈接追蹤功能能夠追蹤到的,最大連接數
/proc/sys/net/nf_conntrack_max,最終到3w多,建議調大
sysctl -w net.nf_conntrack_max=300000 //追蹤不到,可能會丟棄,所以建議放大
//echo VALUE 也可以,但都是臨時生效

contrack所能夠追蹤的鏈接數量的最大值,取決於/proc/sys/net/nf_conntrack_max的設定,超時之後會被刪除;已經追蹤到的並記錄的位於/proc/net/nf_conntrack中
超時的鏈接將會被刪除;當模板滿載時,後續的新連接有可能會超時,解決方法
1.加大nf_contrack_max的值
2.降低nf_conntrack條目的超時時長
不同協議的連接追蹤時長,定義在/proc/sys/net/netfilter/
鏈接追蹤的作用:

    -A INPUT -s 192.168.4.0/24 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT
    -A OUTPUT -s 192.168.4.118/32 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEP
    
    -A OUTPUT -s 192.168.4.118/32 -p icmp -m icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
    -A INPUT -d 192.168.4.118/32 -p icmp -m icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT

//越可能匹配到的規則,應該寫到前面,快速處理
//規則的檢查次序:規則在鏈上的次序即為檢查時的生效次序,因此,其優化使用有一定法則;
1.同類規則(訪問同一應用),匹配範圍小的放前面,用於特殊處理;
2.不同類的規則(訪問不同應用),匹配範圍大的放前面
3.應該講哪些可以用一條規則描述的多個規則合並為一.
4.設置默認策略

四、iptables簡單案例
建立鏈接:
1.tcp包頭的[Sequence number],C發送給s的X, SYN=1,ACK=0,FIN=0,RST=0 //FIN:斷開標誌,RST:重置
2.s回復{X+1}作為確認號,並發送自己產生的隨機數Y SYN=1,ACK=1,FIN=0,RST=0
3.c確認報文,發送[X+1],並發送確認號[Y+1] SYN=0,ACK=1,FIN=0,RST=0 //同步已經完成
//建立兩條虛鏈路,每條都是單向的
斷開鏈接:
1.c請求斷開,c進入FIN_WAIT1, SYN=0,ACK=1,FIN=1,RST=0
2.s確定斷開,C進入FIN_WAIT2,s進入TIME_WAIT SYN=0,ACK=1,FIN=0,RST=0
3.s發送剩下的數據包,s進入LAST_ACK, SYN=0,ACK=1,FIN=1,RST=0
4.客戶端發送確認,並斷開 SYN=0,ACK=1,FIN=0,RST=0

yum instal httpd,vsftpd,nfs,mairadb//測試之用
允許ssh,解決所有
iptables -A INPUT -s 0/0 -d 192.168.4.118 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 192.168.4.118 -d 0/0 -p tcp --sport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
放行80
iptables -A INPUT -s 0/0 -d 192.168.4.118 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -s 192.168.4.118 -p tcp --sport 80 -j ACCEPT
放行named
自己做服務端:53/tcp,出去的53/udp
自己做客戶端:自己找根的時候,訪問對方的53/tcp,接受對方53端口的通知,但是自己使用的端口卻不知到
953: tcp/udp 是rndc使用的端口
區域傳送使用:tcp/53
域名解析:udp/53
iptables -A OUTPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -p tcp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT //放行自己sport :udp/53出去請求別人
iptables -A INPUT -p udp --sport 53 -j ACCEPT //別人響應自己的
cat /etc/resolv.conf
nameserver 192.168.4.118 //自己的ip地址
iptables -A INPUT -p udp --dport 53 -j ACCEPT //別人請求我的
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT //我回應別人的
小結:
1.用的都是udp:53號端口
INPUT: 入和出接口都使用
INPUT: sport:udp:53
OUTPUT: dport:upd:53
2*2=4兩個兩個交互
A---B[二級NS]---s[一級]
B請求S的時候:dport==udp:53
S回應的時候:sport=udp:53
A請求B的時候:dport=53
B回應A的時候:sport=53

允許自己ping別人,但是不允許別人ping自己

    請求是8,回應是0
    iptables -A OUTPUT -s 192.168.4.118 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT
    iptables -A INPUT -s 0/0 -d 192.168.4.118 -p icmp --icmp-type 0 -j ACCEPT
    
    允許別人ping:
    iptables -A INPUT -d 192.168.4.118 -p icmp --icmp-type 8 -j ACCEPT
    iptables -A OUTPUT -s 192.168.4.118 -p icmp --icmp-type 0 -j ACCEPT
    
    telnet:非工作時間不讓訪問
    iptables -R INPUT 4 -d 192.168.4.118 -p tcp --dport 23 -m iprange -src-range 192.168.4.1-192.168.4.120 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
    iptables -R INPUT 4 -d 192.168.4.118 -p tcp --dport 23 -m iprange -src-range 192.168.4.1-192.168.4.120 -m time --timestart 09:00 --timestop 18:00 -m --weekdays 1,2,3,4,5 -j ACCEPT

放行vsftpd
21:命令端口
20:主動數據連接
//ftp要想使用related狀態,必須裝載nf_conntrack_ftp
modrpoeb nf_conntrack_max
lsmod | grep ftp

    iptables -A INPUT -d 192.168.4.118/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -s 192.168.4.118/32 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

註:入接口和出口的RELATED都得開啟,而且入接口21/tcp的NEW必須打開,

或則:
INPUT: dport 21,NEW,ESTABLISHED
OUTPUT: sport 21,ESTABLISHED //命令連接

INTPUT:tcp RELATED,ESTABLISHED //數據連接
OUTPUT:tcp ESTABLISHED
1.加載nf_contrack_ftp模塊
modrproe nf_conntrack_ftp
2.放行命令連接
iptables -A INPUT -d 192.168.4.118 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.3.118 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT //這條可以不寫,後一條OUTPUT已經包括該條
3.放行數據連接
iptables -A INPUT -d 192.168.4.118 -p tcp -m state --state RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.3.118 -p tcp -m state --state ESTABLISHED -j ACCEPT

規則的有效期限:
iptables命令添加的規則,手動刪除之前,其生效期限為kernel的生命周期
保存
CentOS6: service iptables save
iptables-save > /etc/sysconfit/iptables
CentOS7:
iptables -S > /path/to/some_rule_file
iptables-save > /path/to/some_rule_file
重載:
iptables-restore < /path/to/some_rule_file
CentOS6:
service iptables resart //會自動讀取重載規則
自動生效規則文件中的規則
1.把iptables命令放在腳本文件中,讓腳本文件開機自動運行
/etc/rc.d/rc.local
2.用規則文件保存規則,開機自動重載命令
/etc/rc.d/rc.local
iptables-restore < /path/to/some_rule_file

問題:開機裝載某模塊

    cd /etc/sysconfig/modules/
    vim bridge.modules
        #/bin/sh 
        /sbin/modinfo -F filename bridge > /dev/null 2>&1  //-F顯示模塊路徑名
        if [ $? -eq 0 ]; then 
            /sbin/modprobe bridge 
        fi
    chmod 755 bridge.modules   //這一步至關重要    
    reboot
    lsmod |grep bridge


modinfo //會顯示出所有模塊信息
-F 指定要顯示的字段
註意:CentOS7:使用firewalld-cmd

五、iptables之forward
實驗拓撲
inet--- GW ----Internet
GW的內網卡和inet的網卡類型:應該一樣,例如都是host-only或者使用vmnet2,
//此處自定義網絡(僅主機模式):添加虛擬網絡
GW的外網卡為bridge模式

註:GW的inet作為網關,不需要指定自己的網關
建議:自己設置內網,vmware虛擬機的反應速度比較慢,網卡配置不能及時生效
172.16.1.22-->172.16.1.1/192.168.4.118[外網]---->192.168.4.107 //外網
Inet:ping 192.168.4.118 //能夠ping同,因為linux的ip地址是內核的不是網卡的
192.168.4.107:有路由到達172.16.1.0網段

tcpdump -i eth0 icmp
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -P FORWARD DROP //
問題1:假如inet ping不通GW的外網ip
GW沒有到inet的路由,添加一條既可
建議在inet上添加默認路由指向GW
問題2:echo 1 > /proc/sys/net/ipv4/ip_forward
inet仍熱ping不通外網
因為,inet雖然能夠出去,但是別人不知道怎麽回來
需要在目標主機上,添加回來的路由
或者NAT
例如:在107上windows,這樣inet就能ping同107
route add 172.16.1.0 mask 255.255.255.0 192.168.4.118

實驗1:內網能夠ping通外網,但是外網不能ping通內網
1.echo 1 > /proc/sys/net/ipv4/ip_forward
2.inet 172.16.1.22,外網:192.168.4.107
iptables -P FORWARD DROP
iptables -A FORWARD -s 172.16.1.0/24 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -s 0/0 -d 172.16.1.0/24 -p icmp --icmp-type 0 -j ACCEPT
tcpdump -i eth0 -nn icmp
或者:
iptables -F
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT //會直接放行icmp-type 0的回應
iptables -A FORWARD -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
問題4:
httpd和vsftpd服務正在運行 //
iptables -P FORWARD DROP //INPUT和OUTPUT都是ACCEPT,但是該實驗不經過INPUT和OUTPUT

    放心web:內網訪問外網
        iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
        iptables -A  FORWARD -s 172.16.1.0/24 -p tcp --dport 80 -m state NEW -j ACCEPT
    放行ftp:訪問外網的ftp
        iptables -A  FORWARD -s 172.16.1.0/24 -p tcp --dport 21 -m state NEW -j ACCEPT
        modprobe nf_contrack_ftp
        iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT //這樣能夠訪問外部的ftp,對方的數據鏈接也可以

假如需要自動載入的話,需要寫入命令:/etc/rc.local
iptables-restore < /etc/sysconfig/iptables-config

註:ip_forward,只能幫你發出去,回來的時候,路由需要手動指定
若想回來的路由也被識別,那就得需要使用nat

處理動作:
ACCEPT/DROP/REJECT
LOG
RETURN //自定義鏈返回
REDIRECT
SNAT
DNAT
MASQUERADE

LOG://先做日誌,然後再做ACCEPT,或者DROP,REJECT操作
--log-level level //emerg,alert,crit,error,warning,notice,info,debug.
--log-prefix prefix //最多29個字符
--log-tcp-sequence //
--log-tcp-options //tcp頭部
--log-ip-options //ip頭部
--log-uid //user id

iptables -I FORWARD 1 -p tcp -m multiport --dports 22,21,80,23 -m state --state NEW -j LOG --log-prefix "New connections"
//默認LOG級別為4
tail /var/log/messages
RETURN:自定義鏈的返回

    iptables -N web
    iptables -A web -s 172.16.1.0/24 -p tcp --dport 80 -j ACCEPT
    iptables -I web -m string --algo kmp --string "old" -j REJECT
    iptables -A web -j RETURN //這個可加,可不加,默認會有return        
        //有時需要提前返回的話,需要手動指定
    iptables -A FORWARD -p tcp --dport 80 -j web

REDIRECT:端口重定向://只在nat table的PREROUTING,OUTPUT有效
--to-ports port[-port]
--random

默認只有管理員使用大於1024的端口
只對目標端口做修改
GW:httpd 使用8888/tcp
iptables -t nat -A PREROUTING -d 192.168.4.118 -p tcp --dport 80 -j REDIRECT --to-ports 8888

六、iptables之NAT
NAT:network address translation
iptables -t nat -F
iptables -t filter -F
iptables -P FORWARD ACCEPT
NAT表也有三個鏈:
PREROUTING:
POSTROUTING:
OUTPUT:

tail /var/log/httpd/acces_log //正常的模型先,外網請求httpd,用戶是外網的地址

SNAT:source nat
修改IP報文中的源ip,目標ip不動
//GW開啟鏈接追蹤功能,根據鏈接狀態信息,區分不同的inet ip
//讓本地網絡中的主機可使用同一地址與外部主機通信,從而實現地址偽裝
請求:修改源ip,如何修改由管理員定義
響應:修改目標ip,由nat自動根據會話表中追蹤機制實現響應修改.
用途:主要用於內網用戶訪問外網
DNAT:destination nat
修改IP報文中的目標IP//源ip不變,一直是外部的
用途:外網請求內網主機[服務],讓本地網絡中服務器使用同一的地址向外提供服務,但隱藏了自己的真實地址;
請求:外部主機發起,修改其目標地址,由管理員定義
響應:修改源地址,但由nat自動根據會話表中的追蹤機制實現對應修改
PNAT:port NAT
REDIRECT就是一種port nat,但是,只能重新定向端口,而不能指定為其他ip
DNAT可以實現,即修該目標地址,同時修改目標端口

問題:REDIRECT,能不能定向到內網的非網關ip
不能:因為REDIRECT只有--to-ports,也就是說只能重定向目標端口,不能重新定向目標ip

GW的數據包流向:PREROUTING--->FORWARD-->POSTROUTING
SNAT:應該在POSTROUTING鏈上做
DNAT:應該在PREROUTINT鏈上做

SNAT:只能用在nat表的{POSTROUTING,INPUT}chain上
--to-source ipaddr-ipaddr[:port[-port]] //源地址可以有多個,也可以指定端口
--random 端口映射將成為隨機
--persistent

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 192.168.4.118
tcpdump -i eth0 -nn icmp
//假如是pppoe撥號上網的話,地址會經常發生改變,因此需要寫腳本定時更新
MASQUERADE,只能用在nat的POSTROUTING,自動獲取外網Ip地址
--to-ports port[-port]
--random
MASQUERADE:需要不停的去判斷哪個外網地址可用,會浪費很多資源的
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
DNAT:只能用在nat (PREROUTING,OUTPUT)
GW的80端口是關閉的,inet:172.16.1.22:80是開啟的
--to-destination [ipaddr[-ipaddr]][:port[-port]]
iptables -t nat -A PREROUTING -s 0/0 -d 192.168.4.118 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.22

端口映射:

    iptables -t nat -A PREROUTING -s 0/0 -d 192.168.4.118 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.22:8888 //可以指定為其他inet的地址和端口
    iptables -t nat -A PREROUTING -s 0/0 -d 192.168.4.118 -p tcp --dport 22 -j DNAT --to-destination 172.16.1.22 //及時GW和inet的22同時打開,也被定向為inet:22


recent:模塊,對於本機的某個服務的訪問速錄做限制
防止對22號端口做字典攻擊//一定程度上有效

    (1)#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
    (2)#iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH //設置新的ssh鏈接名字為SSH
    (3)#iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds  300 --hitcount 3 --name SSH -j DROP

connlimit:限制單個ip對s的鏈接
1.利用connlimit模塊將單IP的並發設置為3;會誤殺使用NAT上網的用戶,可以根據實際情況增大該值;
2.利用recent和state模塊限制單IP在300s內只能與本機建立3個新連接。被限制一分鐘後即可恢復訪問。
3.第一句是記錄訪問tcp 22端口的新連接,記錄名稱為SSH
--set 記錄數據包的來源IP,如果IP已經存在將更新已經存在的條目
4.第三句是指SSH記錄中的IP,300s內發起超過3次連接則拒絕此IP的連接。
--update 是指每次建立連接都更新列表;
--seconds必須與--update同時使用
--hitcount必須與--update同時使用
5.可以使用下面的這句記錄日誌:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"


第三方模塊:
layer7:識別大多數常見的應用層協議,例如http,qq等協議
1.內核打補丁
2.iptables打補丁


小結:
iptables:
四表:filter,nat,manle,raw
五鏈:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
iptables命令
表:-N,-X,-P,-E
鏈:-A,-I,-R,-D,-F,-Z
查看:-L,-S
-L:-n,-x,-v,--line-number
保存規則:iptables-save,iptables-restore
匹配條件:
基本匹配:-s,-d,-i,-o1
擴展匹配:
隱式擴展:
-p{tcp|udp|icmp|sctp|udplite|...}
-p tcp:
--sport,--dport,--tcp-flag,--syn
-p udp:
--sport,--dport
-p icmp:
--icmp-type //8請求,0響應
顯示擴展:
1.state:--state //net_conntrack
NEW,ESTABLISHED,RELATED,INVALID,UNTRACKED
2.iprange: --src-range,--dst-range
3.string:--algo {bm|kmp},--string ,-hex-string
4.multiport: --sports,--dports,--ports
5.limit:--limit,--limit-burst //速率限制
6.connlimit:--connlimit-upto,--connlimit-above//一般不同時使用,單ip訪問限制
7.time:--datestart,--datestop,--timestart,--timestop,--mothdays,--weekdays
處理動作:
ACCEPT,DROP,REJECT,LOG,RETURN,REDIRECT,SNAT,DNAT,MASQUERADE
推薦博客:http://blog.csdn.net/ruixj/article/details/4268814


Linux防火墻詳解(二)