Linux iptables 詳解



最近搭一個框架需要用到iptables做映射,學習了下iptables的原理,總結下方便以后查~。

參考並轉載於以下鏈接:
http://www.cnblogs.com/metoy/p/4320813.html
http://www.ha97.com/4093.html

一、iptables介紹

iptables是Linux中對網絡數據包進行處理的一個功能組件,就相當於防火牆,可以對經過的數據包進行處理,例如:數據包過濾、數據包轉發等等,一般例如Ubuntu等Linux系統是默認自帶啟動的。

二、iptables結構

iptables其實是一堆規則,防火牆根據iptables里的規則,對收到的網絡數據包進行處理。iptables里的數據組織結構分為:表、鏈、規則。

表(tables)##

表提供特定的功能,iptables里面有4個表: filter表、nat表、mangle表和raw表,分別用於實現包過濾、網絡地址轉換、包重構和數據追蹤處理。
每個表里包含多個鏈。

鏈(chains)##

鏈(chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一 條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的默認策

略來處理數據包。

其整體結構如下圖所示:

表鏈結構

1.filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包 內核模塊:iptables_filter.

2.Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用於網絡地址轉換(IP、端口) 內核模塊:iptable_nat

3.Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數據包的服務類型、TTL、並且可以配置路由實現QOS內核模塊

4.Raw表——兩個鏈:OUTPUT、PREROUTING
作用:決定數據包是否被狀態跟蹤機制處理

數據包流向

前面介紹了iptables的組織結構,下面一張圖介紹了一個數據包如何依次穿過iptables的各個鏈和表的。

基本步驟如下:

  1. 數據包到達網絡接口,比如 eth0。
  2. 進入 raw 表的 PREROUTING 鏈,這個鏈的作用是趕在連接跟蹤之前處理數據包。
  3. 如果進行了連接跟蹤,在此處理。
  4. 進入 mangle 表的 PREROUTING 鏈,在此可以修改數據包,比如 TOS 等。
  5. 進入 nat 表的 PREROUTING 鏈,可以在此做DNAT,但不要做過濾。
  6. 決定路由,看是交給本地主機還是轉發給其它主機。

后面將分為2種情況:

  1. 數據包發送給本地主機,交由本地主機上層應用處理;
  2. 將數據包轉發給其他主機來處理。

第一種情況,數據包要轉發給其它主機:
7. 進入 mangle 表的 FORWARD 鏈,這里也比較特殊,這是在第一次路由決定之后,在進行最后的路由決定之前,我們仍然可以對數據包進行某些修改。
8. 進入 filter 表的 FORWARD 鏈,在這里我們可以對所有轉發的數據包進行過濾。需要注意的是:經過這里的數據包是轉發的,方向是雙向的。
9. 進入 mangle 表的 POSTROUTING 鏈,到這里已經做完了所有的路由決定,但數據包仍然在本地主機,我們還可以進行某些修改。
10. 進入 nat 表的 POSTROUTING 鏈,在這里一般都是用來做SNAT ,不要在這里進行過濾。
11. 進入出去的網絡接口。完畢。

第二種情況,數據包就是發給本地主機的,那么它會依次穿過:
7. 進入 mangle 表的 INPUT 鏈,這里是在路由之后,交由本地主機之前,我們也可以進行一些相應的修改。
8. 進入 filter 表的 INPUT 鏈,在這里我們可以對流入的所有數據包進行過濾,無論它來自哪個網絡接口。
9. 交給本地主機的應用程序進行處理。
10. 處理完畢后進行路由決定,看該往那里發出。
11. 進入 raw 表的 OUTPUT 鏈,這里是在連接跟蹤處理本地的數據包之前。
12. 連接跟蹤對本地的數據包進行處理。
13. 進入 mangle 表的 OUTPUT 鏈,在這里我們可以修改數據包,但不要做過濾。
14. 進入 nat 表的 OUTPUT 鏈,可以對防火牆自己發出的數據做 NAT 。
15. 再次進行路由決定。
16. 進入 filter 表的 OUTPUT 鏈,可以對本地出去的數據包進行過濾。
17. 進入 mangle 表的 POSTROUTING 鏈,同上一種情況的第9步。注意,這里不光對經過防火牆的數據包進行處理,還對防火牆自己產生的數據包進行處理。
18. 進入 nat 表的 POSTROUTING 鏈,同上一種情況的第10步。
19. 進入出去的網絡接口。完畢

三、iptables操作

參考:http://www.cnblogs.com/metoy/p/4320813.html
iptables的指令圖示如下:

如果使用開機轉發,需要設置參數:
echo 1 > /proc/sys/net/ipv4/ip_forward

如果想開機自動設置,配置一下文件:
/etc/sysctl.conf文件中的 net.ipv4.ip_forward = 1

iptables的基本語法格式

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

iptables命令的管理控制選項

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

防火牆處理數據包的四種方式

ACCEPT 允許數據包通過
DROP 直接丟棄數據包,不給任何回應信息
REJECT 拒絕數據包通過,必要時會給數據發送端一個響應的信息。
LOG 用於針對特定的數據包打log,在/var/log/messages文件中記錄日志信息,然后將數據包傳遞給下一條規則
TRACE這個只能針對raw中的table,是用來對數據進行追蹤的,用於debug.

iptables防火牆規則的保存與恢復

iptables-save把規則保存到文件中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動裝載
使用命令iptables-save來保存規則。一般用

iptables-save > /etc/sysconfig/iptables

生成保存規則的文件 /etc/sysconfig/iptables,也可以用:

service iptables save

iptables防火牆常用的策略

  1. 拒絕進入防火牆的所有ICMP協議數據包
iptables -I INPUT -p icmp -j REJECT
  1. 允許防火牆轉發除ICMP協議以外的所有數據包
iptables -A FORWARD -p ! icmp -j ACCEPT

說明:使用“!”可以將條件取反。

  1. 允許本機開放從TCP端口20-1024提供的應用服務。
iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT 
iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
  1. 從一台主機轉發到另一台主機

注意轉發首先需要按照前面的開啟轉發設置

(相同端口)
從192.168.0.132:21521(新端口)訪問192.168.0.211:1521端口

iptables -t nat -I PREROUTING -p tcp --dport 1521 -j DNAT --to 192.168.0.211
iptables -t nat -I POSTROUTING -p tcp --dport 1521 -j MASQUERADE

(不同端口)
不同端口轉發(192.168.0.132上開通21521端口訪問

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 21521 -j DNAT --to-destination 192.168.0.211:1521
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -d 192.168.0.211 -p tcp -m tcp --dport 1521 -j SNAT --to-source 192.168.0.132

以上兩條等價配置(更簡單[指定網卡]):

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 31521 -j DNAT --to 192.168.0.211:1521
iptables -t nat -A POSTROUTING -j MASQUERADE

(用iptables做本機端口轉發)

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

其他一些指令可以繼續查看:
http://www.cnblogs.com/metoy/p/4320813.html

我要用到的是將本地qemu仿真的一個虛擬機中的IP:PORT給映射到主機的端口上來對外服務:

qemu仿真系統IP為192.168.0.1,仿真系統與主機的橋接的網卡上,主機的ip為192.168.0.2,主機對外ip為172.18.236.82,將虛擬機中的80端口映射到主機的8080端口:

sudo iptables -t nat -A PREROUTING -d 172.18.236.82 -p tcp --dport 8081 -j DNAT --to-destination 192.168.0.1:80
sudo iptables -t nat -A POSTROUTING -d 192.168.0.1 -p tcp --dport 80 -j SNAT --to 192.168.0.2

四、python對iptables的操作包

python中有對iptables的操作包: iptc
參考主頁:
https://github.com/ldx/python-iptables

Linux上安裝:
針對python的:
pip install --upgrade python-iptables
針對python3的:
pip3 install --upgrade python-iptables

在python文件中導入:
import iptc

官網里面有對該包的介紹和很多例子,但沒有一個所有指令的完整歸納,有些指令參數不知道在iptc包中用什么,后面總結了在加在這~

五、 iptables的debug

在對問題進行處理時,我們肯定會遇到debug的需求,針對iptables的debug主要是通過看Log.

5.1. 打開iptables的log日志

首先我們需要打開iptables的log記錄功能,讓系統將相應的log輸出。
默認iptables的日志是輸出到/var/log/message文件中,當然對沒有開啟log功能的時候,不會有任何log輸出。
為了便於debug,我們將iptables的log輸出到/var/log/iptables.log文件。
開啟log輸出針對不同系統會不同,主要是以下2種:

5.1.1 針對用syslog的系統

如果系統存在以下文件: /etc/syslog.conf, 我們在/etc/syslog.conf中添加以下幾行:

kern.warning /var/log/iptables.log
kern.debug /var/log/iptables.log

然后重啟syslog:
sudo service syslog restart

5.1.2 針對用rsyslog的系統

如果系統存在以下文件: /etc/rsyslog.conf, 我們在/etc/syslog.conf中添加以下幾行:

kern.warning /var/log/iptables.log
kern.debug /var/log/iptables.log

然后重啟syslog:
sudo service rsyslog restart

5.2 針對需要查看的數據,添加iptables規則使其打印log

開啟log輸出后,我們需要添加相應的iptables規則,使其打印我們需要的log信息,主要有2種方法:

5.2.1 TRACE方法

在前面的數據包流向圖中,raw表中的鏈是用來對數據包進行追蹤的,我們可以在其鏈中添加TRACE操作規則,使其對相應的流量進行追蹤,例如下面的例子將追蹤進入的目標地址為192.168.0.211的數據包。

sudo iptables -t raw -I PREROUTING -d 192.168.0.211 -j TRACE

5.2.2 LOG方法

如果想在指定的一個表的一個鏈中加入一條規則,當在這個鏈中遇到特定的數據包,則記錄一條log信息。例如下面的指令將使得在nat的PREROUTING鏈中遇到目標地址為100.69.73.114時,則記錄一條log。

sudo iptables -t nat -I PREROUTING  -d 100.69.73.114 -j LOG --log-level 4

5.3 查看log信息

sudo tail -f /var/log/iptables.log


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM