[轉] iptables

原創做品,容許轉載,轉載時請務必以超連接形式標明文章 原始出處 、做者信息和本聲明。不然將追究法律責任。http://peaceweb.blog.51cto.com/3226037/923270 node

iptables(一)--初階 linux

一、TCP/IP三次握手 web

clip_image002

客戶端發起請求,SYN=1,ACK=0,產生個序列號,以100爲例
服務端確認客戶端的請求,而且也想客戶端請求,SYN=1,ACK=1,確認客戶端的請求,因此確認號+1 =101,而且在產生個序列號,這裏以300爲例
客戶端發送確認,因此SYN=0,ACK=1,序列號=101,確認服務器的序列號=301 算法

二、TCP/IP四次斷開 vim

clip_image004


首先客戶端發起斷開請求,FIN=1
服務器確認客戶端斷開請求,發個ACK
以後服務器在向客戶端發起FIN斷開請求
客戶端在確認服務器的斷開請求 服務器

因此第一次發起SYN=1的請求,也就是NEW狀態
當雙方已經創建鏈接後在發送的請求,就是ESTABLISHED狀態
當SYN=1,FIN=1的請求時,是INVALID狀態
最後還有個RELATED 相關聯狀態 網絡

三、iptables 工做流程 ssh

clip_image006

image

image


一、首先數據包進入,先進入mangle表的PREROUTING鏈,在這裏能夠根據須要改變數據包頭內容
二、以後進入nat表的PREROUTING鏈,在這裏能夠根據須要作DNAT,也就是目標地址轉換
三、進入路由判斷,判斷是進入本地的仍是轉發的
1) 若是進入本地的話進入INPUT鏈,以後按條件過濾限制進入
以後進入本機,在進入OUTPUT鏈,按條件過濾限制出去
離開本地
2) 若是是轉發的話進入,進入FORWARD鏈,根據條件限制轉發
以後進入POSTROUTING鏈,這裏能夠作SNAT
離開網絡接口 tcp

四、itpables表和鏈的功能
1)filter表主要處理過濾功能的
包含INPUT鏈:過濾全部目標地址是本機的數據包
  FORWARD鏈:過濾全部路過本機的數據包
  OUTPUT鏈:過濾全部由本機產生的數據包
2)nat表主要處理網絡地址轉換,能夠進行SNAT(改變數據包的源地址),DNAT(改變數據包的目標地址)
包含PREROUTING鏈:能夠再數據包到達防火牆是改變目標地址
  OUTPUT鏈:能夠改變本地產生的數據包的目標地址
  POSTROUTING鏈:在數據包離開防火牆是改變數據包的源地址
3)mangle表修改數據包:
包含PREROUTING鏈,INPUT鏈,FORWARD鏈,OUTPUT鏈,POSTROUTING鏈
這裏mangle不作過多操做,具體內容很少介紹了
其實還有一個表示raw表的,不經常使用的,可是他們的級別是
raw-->mangle-->nat-->filter
raw最高,filter最低,iptables默認操做的是filter表 ui

五、iptables命令
iptables 格式
iptables [-t tables] command chains [creteris] -j ACTION

-t 指定表:{raw|mangle|nat|filter},默認filter

command:對錶的操做,分爲如下幾類
規則管理類:(# 表示數字)
              -A :追加
               -I # :插入
               -D # :刪除
               -R # :替換,修改
鏈管理類:
               -F :清空鏈
               -N :新建鏈
               -X :刪除自定義鏈,必須空鏈
               -E :重命名
               -L :查看
                      -n :以數字顯示
                      -v :詳細信息
                      -x :精確的
                      --line-number :顯示行號
               -P :修改鏈的默認策略
               -Z  :清空計數器
每條規程都有倆計數器
被此規則匹配到的全部數據包的個數;
被此規則匹配到的全部數據包的大小和;
creteris:匹配條件
基本匹配
             -s 源地址,ip/network  !表示取反
             -d 目標地址
             -p 協議  {tcp|udp|icmp}
             -i INTERFACE :那個接口進來的,例"-i eth0"表示從 eth0 進來的
             -o INTERFACE :那個接口出去的,例"-i eth0"表示從 eth0 出去的
擴展匹配:指的是調用iptables的模塊,以擴展iptables的匹配功能,須要加-m
隱含擴展,省略了-m
協議擴展指定
                  -p tcp
                     --sport PORT  :源端口+ 端口號
                     --dport PORT  :目標端口+ 端口號
                  -p udp
                     --sport PORT
                     --dport PORT
                    -p icmp
                       --icmp-type
                          echo-request: 表示請求,能夠用數字8表示
                          echo-reply: 表示迴應,能夠用數字0表示
-j:判斷
                     ACCEPT  容許
                     DROP 丟棄
                     REJECT 拒絕

六、iptables簡單使用:
# iptabls -L :查看

clip_image008

若是相信其餘表指定便可,這裏咱們都是空的,-L 後面也能夠加-n,-v,--line-number使用也能夠一塊兒添加,每一個選項間要加空格
# iptables -t nat -L
# iptables -L -n -v --line-number

首先先作個httpd服務,訪問正常的,以後下的命令是拒絕任何人訪問192.168.80.138,在訪問就不行了,並且ssh也被斷開了,因此若是這遠程在機房的話就很麻煩了,全部咱們能夠寫個每3分鐘執行清空iptables的計劃任務就能夠了
# iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.80.138 -j DROP
(這裏我指定了filter表,不指的話默認也是filter表)

下面清空下iptables
# iptables -F

以前的命令拒絕了全部,不可能這樣的,要指定拒絕那個服務才能夠,因此下面拒絕別人訪問本機web服務,其餘服務正常
# iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.80.138 -p tcp --dport 80 -j DROP
(這裏沒有指定表,因此默認是filter表)

下面咱們拒絕別人Ping,ping協議是icmp的,8表明請求,因此下面就在Ping下就發現不通了。
# iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.80.138 -p icmp --icmp-type 8 -j DROP

這須要注意-A是在當前的規則後面增長,-I 的話能夠指定在那個規則前面添加,好比
# iptables -I INPUT 2 -s 0.0.0.0/0.0.0.0 -d 192.168.80.138 -p tcp --dport 22 -j ACCEPT

下面修改默認策略
#iptables -P INPUT DROP

clip_image010

注:也好規則後重啓服務是不會保存的,因此能夠經過# service iptables save 來保存咱們的規則

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  指定速率
      --limit-burst # 峯值速率,最大限定
-m string 按字符串限定
      --algo bm|kmp  指定算法bm或kmp
      --string "STRING" 指定字符串自己
# iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.80.139 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

容許任何主機狀態爲NEW,ESTABLISHED的狀態鏈接,這裏要注意當寫成0.0.0.0/0.0.0.0 表示任意地址的時候是能夠省略的,以下便可:
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

容許本機的ESTABLISHED狀態出去,爲了防止有反彈時木馬,讓服務器主動向外發起請求
# iptables -A OUTPUT -s 192.168.80.140 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

以後再修改默認權限爲拒絕便可
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP

如今在本機ping 127.0.0.1,發現時不一樣的,因此要容許本機,下面在寫一個:
# iptables -I INPUT 1 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# iptables -I OUTPUT 1 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

若是要限制80端口的話,那在就在寫一條,如今寫在一條裏,爲了節省查詢時間
以前的--sport或--dport 後面能夠添加連續的如 --sport 22:80 表示從22到80的全部端口,不符合如今的條件,因此咱們用第二個顯示擴展:

# iptables -A INPUT -d 192.168.80.140 -p tcp -m multiport --dport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
這樣就把22,80 和在一塊兒的,OUTPUT同理但注意源端口目標端口,以後再刪除原來的便可
(注意:有SSH的話必定要先添加在刪除)

這裏須要知道一點,從本機出去的ESTABLISHED都是現請求進來的,因此能夠寫成以下:
# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
表示全部客戶端NEW請求進來服務器返回ESTABLISHED的狀態所有容許

也能夠添加在INPUT中,提升查詢速度
# iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT
這裏的原理是,當NEW請的時候匹配他本身的那條規則,當創建鏈接後直接就匹配這條規則,提升效率
例如:第一條是容許ESTABISHED 的,第二條是22,的NEW,ESTABLISHED的規則,這樣當用戶請求22的時候先匹配22的NEW,以後的ESTABLISHED狀態時直接匹配第一條,不用在去匹配第二條的規則了,這樣當咱們有許多條目的時候大大提升了效率

# iptables -A INPUT -d 192.168.80.140 -m iprange --src-range 192.168.80.130-192.168.80.150 -p tcp --dport 23 -m state --state NEW -j ACCEPT
指定192.168.80.130-192.168.80.150 能夠訪問本機的23端口

# iptables -I INPUT 2 -d 192.168.80.140 -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 2 -j ACCEPT

這裏connlimit ! --connlimit-above 2 -j ACCEPT 表示只容許SSH本機2次,connlimit --connlimit-above 2 -j DROP 表示超過2次後拒絕,這裏由於默認權限是拒絕的因此用!取反,並且前面有寫容許22端口的,這裏不匹配後就會先下匹配那條,將匹配22容許的更改便可。

# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 80 -m state --state  NEW -m limit --limit 1/second --limit-burst 3 -j ACCEPT
表示對web服務的新鏈接請求,平均每秒只容許1個,最多一次進3個

# iptables -I OUTPUT 1 -m string --algo kmp --string "peace" -j DROP
表示本機響應當中包含「peace」字符串的機拒絕

二、如何開發FTP
主動模式開放FTP

# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 21 -m state --state NEW -j ACCEPT
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 20 -m state --state NEW -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

被動模式開放FTP
1)清空以前的配置,重啓服務便可
# service iptables restart

2)先添加ssh規則
# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 3 -j ACCEPT
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP

3)下面開啓FTP
# iptables -A INPUT -d 192.168.80.140 -p tcp --dport 21 -m state --state NEW -j ACCEPT

可是訪問仍是不行

clip_image012

4)先加載模塊
# modprobe ip_nat_ftp
# lsmod | grep ftp
ip_nat_ftp              7361  0
ip_nat                 20973  1 ip_nat_ftp
ip_conntrack_ftp       11569  1 ip_nat_ftp
ip_conntrack           53409  5 ip_nat_ftp,ip_nat,ip_conntrack_ftp,xt_connlimit,xt_state

5)開發RELATED狀態
# iptables -R INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -R OUTPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

6)在鏈接下發現能夠了

clip_image014

前面重啓服務的話規則就沒有了,因此當肯定後了以後執行如下命令保存:
# service iptables save 或# iptables-save > /etc/sysconfig/iptables
這裏有兩個文件要知道下:
/etc/sysconfig/iptables: 保存規則的文件
/etc/sysconfig/iptables-config:向iptables腳本提供配置文件的文件

三、SNAT於DNAT配置
SNAT,首先清空以前的配置,拓撲以下:

clip_image016

先ping下,是不一樣的

clip_image018

1)先開啓路由功能
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p

2)client 添加路由
route add 172.16.0.0 mask 255.255.0.0 192.168.80.140
web添加路由
# route add -net 0.0.0.0 gw 172.16.15.20

訪問發現是192.168.80.1訪問的

clip_image020

3)下面也能夠添加個拒絕PING的
# iptables -A FORWARD -p icmp --icmp-type 8 -j REJECT

添加SNAT規則
# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -j SNAT --to-source 172.16.15.20

4)訪問172.16.15.30下web在看日誌,發現已是172.16.15.20

clip_image022

這裏至指定的一個IP地址,若是是撥號的話這個地址是不固定的因此能夠用以下方式:
# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -j MASQUERADE
不過這種方法比指定更消耗資源

另將web添加的路由刪除,發現也是能夠訪問的。

DNAT的實現
拓撲以下:

clip_image024

1)先開啓路由功能
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p

2)這裏的web就必定要指定網關了
# route add -net 0.0.0.0 gw 172.16.15.20

3)添加規則,將請求192.168.80.140的web轉換到172.16.15.30上
# iptables -t nat -A PREROUTING -d 192.168.80.140 -p tcp --dport 80 -j DNAT --to-destination 172.16.15.30

4)訪問192.168.80.140後看下日誌,發現是192.168.80.1

clip_image026

5)這裏本地服務器沒有log記錄,要添加的話以下:
# iptables -t nat -I PREROUTING 1 -d 192.168.80.140 -p tcp --dport 80 -j LOG --log-prefix "DNAT for Web:"

6)以後看下本地日誌,tail /var/log/messages 發現本地已經有日誌信息了

clip_image028

四、利用recent抵禦DOS攻擊

# iptables -I INPUT -p tcp --dport 22 -m connlimit -connlimit-above 3 -j DROP

# iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set -name SSH
記錄訪問tcp 22端口的新鏈接,記錄名稱爲SSH--set 記錄數據包的來源IP,若是IP已經存在將更新已經存在的條目

iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
# 指SSH記錄中的IP,300s內發起超過3次鏈接則拒絕此IP的鏈接。

五、作應用層的iptables,限制迅雷,QQ:
注意這裏的版本有要求的:
iptables-1.4.3以上
kernel-2.6.20以上

試驗步驟:
1)給內核打補丁,並從新編譯內核

# tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src
# tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src
# cd /usr/src
# ln –s  linux-2.6.28.10  linux
# cd /usr/src/linux/
# patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch

# cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config
# make  menuconfig

編譯選着以下內容
Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration
<M>  Netfilter connection tracking support
<M>  「layer7」 match support
<M>  「string」 match support
<M>  「time」  match support
<M>  「iprange」  match support
<M>  「connlimit」  match support
<M>  「state」  match support
<M>  「conntrack」  connection  match support
<M>  「mac」  address  match support
<M>   "multiport" Multiple port match support

Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration
<M> IPv4 connection tracking support (required for NAT)
<M>   Full NAT
<M>     MASQUERADE target support                                                                                 
<M>     NETMAP target support                                                                             
<M>     REDIRECT target support

編譯安裝
# make
# make modules_install
# make install
2)給iptables源碼打補丁,並從新編譯iptables
# cp /etc/init.d/iptables ~/iptables
# cp /etc/sysconfig/iptables-config ~/
# rpm  -e  iptables-ipv6  iptables  iptstate  --nodeps
# tar jxvf iptables-1.4.6.tar.bz2 –C  /usr/src
# cd /usr/src/iptables-1.4.6
# cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.*   ./extensions/

# ./configure  --prefix=/usr  --with-ksource=/usr/src/linux
# make
# make install

3)安裝l7proto

# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install

# mv ~/iptables  /etc/rc.d/init.d/
這裏的iptables文件要作修改的將/sbin/$IPTABLES改爲/usr/sbin/$IPTABLISH
# service iptables start

# iptables -A FORWARD -m layer7 --l7proto xunlei -j DROP  限制xunlei
限制的相關信息都在這裏 /etc/l7-protocols/protocols/ 能夠產考,像qq,pplive等都有的

clip_image030

相關文章
相關標籤/搜索