iptables snat dnat配置及測試

來源:本站原創 網絡技術 超過1,605 views圍觀 0條評論

    

基本語法:iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET

要實現nat,要將文件/proc/sys/net/ipv4/ip_forward內的值改為1,(默認是0)。
 
需要用到的幾個動作選項:(真實環境中用大寫)
redirect     將數據包重定向到另一臺主機的某個端口,通常用實現透明代理和對外開放內網某些服務。
snat    源地址轉換,改變數據包的源地址
dnat    目的地址轉換,改變數據包的目的地址
masquerade    IP偽裝,只適用于ADSL等動態撥號上網的IP偽裝,如果主機IP是靜態分配的,就用snat
PRERROUTING:DNAT 、REDIRECT   (路由之前)只支持-i,不支持-o。在作出路由之前,對目的地址進行修改

————–centos7 iptables服務安裝————-
yum install -y iptables
yum update iptables
yum install iptables-services
systemctl start iptables

[[email protected] script]# systemctl enable iptables   ——-增加開機啟動
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[[email protected] script]# systemctl status iptables   ——-狀態
● iptables.service – IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: active (exited) since Wed 2017-11-15 09:44:19 EST; 4 days ago
Main PID: 8565 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/iptables.service

Nov 15 09:44:19 lvs-d systemd[1]: Starting IPv4 firewall with iptables…
Nov 15 09:44:19 lvs-d iptables.init[8565]: iptables: Applying firewall rules: [  OK  ]
Nov 15 09:44:19 lvs-d systemd[1]: Started IPv4 firewall with iptables.
[[email protected] script]#

 

—————使用–line-number 查看編號

[[email protected] script]# iptables -L -n -t nat –line-number -v
Chain PREROUTING (policy ACCEPT 105 packets, 132K bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1        8   480 DNAT       tcp  –  ens33  *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:10.1.1.11:80
2        0     0 DNAT       tcp  –  ens33  *       0.0.0.0/0            192.168.142.188      tcp dpt:80 to:10.1.1.11:80
3       12   720 DNAT       tcp  –  *      *       0.0.0.0/0            192.168.142.188      tcp dpt:80 to:10.1.1.11:80

Chain INPUT (policy ACCEPT 9 packets, 868 bytes)
num   pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 1 packets, 76 bytes)
num   pkts bytes target     prot opt in     out     source               destination        

Chain POSTROUTING (policy ACCEPT 2 packets, 136 bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1       94  128K SNAT       all  –  *      *       10.1.1.0/24          0.0.0.0/0            to:192.168.142.188
2        2   118 SNAT       all  –  *      *       10.1.1.0/24          0.0.0.0/0            to:192.168.142.123
3      169  134K LOG        all  –  *      *       10.1.1.0/24          0.0.0.0/0            LOG flags 0 level 4
4      441  518K MASQUERADE  all  –  *      *       10.1.1.0/24          0.0.0.0/0          
5        0     0 LOG        all  –  *      *       10.1.1.0/24          0.0.0.0/0            LOG flags 0 level 4

———–如何修改規則————
-A 增加
-I 插入
-D 刪除
-R 替換
[[email protected] ~]# iptables -D INPUT 3  //刪除input的第3條規則 
 
[[email protected] ~]# iptables -t nat -D POSTROUTING 1  //刪除nat表中postrouting的第一條規則 
 
[[email protected] ~]# iptables -F INPUT   //清空 filter表INPUT所有規則 
 
[[email protected] ~]# iptables -F    //清空所有規則 
 
[[email protected] ~]# iptables -t nat -F POSTROUTING   //清空nat表POSTROUTING所有規則

———-保存規則—
[[email protected] script]# iptables-save    ——–保存命令
# Generated by iptables-save v1.4.21 on Mon Nov 20 07:02:11 2017
*filter
:INPUT ACCEPT [215:18560]
:FORWARD ACCEPT [4:304]
:OUTPUT ACCEPT [144:16988]
-A INPUT -p tcp -m tcp –dport 20 -j ACCEPT
COMMIT
# Completed on Mon Nov 20 07:02:11 2017
# Generated by iptables-save v1.4.21 on Mon Nov 20 07:02:11 2017
*nat
:PREROUTING ACCEPT [121:133719]
:INPUT ACCEPT [20:2194]
:OUTPUT ACCEPT [5:380]
:POSTROUTING ACCEPT [6:440]
-A PREROUTING -i ens33 -p tcp -m tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80
-A PREROUTING -d 192.168.142.188/32 -i ens33 -p tcp -m tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80
-A PREROUTING -d 192.168.142.188/32 -p tcp -m tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80
-A POSTROUTING -s 10.1.1.0/24 -j SNAT –to-source 192.168.142.188
-A POSTROUTING -s 10.1.1.0/24 -j SNAT –to-source 192.168.142.123
-A POSTROUTING -s 10.1.1.0/24 -j LOG
-A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE
-A POSTROUTING -s 10.1.1.0/24 -j LOG
COMMIT
# Completed on Mon Nov 20 07:02:11 2017
[[email protected] script]#

                                                                                                                                                                 
"/etc/sysconfig/iptables"  ———實際配置存放的文件
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state –state NEW -m tcp –dport 22 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
 
————-MASQUERADE 配置讓內網機器出去上網——————
和其它硬件設備的overload一樣,叫接口負載或單IP負載
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j LOG   —在其它動作之前開啟日志

第一種配置方式 -j MASQUERADE 只能使用單一地址常用在PPP,ADSL等環境
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE
Chain POSTROUTING (policy ACCEPT)——–配置后顯示
target     prot opt source               destination        
MASQUERADE  all  –  10.1.1.0/24          0.0.0.0/0

————-snat 配置————–

第二種配置方式 -j SNAT –to-source 可選用其它地址
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT –to-source 192.168.142.188
Chain POSTROUTING (policy ACCEPT)——–配置后顯示
target     prot opt source               destination        
SNAT       all  –  10.1.1.0/24          0.0.0.0/0            to:192.168.142.188

————-dnat 配置————–
iptables -t nat -A PREROUTING -d 192.168.142.188 -p tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80

  [[email protected] script]# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        
DNAT       tcp  –  0.0.0.0/0            192.168.142.188      tcp dpt:80 to:10.1.1.11:80—-配置

Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
LOG        all  –  10.1.1.0/24          0.0.0.0/0            LOG flags 0 level 4
MASQUERADE  all  –  10.1.1.0/24          0.0.0.0/0          
[[email protected] script]#

使用接口配置后的結果
[[email protected] script]# iptables -t nat -I PREROUTING -i ens33  -p tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80
[[email protected] script]# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        
DNAT       tcp  –  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:10.1.1.11:80

———–dnat 驗證——–
[email protected]:~$ ip a |grep 192
    inet 192.168.142.140/24 brd 192.168.142.255 scope global ens33
[email protected]:~$ curl http://192.168.142.188
r1

[[email protected] ~]# tail -f /var/log/nginx/access.log
192.168.142.140 – – [20/Nov/2017:06:15:15 -0500] "GET / HTTP/1.1" 200 3 "-" "curl/7.47.0" "-"
192.168.142.140 – – [20/Nov/2017:06:15:20 -0500] "GET / HTTP/1.1" 200 3 "-" "curl/7.47.0" "-"
192.168.142.140 – – [20/Nov/2017:06:15:23 -0500] "GET / HTTP/1.1" 200 3 "-" "curl/7.47.0" "-"

———-配置詳解————-
  1、鏈
    netfilter在整個網絡流程中內置了幾條鏈(檢測點),而在每條鏈上登記了一些處理函數進行處理(如包過濾,NAT等,甚至可以是 用戶自定義的功能)。
    netfilter內置的五條鏈:    
       PREROUTING:路由決策前
       INPUT:到達本機內部的報文必經之路
       FORWARD:由本機轉發的報文必經之路
       OUTPUT:由本機發出的報文的必經之路
       POSTROUTING:路由決策后

數據報文流程:
       ①跟本機內部進程通信:
           進:PREROUTING,INPUT
           出:OUTPUT,POSTROUTING
       ②由本機轉發:
           PREROUTING,FORWARD,POSTROUTING    
  2、表
      netfilter由一些按功能分類的信息包處理表組成,這些表是內核用來控制信息包處理的規則集。
      netfilter的四個表:       
         filter:過濾,定義是否允許通過防火墻
         nat:網絡地址轉換,會啟用connection_track;
             SNAT:源地址轉換
             DNAT:目標地址轉換
             PNAT:端口和地址轉換
         mangle:可以用來改變包的一些屬性,如
             TOS(TYPE OF SERVICE):設置或改變數據包的服務類型
             TTL(TIME TO LIVE):改變數據包的生存時間
             MARK:給包設置特殊的標記
         raw:關閉nat表上啟用的連接追蹤功能(因連接追蹤功能比較消耗系統性能)
      表的處理優先級:raw > mangle > nat > filter
  3、表和鏈的對應關系為:      
       filter:INPUT,FORWARD,OUTPUT
       nat:PREROUTING(DNAT),POSTROUTING(SNAT),OUTPUT
       mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
       raw:PREROUTING,OUTPUT
      

二、iptables的用法
  1、基本語法:iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
    ■-t TABLE:nat, mangle, raw, filter。默認為filter
    ■COMMAND:
        鏈:
          -F:flush,清空表中的指定鏈,缺省為所有鏈
          -N:new,自建一條鏈
             自定義的鏈只能被主鏈上的規則作為跳轉目標,若自定義鏈上沒有規則能匹配報文,應讓其返回主鏈
             例:
               iptables -N http_in
               iptables -A http_in -m iprange –src-range 172.16.100.1-172.16.100.100 -j DROP
               iptables -A http_in -m state –state NEW -j ACCEPT
               iptables -A http_in -j RETURN  #返回主鏈
               iptables -A INPUT -d 172.16.100.7 -p tcp –dport 80 -j http_in
          -X:delete,刪除自定義且零引用的空鏈
          -Z:zero,數據包計數器和流量計數器歸零
          -P chain target:policy,設置默認策略,對filter表來講,默認策略為ACCEPT或DROP;注意 target 前面沒有-j
              例:iptables -P INPUT DROP
          -E old_name new_name:重命名零引用的自定義鏈
        鏈上的規則:
          -A:append,附加規則于鏈末
          -I chain [#]:insert,向鏈中插入規則;#表示規則編號,缺省為1
          -D chain #(或-D chain rule-specification):delete,刪除指定的規則
          -R chain #:替換指定的規則
        查詢:
          -L:列出指定鏈上的所有規則,缺省為所有鏈
              -n:以數字格式顯示
              -v:詳細格式,-vv,-vvv
              -x:exactly,不要對計數器的計數結果做單位換算,而顯示其精確值
              –line-numbers:顯示規則編號
     ■匹配條件:
        通用匹配:
          -s 地址:指定報文源IP地址匹配的范圍;可以是IP或網絡地址;可使用!取反;
                  –src, –source
          -d 地址:指定報文目標IP地址匹配的范圍;
                  –dst, –destination
          -p 協議:指定匹配報文的協議類型,一般為tcp, udp或icmp;
          -i INTERFACE:數據報文流入的接口;(PREROUTING, INPUT, FORWARD)
          -o INTERFACE:數據報文流出的接口;(OUTPUT, FORWARD, POSTROUITING)
      ▲擴展匹配:調用netfilter額外模塊實現特殊檢查
        △隱式擴展:當使用-p {tcp|udp|icmp}中的一種時,可以直接使用擴展專用選項;
            -p tcp:
               –sport PORT[-PORT]:指定源端口,可以是端口范圍
               –dport PORT[-PORT]:指定目標端口
               –tcp-flags 要檢查標志位列表(逗號分隔) 必須為1的標志位列表(逗號分隔)
                   例如:–tcp-flags syn,ack,rst,fin syn
                       –tcp-flags all none  #這些標志位全為1或全為0都不正常
               –syn:相當于–tcp-flags syn,ack,rst,fin syn
            -p udp:
               –sport
               –dport
            -p icmp:
               –icmp-type
                  0:echo-reply, ping響應
                  8:echo-request, ping請求
              例如:
                允許ping其它主機而不允許其它主機ping自己:
                  iptables -A OUTPUT -s 172.16.100.7 -p icmp –icmp–type 8 -j ACCEPT
                  iptables -A INTPUT -d 172.16.100.7 -p icmp –icmp–type 0 -j ACCEPT
         △顯式擴展:必須明確說明使用哪個模塊進行擴展,而后才能使用其擴展專用選項;
            -m 擴展模塊名稱
            常用模塊:
             multiport:多端口匹配;可用于匹配非連續或連續端口,最多指定15個端口;
               專用選項:
                  –source-ports, –sports port[,port,port:port]
                  –destination-ports, –dports
                  –ports
               例如:
                  iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport –dports 22,80 -j ACCEPT
                  iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport –sports 22,80 -j ACCEPT

             iprange:匹配指定范圍內的地址;
                專用選項:
                  [!] –src-ragne IP[-IP]
                  [!] –dst-range
                例如:
                  iptables -A INPUT -d 172.16.100.7 -p tcp –dport 23 -m iprange –src-range 172.16.100.1-172.16.100.100 -j ACCEPT
                  iptables -A OUTPUT -s 172.16.100.7 -p tcp –sport 23 -m iprange –dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

             string:字符串匹配,能夠檢測報文應用層中的字符串
                    字符匹配檢查高效算法:kmp, bm
                專用選項:
                  –algo {kmp|bm}
                  –string "STRING"
                  –hex-string "HEX_STRING":HEX_STRING為編碼成16進制格式的字串;
                例如:iptables -I OUTPUT -m string –algo kmp –string "sex" -j DROP

             time:基于時間做訪問控制
                專用選項:
                  –datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
                  –datestop
                  –timestart hh:mm[:ss]
                  –timestop hh:mm[:ss]
                  –weekdays day[,day]
                例如:iptables -I INPUT -d 172.16.100.7 -p tcp –dport 80 -m time –timestart 08:30 –timestop 17:30 –weekdays Mon,Tue,Thu,Fri -j REJECT

             connlimit:連接數限制,對每IP所能夠發起并發連接數做限制;
                專用選項:
                  [!] –connlimit-above [n]
                例如:iptables -A INPUT -d 172.16.100.7 -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP

             limit:速率限制
                專用選項:
                  –limit n[/second|/minute|/hour|/day]
                  –limit-burst n
                例如:iptables -A INPUT -d 172.16.100.7 -p icmp –icmp-type 8 -m limit –limit 20/minute –limit-burst 5 -j ACCEPT

             state:狀態檢查
                專用選項:
                  –state
                    連接追蹤中的狀態:
                      NEW: 新建立一個會話
                      ESTABLISHED:已建立的連接
                      RELATED: 有關聯關系的連接
                      INVALID: 無法識別的連接
                例如:
                  iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport –dports 22,80 -m state –state NEW -j ACCEPT
                  iptables -I INPUT -m state –state ESTABLISHED -j ACCEPT
                  iptables -I OUTPUT -m state –state ESTABLISHED -j ACCEPT
                調整連接追蹤功能所能容納的連接數上限:
                  /proc/sys/net/nf_conntrack_max和/proc/sys/net/netfilter/nf_conntrack_max(若連接數超出了上限,服務器會拒絕新的連接請求)
                當前追蹤的所有連接:
                  /proc/net/nf_conntrack
                不同協議或連接類型追蹤時的屬性:
                  /proc/sys/net/netfilter目錄
              ★放行被動模式下的FTP服務:
                  ⑴裝載模塊:modprobe nf_conntrack_ftp
                     /lib/modules/KERNEL_VERSION/kernel/net/netfilter/                            使用modprobe命令裝載模塊只是即時有效,重啟系統后失效,要想長期有效,可編輯iptables配置文件:
                       vim /etc/sysconfig/iptables-config
                         IPTABLES_MODULES="nf_conntrack_ftp"
                  ⑵放行請求報文
                    ①放行NEW狀態對21端口請求的報文;
                    ②放行ESTABLISHED以及RELATED狀態的報文
                  ⑶放行響應報文:
                     放行ESTABLISHED以及RELATED狀態的報文
     ■處理目標:
         DROP,REJECT,ACCEPT
         defi_chain
         RETURN:在自義鏈中無法匹配報文時,讓其返回主鏈
            iptables -A defi_chain -j RETURN
         SNAT,DNAT,MASQUERADE
         LOG,REDIRECT, MARK
            LOG表示記錄日志,例如 iptables -A INPUT -d 192.168.30.20 -p tcp –dport 80 -j LOG [–log-prefix "iptables:" [–log-level #]]      

三、iptables總結
   ①過濾應做白名單,即把默認策略設為DROP
   ②先添加規則放行自己的會話
   ③在編寫規則前可先定義一個重啟iptables服務的任務計劃,這樣即使因操作不當被防火墻屏蔽,待iptables重啟后又可重新進入
   ④盡量減少規則條目,彼此不相關的匹配機會較多的放在上面,屬于同一功能匹配規則更嚴格的放在上面

四、iptables使用示例
  1、限制本地主機的web服務器在周一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機;
     iptables -N web_in
     iptables -A web_in -m time –weekdays Mon -j DROP
     iptables -A web_in -m string –algo kmp –string "admin" -j DROP
     iptables -A web_in -m state –state ESTABLISHED -j ACCEPT
     iptables -A web_in -m state –state NEW -m limit –limit 100/second -j ACCEPT
     iptables -A web_in -j RETURN
     iptables -A INPUT -d 192.168.30.20 -p tcp –dport 80 -j web_in
     iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT

  2、在工作時間,即周一到周五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;
     iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
     iptables -A INPUT -s 172.16.0.0/16 -p tcp –dport 21 -m time –timestart 08:30 –timestop 17:30 –weekdays Mon,Tue,Wen,Thu,Fri -j ACCEPT
     iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

  3、開放本機的ssh服務給172.16.30.1-172.16.30.100中的主機,新請求建立的速率一分鐘不得超過2個;僅允許響應報文通過其服務端口離開本機;
     iptables -I INPUT -m state –state ESTABLISHED -j ACCEPT
     iptables -A INPUT -p tcp –dport 22 -m iprange –src-range 172.16.30.1-172.16.30.100 -m state –state NEW -m limit –limit 2/minute -j ACCEPT
     iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT

  4、拒絕TCP標志位全部為1及全部為0的報文訪問本機;
     iptables -I INPUT -p tcp –tcp-flags all none -j DROP
     iptables -I INPUT -p tcp –tcp-flags all all -j DROP

參考
http://9124573.blog.51cto.com/9114573/1740096

文章出自:CCIE那點事 http://www.qdxgqk.live/ 版權所有。本站文章除注明出處外,皆為作者原創文章,可自由引用,但請注明來源。 禁止全文轉載。
本文鏈接:http://www.qdxgqk.live/?p=3613轉載請注明轉自CCIE那點事
如果喜歡:點此訂閱本站
  • 相關文章
  • 為您推薦
  • 各種觀點
?
暫時還木有人評論,坐等沙發!
發表評論

您必須 [ 登錄 ] 才能發表留言!

?
?
萌宠夺宝游戏