iptables filter表
iptables擴展選項(了解)
其實匹配擴展中,還有需要加-m引用模塊的顯示擴展,默認是隱含擴展,不要使用-m。
狀態檢測的包過濾:
-m state --state {NEW,ESTATBLISHED,INVALID,RELATED} 指定檢測那種狀態
-m multiport 指定多端口號
--sport
--dport
--ports-m iprange 指定IP段
--src-range ip-ip
--dst-range ip-ip-m connlimit 連接限定
--comlimit-above # 限定大連接個數-m limit 現在連接速率,也就是限定匹配數據包的個數
--limit-burst # 峰值速率,最大限定-m string 按字符串限定
--algo bm|kmp 指定算法bm或kmp
--string "STRING" 指定字符串本身
規則:放行指定端口
使用腳本設定規則:
創建腳本: [root@adai003 ~]# vi /usr/local/sbin/iptables.sh #! /bin/bash ipt="/usr/sbin/iptables" # 定義一個變量——iptables命令(定義變量時盡量使用絕對路徑,避免環境變量的影響) $ipt -F # 清空原有規則 $ipt -P INPUT DROP $ipt -P OUTPUT ACCEPT $ipt -P FORWARD ACCEPT # 上面三行是定義其默認策略 $ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # -m是指定檢測狀態,--state指定數據包狀態(配合-m使用),該命令行的目的是使數據處理(通信 )更順暢 $ipt -A INPUT -s 192.168.8.0/24 -p tcp --dport 22 -j ACCEPT $ipt -A INPUT -p tcp --dport 80 -j ACCEPT $ipt -A INPUT -p tcp --dport 21 -j ACCEPT # 上面三行命令是指定放行的包的類型 icmp示例 iptables -I INPUT -p icmp --icmp-type 8 -j DROP 執行該腳本中的規則: [root@adai003 ~]# sh /usr/local/sbin/iptables.sh
註意: 腳本中指定的IP如果和主機IP不同時不要在遠程端口直接運行該腳本!
icmp協議示例
[root@adai003 ~]#iptables -I INPUT -p icmp --icmp-type 8 -j DROP
說明: 該規則的含義是:只允許本機訪問外網,不允許外網訪問本機!
10.16-10.18 iptables nat表應用
應用1
環境:
A機器兩塊網卡ens33(192.168.8.125)、ens37(192.168.100.1),ens33可以上外網,ens37僅僅是內部網絡,B機器只有ens37(192.168.100.100),和A機器ens37可以通信互聯。
準備工作:
準備兩臺虛擬機
A機器添加一塊網卡ens37,ens37的網絡連接方式選擇‘LAN區段模式’(內網交換機連接,該模式下Windows無法與該客戶端連接),開機後並設定IP為192.168.100.1
B機器關閉原有網卡連接,新增網卡ens37,開機後設定IP為192.168.100.100(網絡連接模式選擇LAN區段,並和A機器中的ens37網卡選擇相同區段)
設置ens37的IP:
方法1:
直接在命令行使用ifconfig命令
[root@adai003 ~]# ifconfig ens37 192.168.100.1/24
註: 該方法只是臨時設定IP,重啟後會丟失。
方法2: 復制ens33的配置文件,然後在配置問價年內進行設置!
需求:
需求1: 可以讓B機器連接外網
[root@adai003 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward 該命令是更改內核設置,打開路由轉發功能,默認值是0.
[root@adai003 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE [root@adai003 ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * ens33 192.168.100.0/24 0.0.0.0/0
說明: -o 選項後面跟設備名稱,表示出口網卡,MASQUERADE是偽裝、冒充的意思。
[root@adai003 ~]# route add default gw 192.168.100.1
[root@adai003 ~]# vim /etc/resolv.conf # Generated by NetworkManager nameserver 119.29.29.29
然後使用ping命令檢測,網絡通暢!
註: 此時B機器可以連通外網,但是外網機器無法訪問B機器,A機器的作用就類似於一個路由器!步驟四:配置DNS(編輯DNS配置文件)
步驟三:為B設置網關為A機器ens37的IP:
步驟二:在A機器的nat表中增加一條規則
步驟一:A機器打開路由轉發
需求2: C機器只能和A通信,讓C機器可以直接連通B機器的22端口(端口映射)
[root@adai003 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward 該命令是更改內核設置,打開路由轉發功能,默認值是0.
規則1: [root@adai003 ~]# iptables -t nat -A PREROUTING -d 192.168.8.125 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22 規則2: [root@adai003 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.8.125
[root@adai003 ~]# route add default gw 192.168.100.1
Finish!
步驟三:為B設置網關為A機器ens37的IP:
步驟二:在A機器的nat表中增加2條規則(執行該步驟前先清除nat表原有規則)
步驟一:A機器打開路由轉發
應用2
iptables限制syn(同步)速度
原理: 每5s內tcp三次握手大於20次的屬於不正常訪問。
[root@adai002 ~]# iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 -d 192.168.8.125 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name httpuser --rsource [root@adai002 ~]# iptables -A INPUT -m recent --update --seconds 5 --hitcount 20 --name httpuser --rsource -j DROP
說明: 其中192.168.0.0/255.255.255.0 為不受限制的網段,192.168.8.125為本機IP。
該iptables策略,可有效預防syn攻擊,也可以有效防止機器人發垃圾帖。
應用3
iptables針對一個網段設置規則:
[root@adai002 ~]# iptables -I INPUT -m iprange --src-range 61.4.176.0-61.4.191.255 -j DROP
iptables中DNAT、SNAT和MASQUERADE
DNAT(Destination Network Address Translation,目的地址轉換) 通常被叫做目的映射。
SNAT(Source Network Address Translation,源地址轉換)通常被叫做源映射。
iptables中DNAT和SNAT工作原理:
在任何一個IP數據包中,都會有Source IP Address與Destination IP Address這兩個字段,數據包所經過的路由器也是根據這兩個字段是判定數據包是由什麽地方發過來的,它要將數據包發到什麽地方去。而iptables的DNAT與SNAT就是根據這個原理,對Source IP Address與Destination IP Address進行修改。
數據包在iptables中要經過的鏈(chain):
上圖是系統對數據包進行判定轉發的過程,在這裏,系統會根據IP數據包中的destination ip address中的IP地址對數據包進行分發。如果destination ip adress是本機地址,數據將會被轉交給INPUT鏈。如果不是本機地址,則交給FORWARD鏈檢測。
這也就是說,我們要做的DNAT要在進入判定轉發轉發過程之前進行,也就是在PREROUTING鏈中做,比如我們要把訪問202.103.96.112的訪問轉發到192.168.0.112上:“iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112”,這調規則的作用其實就是將已經達到這臺Linux網關(防火墻)上的數據包上的destination ip address從202.103.96.112修改為192.168.0.112然後交給系統路由進行轉發。
同理,SNAT要在數據包流出這臺機器之前的最後一個鏈也就是POSTROUTING鏈來進行操作:“iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66”,這個語句就是告訴系統把即將要流出本機的數據的source ip address修改成為58.20.51.66。這樣,數據包在達到目的機器以後,目的機器會將包返回到58.20.51.66也就是本機。如果不做這個操作,那麽你的數據包在傳遞的過程中,reply的包肯定會丟失。
MASQUERADE(偽裝)
假如當前系統用的是ADSL/3G/4G動態撥號方式,那麽每次撥號,出口IP都會改變,SNAT就會有局限性。
“iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE”
重點在MASQUERADE這個設定值就是將動態IP偽裝成為(-o)的那塊裝置上的IP,不管現在eth0的出口獲得了怎樣的動態IP,MASQUERADE會自動讀取eth0設定的IP地址然後做SNAT出去,這樣就實現了很好的動態SNAT地址轉換。
10.19 iptables規則備份和恢復
備份(另存為)
命令:iptables-save
[root@adai003 ~]# iptables-save > /tmp/ipt.txt
恢復
[root@adai003 ~]# iptables-restore < /tmp/ipt.txt
iptables filter表