主頁 > 作業系統 > centos下iptables防火墻規則用法和概述

centos下iptables防火墻規則用法和概述

2020-09-25 17:17:43 作業系統

   iptables是組成Linux平臺下的包過濾防火墻,與大多數的Linux軟體一樣,這個包過濾防火墻是免費的,它可以代替昂貴的商業防火墻解決方案,完成封包過濾、封包重定向和網路地址轉換(NAT)等功能,在日常Linux運維作業中,經常會設定iptables防火墻規則,用來加固服務安全,

以下對iptables的規則使用做了總結性梳理:

iptables首先需要了解的:
1)規則概念
規則(rules)其實就是網路管理員預定義的條件,規則一般的定義為“如果資料包頭符合這樣的條件,就這樣處理這個資料包”,規則存盤在內核空間的資訊 包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務型別(如HTTP、FTP和SMTP)等,
當資料包與規則匹配時,iptables就根據規則所定義的方法來處理這些資料包,如放行(accept),拒絕(reject)和丟棄(drop)等,配置防火墻的主要作業是添加,修改和洗掉等規則,
其中:
匹配(match):符合指定的條件,比如指定的 IP 地址和埠,
丟棄(drop):當一個包到達時,簡單地丟棄,不做其它任何處理,
接受(accept):和丟棄相反,接受這個包,讓這個包通過,
拒絕(reject):和丟棄相似,但它還會向發送這個包的源主機發送錯誤訊息,這個錯誤訊息可以指定,也可以自動產生,
目標(target):指定的動作,說明如何處理一個包,比如:丟棄,接受,或拒絕,
跳轉(jump):和目標類似,不過它指定的不是一個具體的動作,而是另一個鏈,表示要跳轉到那個鏈上,
規則(rule):一個或多個匹配及其對應的目標,

2)iptables和netfilter的關系: 
Iptables和netfilter的關系是一個很容易讓人搞不清的問題,很多的知道iptables卻不知道 netfilter,其實iptables只是Linux防火墻的管理工具而已,位于/sbin/iptables,真正實作防火墻功能的是 netfilter,它是Linux內核中實作包過濾的內部結構,

3)iptables的規則表和鏈
表(tables):提供特定的功能,iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用于實作包過濾,網路地址轉換、包重構(修改)和資料跟蹤處理,
鏈(chains):是資料包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一 潭訓數條規則,當一個資料包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該資料包是否滿足規則所定義的條件,如果滿足,系統就會根據 該條規則所定義的方法處理該資料包;否則iptables將繼續檢查下一條規則,如果該資料包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的默認策略來處理資料包,

Iptables采用“表”和“鏈”的分層結構,在Linux中現在是四張表五個鏈,下面羅列一下這四張表和五個鏈(注意一定要明白這些表和鏈的關系及作用),

規則表:
    1)filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾資料包 內核模塊:iptables_filter.
    2)Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用于網路地址轉換(IP、埠) 內核模塊:iptable_nat
    3)Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改資料包的服務型別、TTL、并且可以配置路由實作QOS內核模塊:iptable_mangle(別看這個表這么麻煩,咱們設定策略時幾乎都不會用到它)
   4)Raw表——兩個鏈:OUTPUT、PREROUTING
作用:決定資料包是否被狀態跟蹤機制處理 內核模塊:iptable_raw

規則鏈:
   1)INPUT——進來的資料包應用此規則鏈中的策略
   2)OUTPUT——外出的資料包應用此規則鏈中的策略
   3)FORWARD——轉發資料包時應用此規則鏈中的策略
   4)PREROUTING——對資料包作路由選擇前應用此鏈中的規則
(記住!所有的資料包進來的時侯都先由這個鏈處理)
   5)POSTROUTING——對資料包作路由選擇后應用此鏈中的規則
(所有的資料包出來的時侯都先由這個鏈處理)

管理和設定iptables規則:

4)iptables傳輸資料包的程序

   1)當一個資料包進入網卡時,它首先進入PREROUTING鏈,內核根據資料包目的IP判斷是否需要轉送出去, 
   2)如果資料包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈,資料包到了INPUT鏈后,任何行程都會收到它,本機上運行的程式可以發送資料包,這些資料包會經過OUTPUT鏈,然后到達POSTROUTING鏈輸出, 
   3)如果資料包是要轉發出去的,且內核允許轉發,資料包就會如圖所示向右移動,經過FORWARD鏈,然后到達POSTROUTING鏈輸出,

