Linux Iptables 防火牆

iptables防火牆配置

iptables是Linux防火牆的管理工具,位於/sbin/iptables。實現防火牆功能的是netfilter,它是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

規則表之間的優先順序:Raw——mangle——nat——filter

規則鏈:

1. INPUT——進入防火牆的數據包應用此規則鏈中的策略

2. OUTPUT——防火牆自身發出的數據包應用此規則鏈中的策略

3. FORWARD——防火牆轉發數據包時應用此規則鏈中的策略

4. PREROUTING——數據包作路由選擇前應用此鏈的策略,所有進防火牆數據包先應用此鏈

5. POSTROUTING——對數據包作路由選擇後應用此鏈中的規則

規則鏈之間的優先順序(分三種情況):

第一種情況:入站數據流向PREROUTING(DNAT地址轉換)à路由選擇 à INPUT

從外界到達防火牆的數據包,先被PREROUTING規則鏈處理(DNAT,是否修改數據包地址等),之後會進行路由選擇(判斷該數據包應該發往何處),如果數據包的目標主機是防火牆本機(比如說Internet用戶訪問防火牆主機中的web服務器的數據包),那麼內核將其傳給INPUT鏈進行處理(決定是否允許通過等),通過以後再交給系統上層的WEB應用程序

第二種情況:出站數據流向OUTPUT à路由選擇 à POSTROUTING(SNAT地址轉換)

防火牆本機向外部地址發送的數據包(比如在防火牆主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,之後進行路由選擇,然後傳遞給POSTROUTING規則鏈(SNAT,是否修改數據包的地址等)進行處理。

第三種情況:轉發數據流向

PREROUTING(DNAT地址轉換)à路由選擇 à FORWARD à POSTROUTING(SNAT地址轉換)

來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,之後會進行路由選擇,如果數據包的目標地址不是本機,則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然後再交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。


Iptables的基本語法格式

Iptables [-t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動作]

表名、鏈名用於指定iptables命令所操作的表和鏈

命令選項用於指定管理iptables規則的方式(比如:插入、增加、刪除、查看)

條件匹配用於指定對符合什麼樣條件的數據包進行處理(源、目的、接口等)

目標動作用於指定數據包的處理方式(比如允許通過、拒絕、丟棄、跳轉(Jump、LOG)

Iptables命令選項:

-A 在指定鏈的末尾添加(append)一條新的規則

-D刪除(delete)指定鏈中的某一條規則,可以按規則序號和內容刪除

-I在指定鏈中插入(insert)一條新的規則,默認在第一行添加

-R修改、替換(replace)指定鏈中的某一條規則,可以按規則序號和內容替換

-L列出(list)指定鏈中所有的規則進行查看

-F清空(flush)

-N新建(new-chain)一條用戶自己定義的規則鏈

-X刪除指定表中用戶自定義的規則鏈(delete-chain)

-P設置指定鏈的默認策略(policy)

-n使用數字形式(numeric)顯示輸出結果

-v查看規則表詳細信息(verbose)的信息

-V查看版本(version)

-h獲取幫助(help)

Iptables目標動作:

ACCEPT 允許數據包通過

DROP 直接丟棄數據包,不給任何迴應信息

REJECT 拒絕數據包通過,必要時會給數據發送端一個響應的信息。

LOG在/var/log/messages文件中記錄日誌信息,然後將數據包傳遞給下一條規則

條件匹配:

-p <協議類型>:指定上一層協議,可以是icmp、tcp、udp和all。
-s <IP地址/掩碼>:指定源IP地址或子網。
-d <IP地址/掩碼>:指定目的IP地址或子網。
-i <網絡接口>:指定數據包進入的網絡接口名稱。
-o <網絡接口>:指定數據包出去的網絡接口名稱。
-p tcp --sport <port>:指定TCP數據包的源端口。
-p tcp --dport <port>:指定TCP數據包的目的端口。
-p tcp --syn:具有SYN標誌的TCP數據包,該數據包要發起一個新的TCP連接。
-p udp --sport <port>:指定UDP數據包的源端口。
-p udp --dport <port>:指定UDP數據包的目的端口。
-p icmp --icmp-type <type>:指定icmp數據包的類型,可以是echo-reply、echo-request


iptables
服務啓動腳本/etc/rc.d/init.d/iptables
配置文件位置 /etc/sysconfig/iptables-config
策略文件位置 /etc/sysconfig/iptables (默認文件不存在)
iptables命令即時生效,但是不保存,iptables-save保存到/etc/sysconfig/iptables
將iptables策略文件/etc/sysconfig/iptables恢復到當前系統中iptables-restore

Iptables 主機防火牆
基於單個服務器防火牆的配置主要包括迴環口的處理、狀態檢測以及協議和端口的處理。
例如一個普通的web服務器的典型防護配置:
iptables -A INPUT -i lo -j ACCEPT \\允許訪問服務器的lo迴環口
iptables -A INPUT -p tcp -m multiport --port 22,80 -j ACCEPT \\開放服務器的22和80端口
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT \\狀態檢測,允許建立連接和相關連接
iptables -P INPUT DROP \\不匹配以上條件的數據包全部丟棄
這裏涉及到iptables防火牆的一些 [擴展規則],iptables軟件包提供了一套擴展的規則選項。使用時需要通過-m選項指定模塊的名稱,再使用該模塊提供的選項。下面列出幾個模塊名稱和其中的選項,大部分的選項也可以通過"!"取反。
-m multiport--sports <port, port, …>
功能:指定數據包的多個源端口,也可以以port1:port2的形式指定一個端口範圍。
-m multiport --dports <port, port, …>
功能:指定數據包的多個目的端口,也可以以port1:port2的形式指定一個端口範圍。
-m multiport --ports <port, port, …>
功能:指定數據包的多個端口,包括源端口和目的端口,也可以以port1:port2的形式指定一個端口範圍。
-m state --state <state>
功能:指定滿足某一種狀態的數據包,state可以是INVALID、ESTABLISHED、NEW和RELATED等,也可以是它們的組合,用","分隔。

-m connlimit --connlimit-above <n>
功能:用於限制客戶端到一臺主機的TCP併發連接總數,n是一個數值。

-m mac --mac-source <address>
功能:指定數據包的源MAC地址。

160215697.jpg

在RHEL-B上輸入剛纔的4條命令
iptables -A INPUT -ilo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --port 22,80 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP

查看INPUT規則:

160226634.jpg

RHEL-B上開啓vsftpd和httpd服務(分別爲21端口和80端口)
service httpd start
service vsftpd start

RHEL-A上使用命令測試,發現都是成功的
telnet 192.168.20.180
telnet 192.168.20.1 22

使用ftp命令去連接
ftp 192.168.20.1
發現許久連接不上,說明ftp的21端口沒有開啓。當然如果去ping的話,也是失敗的。這意味着iptables防火牆的命令生效,只開放了ssh和http服務。
保存剛纔的iptables策略,即會生成/etc/sysconfig/iptables文件
service iptablessave
160248120.jpg

iptables網關防火牆

1、SNAT內部私網地址上網 在POSTROUTING鏈中定義。規則的處理是在路由完成後進行

內網10.10.1.0/24出去的數據包其源IP地址轉換成外網接口eth0的IP地址218.75.26.35

iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o eth0 -jSNAT --to-source 218.75.26.35
內網10.10.1.0/24出去的數據包其源IP地址轉換成外網接口eth0的IP地址(動態)

iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o ppp0 -jMASQUERADE
2
、DNAT內部服務器發佈在PREROUTING鏈中定義。規則的處理是在路由之前處理的

內網服務器 10.10.2.3公網地址 218.75.26.34 映射

iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32-j DNAT --to 10.10.2.3

內網服務器 10.10.2.3公網地址 218.75.26.34映射某一個端口

iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32-p tcp --dport 80 -j DNAT --to 10.10.2.3:80
案例:RHEL-A RHEL-C是X公司;RHEL-B是Y公司的FTP服務器;Router是ISP

160311159.jpg

RHEL-C# echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s192.168.10.0/24 -o eth1 -j SNAT --to-source 198.2.3.2

# SNAT,解決內部上網

iptables -t nat -A PREROUTING -i eth1 -d 198.2.3.2/32 -ptcp --dport 80 -j DNAT --to 192.168.10.1:80

# DNAT,映射某一端口,對外發布應用

route add -net 0.0.0.0 netmask 0.0.0.0 gw 198.2.3.1

160324368.jpg

RHEL-A#

vim /etc/sysconfig/network-script/ifcfg-eth0

GATEWAY=192.168.10.20

或 route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.10.20

# 如果沒有其他問題的話,RHEL-A是可以Ping通外網以及RHEL-B的ftp

RHEL-B#

route add –net 0.0.0.0 netmask 0.0.0.0 gw 203.2.3.1

# B應該可以訪問A的WEB


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章