如果還是不清楚資料包經過iptables的基本流程,再看下面更具體的流程圖:

從圖中可將iptables資料包報文的處理程序分為三種型別:
1)目的為本機的報文
報文以本機為目的地址時,其經過iptables的程序為:

1.資料包從network到網卡
2.網卡接收到資料包后,進入raw表的PREROUTING鏈,這個鏈的作用是在連接跟蹤之前處理報文,能夠設定一條連接不被連接跟蹤處理,(注:不要在raw表上添加其他規則)
3.如果設定了連接跟蹤,則在這條連接上處理,
4.經過raw處理后,進入mangle表的PREROUTING鏈,這個鏈主要是用來修改報文的TOS、TTL以及給報文設定特殊的MARK,(注:通常mangle表以給報文設定MARK為主,在這個表里面,千萬不要做過濾/NAT/偽裝這類的事情)
5.進入nat表的PREROUTING鏈,這個鏈主要用來處理 DNAT,應該避免在這條鏈里面做過濾,否則可能造成有些報文會漏掉,(注:它只用來完成源/目的地址的轉換)
6.進入路由決定資料包的處理,例如決定報文是上本機還是轉發或者其他地方,(注:此處假設報文交給本機處理)
7.進入mangle表的 INPUT 鏈,在把報文實際送給本機前,路由之后,我們可以再次修改報文,
8.進入filter表的 INPUT 鏈,在這兒我們對所有送往本機的報文進行過濾,要注意所有收到的并且目的地址為本機的報文都會經過這個鏈,而不管哪個介面進來的或者它往哪兒去,
9. 進過規則過濾,報文交由本地行程或者應用程式處理,例如服務器或者客戶端程式,

 

2)本地主機發出報文

資料包由本機發出時,其經過iptables的程序為:

1.本地行程或者應用程式(例如服務器或者客戶端程式)發出資料包,
2.路由選擇,用哪個源地址以及從哪個介面上出去,當然還有其他一些必要的資訊,
3.進入raw表的OUTPUT鏈,這里是能夠在連接跟蹤生效前處理報文的點,在這可以標記某個連接不被連接跟蹤處理,
4.連接跟蹤對本地的資料包進行處理,
5.進入 mangle 表的 OUTPUT 鏈,在這里我們可以修改資料包,但不要做過濾(以避免副作用),
6.進入 nat 表的 OUTPUT 鏈,可以對防火墻自己發出的資料做目的NAT(DNAT) ,
7.進入 filter 表的 OUTPUT 鏈,可以對本地出去的資料包進行過濾,
8.再次進行路由決定,因為前面的 mangle 和 nat 表可能修改了報文的路由資訊,
9.進入 mangle 表的 POSTROUTING 鏈,這條鏈可能被兩種報文遍歷,一種是轉發的報文,另外就是本機產生的報文,
10.進入 nat 表的 POSTROUTING 鏈,在這我們做源 NAT(SNAT),建議你不要在這做報文過濾,因為有副作用,即使你設定了默認策略,一些報文也有可能溜過去,
11.進入出去的網路介面

 

3)轉發報文

報文經過iptables進入轉發的程序為:
1.資料包從network到網卡
2.網卡接收到資料包后,進入raw表的PREROUTING鏈,這個鏈的作用是在連接跟蹤之前處理報文,能夠設定一條連接不被連接跟蹤處理,(注:不要在raw表上添加其他規則)
3.如果設定了連接跟蹤,則在這條連接上處理,
4.經過raw處理后,進入mangle表的PREROUTING鏈,這個鏈主要是用來修改報文的TOS、TTL以及給報文設定特殊的MARK,(注:通常mangle表以給報文設定MARK為主,在這個表里面,千萬不要做過濾/NAT/偽裝這類的事情)
5.進入nat表的PREROUTING鏈,這個鏈主要用來處理 DNAT,應該避免在這條鏈里面做過濾,否則可能造成有些報文會漏掉,(注:它只用來完成源/目的地址的轉換)
6.進入路由決定資料包的處理,例如決定報文是上本機還是轉發或者其他地方,(注:此處假設報文進行轉發)
7.進入 mangle 表的 FORWARD 鏈,這里也比較特殊,這是在第一次路由決定之后,在進行最后的路由決定之前,我們仍然可以對資料包進行某些修改,
8.進入 filter 表的 FORWARD 鏈,在這里我們可以對所有轉發的資料包進行過濾,需要注意的是:經過這里的資料包是轉發的,方向是雙向的,
9.進入 mangle 表的 POSTROUTING 鏈,到這里已經做完了所有的路由決定,但資料包仍然在本地主機,我們還可以進行某些修改,
10.進入 nat 表的 POSTROUTING 鏈,在這里一般都是用來做 SNAT ,不要在這里進行過濾,
11.進入出去的網路介面,

 

接下來說下iptables規則設定用法

1)iptables的基本語法格式

iptables [-t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]
說明:
表名、鏈名:用于指定iptables命令所操作的表和鏈;
命令選項:用于指定管理iptables規則的方式(比如:插入、增加、洗掉、查看等;
條件匹配:用于指定對符合什么樣 條件的資料包進行處理;
目標動作或跳轉:用于指定資料包的處理方式(比如允許通過、拒絕、丟棄、跳轉(Jump)給其它鏈處理,

 

2)iptables命令的管理控制選項

-A 在指定鏈的末尾添加(append)一條新的規則 
-D 洗掉(delete)指定鏈中的某一條規則,可以按規則序號和內容洗掉 
-I 在指定鏈中插入(insert)一條新的規則,默認在第一行添加 
-R 修改、替換(replace)指定鏈中的某一條規則,可以按規則序號和內容替換 
-L 列出(list)指定鏈中所有的規則進行查看(默認是filter表,如果列出nat表的規則需要添加-t,即iptables -t nat -L)
-E 重命名用戶定義的鏈,不改變鏈本身 
-F 清空(flush) 
-N 新建(new-chain)一條用戶自己定義的規則鏈 
-X 洗掉指定表中用戶自定義的規則鏈(delete-chain) 
-P 設定指定鏈的默認策略(policy)
-Z 將所有表的所有鏈的位元組和資料包計數器清零 
-n 使用數字形式(numeric)顯示輸出結果 
-v 查看規則表詳細資訊(verbose)的資訊 
-V 查看版本(version) 
-h 獲取幫助(help)

 

3)防火墻處理資料包的四種方式ACCEPT 允許資料包通過
DROP 直接丟棄資料包,不給任何回應資訊
REJECT 拒絕資料包通過,必要時會給資料發送端一個回應的資訊,
LOG在/var/log/messages檔案中記錄日志資訊,然后將資料包傳遞給下一條規則

4)iptables防火墻規則的保存與恢復
iptables-save把規則保存到檔案中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動裝載
使用命令iptables-save來保存規則,

一般用:
iptables-save > /etc/sysconfig/iptables
生成保存規則的檔案/etc/sysconfig/iptables
也可以用:
service iptables save
它能把規則自動保存在/etc/sysconfig/iptables中

 

當計算機啟動時,rc.d下的腳本將用命令iptables-restore呼叫這個檔案,從而就自動恢復了規則,

5)iptables防火墻常用的策略梳理
設定默認鏈策略
ptables的filter表中有三種鏈:INPUT, FORWARD和OUTPUT,
默認的鏈策略是ACCEPT,可以將它們設定成DROP,如下命令就將所有包都拒絕了:

iptables -P INPUT DROP 
iptables -P FORWARD DROP 
iptables -P OUTPUT DROP

 

---------------------------------------------------------------------------------------------------------------------------
其實,在運維作業中最常用的兩個規則就是白名單規則和NAT轉發規則:

1)白名單規則

在linux終端命令列里操作時,如果不是默認的filter表時,需要指定表;
如果在/etc/sysconfig/iptables檔案里設定,就在對應表的配置區域內設定;
上面兩種方式設定效果是一樣的!

比如開通本機的22埠,允許192.168.1.0網段的服務器訪問(-t filter表配置可以省略,默認就是這種表的配置)

iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
或者
iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

 

開通本機的80埠,只允許192.168.1.150機器訪問(32位掩碼表示單機,單機指定時可以不加掩碼)

iptables -t filter -A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
然后保存規則,重啟iptables
service iptables save
service iptables restart

 

或者在/etc/sysconfig/iptables檔案里設定如下(其實上面在終端命令列里設定并save和restart防火墻后,就會自動保存規則到/etc/sysconfig/iptables這個檔案中的):

[root@bastion-IDC ~]# cat /etc/sysconfig/iptables
......
*filter
:INPUT ACCEPT [442620:173026884]
:FORWARD ACCEPT [118911:23993940]
:OUTPUT ACCEPT [8215384:539509656]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

[root@bastion-IDC ~]# service iptables restart

 

2)NAT轉發設定

比如訪問本機(192.168.1.7)的8088埠轉發到192.168.1.160的80埠;訪問本機的33066埠轉發到192.168.1.161的3306埠
準備作業:
本機打開ip_forword路由轉發功能;192.168.1.160/161的內網網關要和本機網關一致!如果沒有內網網關,就將網關設定成本機內網ip,并且關閉防火墻(防火墻要是打開了,就設定對應埠允許本機訪問)

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80
iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT iptables -t nat -A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306
iptables -t nat -A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT service iptables save service iptables restart 或者在/etc/sysconfig/iptables檔案里設定如下 [root@bastion-IDC ~]# cat /etc/sysconfig/iptables ...... *nat :PREROUTING ACCEPT [60:4250] :INPUT ACCEPT [31:1973] :OUTPUT ACCEPT [3:220] :POSTROUTING ACCEPT [3:220] -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80 //PREROUTING規則都放在上面 -A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306 -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7 //POSTROUTING規則都放在下面 -A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7 ..... *filter :INPUT ACCEPT [16:7159] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [715:147195] -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 8088 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT ..... [root@bastion-IDC ~]# service iptables restart [root@bastion-IDC ~]# iptables -L //列出設定的規則,默認列出的是filter表下的規則 [root@bastion-IDC ~]# iptables -L -t nat //如果列出nat表下規則,就加-t引數

 

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

洗掉INPUT鏈的第一條規則

iptables -D INPUT 1

 

拒絕進入防火墻的所有ICMP協議資料包

iptables -I INPUT -p icmp -j REJECT

 

允許防火墻轉發除ICMP協議以外的所有資料包

iptables -A FORWARD -p ! icmp -j ACCEPT
說明:使用“!”可以將條件取反

 

拒絕轉發來自192.168.1.10主機的資料,允許轉發來自192.168.0.0/24網段的資料

iptables -A FORWARD -s 192.168.1.11 -j REJECT 
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
說明:注意一定要把拒絕的放在前面不然就不起作用了!

 

丟棄從外網介面(eth1)進入防火墻本機的源地址為私網地址的資料包

iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP 
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP 
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

 

封堵網段(192.168.1.0/24),兩小時后解封

# iptables -I INPUT -s 10.20.30.0/24 -j DROP 
# iptables -I FORWARD -s 10.20.30.0/24 -j DROP 
# at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1
說明:這個策略可以借助crond計劃任務來完成,就再好不過了

 

只允許管理員從202.13.0.0/16網段使用SSH遠程登錄防火墻主機

iptables -A INPUT -s 202.13.0.0/16 -p tcp -m tcp -m state --state NEW --dport 22  -j ACCEPT 
說明:這個用法比較適合對設備進行遠程管理時使用,比如位于分公司中的SQL服務器需要被總公司的管理員管理時

 

通常在服務器上會對某一服務埠的訪問做白名單限制,比如(其他埠設定和下面一致):
運行本機的3306埠(mysql服務)被訪問

iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT 
或者只運行本機的3306埠被192.168.1.0/24網段機器訪問
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT

 

允許本機開放從TCP埠20-1024提供的應用服務

iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 20:1024 -j ACCEPT

 

允許轉發來自192.168.0.0/24局域網段的DNS決議請求資料包

iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT 
iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT

 

屏蔽指定的IP地址
以下規則將屏蔽BLOCK_THIS_IP所指定的IP地址訪問本地主機:

BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
(或者僅屏蔽來自該IP的TCP資料包)
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

 

屏蔽環回(loopback)訪問

iptables -A INPUT -i lo -j DROP
iptables -A OUTPUT -o lo -j DROP

 

屏蔽來自外部的ping,即禁止外部機器ping本機

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP

 

屏蔽從本機ping外部主機,禁止本機ping外部機器

iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -p icmp --icmp-type echo-reply -j DROP

 

禁止其他主機ping本機,但是允許本機ping其他主機(禁止別人ping本機,也可以使用echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all)

iptables -I INPUT -p icmp --icmp-type echo-request -j DROP 
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT 
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT

 

禁止轉發來自MAC地址為00:0C:29:27:55:3F的和主機的資料包

iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP
說明:iptables中使用“-m 模塊關鍵字”的形式呼叫顯示匹配,咱們這里用“-m mac –mac-source”來表示資料包的源MAC地址

 

允許防火墻本機對外開放TCP埠20、21、25、110以及被動模式FTP埠1250-1280

iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
注意:這里用“-m multiport --dport”來指定多個目的埠
iptables -A INPUT -p tcp -m tcp -m multiport --dports 22,80,443,1250-1280 -m state --state NEW -j ACCEPT
也可以將這幾個埠分開設定多行:
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 1250:1280 -j ACCEPT

 

禁止轉發源IP地址為192.168.1.20-192.168.1.99的TCP資料包

iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
說明:
此處用“-m iprange --src-range”指定IP范圍
1)過濾源地址范圍:
iptables -A INPUT -m iprange --src-range 192.168.1.2-192.168.1.7 -j DROP
2)過濾目標地址范圍:
iptables -A INPUT -m iprange --dst-range 192.168.1.2-192.168.1.7 -j DROP
3)針對埠訪問的過濾,下面表示除了192.168.1.5-192.168.1.10之間的ip能訪問192.168.1.67機器的80埠以外,其他ip都不可以訪問!
iptables -A INPUT -d 192.168.1.67 -p tcp --dport 80 -m iprange --src-range 192.168.1.5-192.168.1.10 -j ACCEPT

 

禁止轉發與正常TCP連接無關的非--syn請求資料包

iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
說明:“-m state”表示資料包的連接狀態,“NEW”表示與任何連接無關的

 

拒絕訪問防火墻的新資料包,但允許回應連接或與已有連接相關的資料包

iptables -A INPUT -p tcp -m state --state NEW -j DROP 
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
說明:“ESTABLISHED”表示已經回應請求或者已經建立連接的資料包,“RELATED”表示與已建立的連接有相關性的,比如FTP資料連接等

 

防止DoS攻擊

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
-m limit: 啟用limit擴展,限制速度,
--limit 25/minute: 允許最多每分鐘25個連接
--limit-burst 100: 當達到100個連接后,才啟用上述25/minute限制

--icmp-type 8 表示 Echo request——回顯請求(Ping請求),下面表示本機ping主機192.168.1.109時候的限速設定:
iptables -I INPUT -d 192.168.1.109 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT

 

允許路由
如果本地主機有兩塊網卡,一塊連接內網(eth0),一塊連接外網(eth1),那么可以使用下面的規則將eth0的資料路由到eht1:

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

 

IPtables中可以靈活的做各種網路地址轉換(NAT)
網路地址轉換主要有兩種:SNAT和DNAT
1)SNAT是source network address translation的縮寫,即源地址目標轉換,
比如,多個PC機使用ADSL路由器共享上網,每個PC機都配置了內網IP,PC機訪問外部網路的時候,路由器將資料包的報頭中的源地址替換成路由器的ip,當外部網路的服務器比如網站web服務器接到訪問請求的時候,它的日志記錄下來的是路由器的ip地址,而不是pc機的內網ip,這是因為,這個服務器收到的資料包的報頭里邊的“源地址”,已經被替換了,所以叫做SNAT,基于源地址的地址轉換

2)DNAT是destination network address translation的縮寫,即目標網路地址轉換,
典型的應用是,有個web服務器放在內網中,配置了內網ip,前端有個防火墻配置公網ip,互聯網上的訪問者使用公網ip來訪問這個網站,
當訪問的時候,客戶端發出一個資料包,這個資料包的報頭里邊,目標地址寫的是防火墻的公網ip,防火墻會把這個資料包的報頭改寫一次,將目標地址改寫成web服務器的內網ip,然后再把這個資料包發送到內網的web服務器上,這樣,資料包就穿透了防火墻,并從公網ip變成了一個對內網地址的訪問了,即DNAT,基于目標的網路地址轉換

以下規則將會把本機192.168.1.17來自422埠的流量轉發到22埠,這意味著來自422埠的SSH連接請求與來自22埠的請求等效,

1)啟用DNAT轉發
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.17 --dport 422 -j DNAT --to-destination 192.168.1.17:22
2)允許連接到422埠的請求
iptables -t filter -A INPUT -p tcp -m tcp -m state --state NEW --dport 422 -j ACCEPT
3)保存規則
# service iptables save
# service iptables restart

 

假設現在本機外網網關是58.68.250.1,那么把HTTP請求轉發到內部的一臺服務器192.168.1.20的8888埠上,規則如下:

iptables -t nat -A PREROUTING -p tcp -i eth0 -d 58.68.250.1 --dport 8888 -j DNAT --to 192.168.1.20:80
iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
service iptables save
service iptables restart

 

或者或本機內網ip是192.168.1.10,那么把HTTP請求轉發到內部的一臺服務器192.168.1.20的8888埠上,規則如下:
準備作業:本機打開ip_forword路由轉發功能;192.168.1.20的內網網關要和本機網關保持一致!如果沒有內網網關,就將網關地址設定成本機內網ip,并且關閉防火墻(防火墻要是打開了,就設定對應埠允許本機訪問)

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 20022 -j DNAT --to-destination 192.168.1.150:22
iptables -t nat -A POSTROUTING -d 192.168.1.150/32 -p tcp -m tcp --sport 22 -j SNAT --to-source 192.168.1.8
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 20022 -j ACCEPT
service iptables save
service iptables restart

 

MASQUERADE,地址偽裝,在iptables中有著和SNAT相近的效果,但也有一些區別:

1)使用SNAT的時候,出口ip的地址范圍可以是一個,也可以是多個,例如:
     1)如下命令表示把所有10.8.0.0網段的資料包SNAT成192.168.5.3的ip然后發出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
     2)如下命令表示把所有10.8.0.0網段的資料包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等幾個ip然后發出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
這就是SNAT的使用方法,即可以NAT成一個地址,也可以NAT成多個地址,但是,對于SNAT,不管是幾個地址,必須明確的指定要SNAT的ip!

 

假如當前系統用的是ADSL動態撥號方式,那么每次撥號,出口ip192.168.5.3都會改變,而且改變的幅度很大,不一定是192.168.5.3到192.168.5.5范圍內的地址,
這個時候如果按照現在的方式來配置iptables就會出現問題了,因為每次撥號后,服務器地址都會變化,而iptables規則內的ip是不會隨著自動變化的,每次地址變化后都必須手工修改一次iptables,把規則里邊的固定ip改成新的ip,這樣是非常不好用的!

2)MASQUERADE就是針對上述場景而設計的,它的作用是,從服務器的網卡上,自動獲取當前ip地址來做NAT,
比如下邊的命令:

iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

 

如此配置的話,不用指定SNAT的目標ip了,
不管現在eth0的出口獲得了怎樣的動態ip,MASQUERADE會自動讀取eth0現在的ip地址然后做SNAT出去
這樣就實作了很好的動態SNAT地址轉換

再看看幾個運維實體設定:
1)限制本機的web服務器在周一不允許訪問;
     新請求的速率不能超過100個每秒;
     web服務器包含了admin字串的頁面不允許訪問:
     web 服務器僅允許回應報文離開本機;
設定如下:
周一不允許訪問

iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays Mon -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT

 

新請求速率不能超過100個每秒

iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/s -j ACCEPT

 

web包含admin字串的頁面不允許訪問,源埠:dport

iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'admin' -j REJECT

 

web服務器僅允許回應報文離開主機,放行埠(目標埠):sport

iptables -A OUTPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT

 

2)在作業時間,即周一到周五的8:30-18:00,開放本機的ftp服務給 192.168.1.0網路中的主機訪問;
    資料下載請求的次數每分鐘不得超過 5 個;
設定如下:

iptables -A INPUT -p tcp --dport 21 -s 192.168.1.0/24 -m time ! --weekdays 6,7 -m time --timestart 8:30 --timestop 18:00 -m connlimit --connlimit-above 5 -j ACCET

 

3)開放本機的ssh服務給192.168.1.1-192.168.1.100 中的主機;
     新請求建立的速率一分鐘不得超過2個;
    僅允許回應報文通過其服務埠離開本機;
設定如下:

iptables -A INPUT -p tcp --dport 22 -m iprange --src-rang 192.168.1.1-192.168.1.100 -m limit --limit 2/m -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m iprange --dst-rang 192.168.1.1-192.168.1.100 -m state --state ESTABLISHED -j ACCEPT

 

4)拒絕 TCP 標志位全部為 1 及全部為 0 的報文訪問本機;

iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

 

5)允許本機 ping 別的主機;但不開放別的主機 ping 本機;

iptables -I INPUT -p icmp --icmp-type echo-request -j DROP 
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT 
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
或者下面禁ping操作:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

 

以上就iptables的常用用法

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/127000.html

標籤:Linux

上一篇:#Linux學習# 幫助命令

下一篇:linux服務器無法解壓rar檔案的解決方法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more