【轉】Linux iptables 詳解
轉自:http://www.rzrgm.cn/qwertwwwe/p/9452370.html
最近搭一個框架需要用到iptables做映射,學習了下iptables的原理,總結下方便以后查~。
參考并轉載于以下鏈接:
http://www.rzrgm.cn/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的各個鏈和表的。
基本步驟如下:
- 數據包到達網絡接口,比如 eth0。
- 進入 raw 表的 PREROUTING 鏈,這個鏈的作用是趕在連接跟蹤之前處理數據包。
- 如果進行了連接跟蹤,在此處理。
- 進入 mangle 表的 PREROUTING 鏈,在此可以修改數據包,比如 TOS 等。
- 進入 nat 表的 PREROUTING 鏈,可以在此做DNAT,但不要做過濾。
- 決定路由,看是交給本地主機還是轉發給其它主機。
后面將分為2種情況:
- 數據包發送給本地主機,交由本地主機上層應用處理;
- 將數據包轉發給其他主機來處理。
第一種情況,數據包要轉發給其它主機:
- 進入 mangle 表的 FORWARD 鏈,這里也比較特殊,這是在第一次路由決定之后,在進行最后的路由決定之前,我們仍然可以對數據包進行某些修改。
- 進入 filter 表的 FORWARD 鏈,在這里我們可以對所有轉發的數據包進行過濾。需要注意的是:經過這里的數據包是轉發的,方向是雙向的。
- 進入 mangle 表的 POSTROUTING 鏈,到這里已經做完了所有的路由決定,但數據包仍然在本地主機,我們還可以進行某些修改。
- 進入 nat 表的 POSTROUTING 鏈,在這里一般都是用來做SNAT ,不要在這里進行過濾。
- 進入出去的網絡接口。完畢。
第二種情況,數據包就是發給本地主機的,那么它會依次穿過:
- 進入 mangle 表的 INPUT 鏈,這里是在路由之后,交由本地主機之前,我們也可以進行一些相應的修改。
- 進入 filter 表的 INPUT 鏈,在這里我們可以對流入的所有數據包進行過濾,無論它來自哪個網絡接口。
- 交給本地主機的應用程序進行處理。
- 處理完畢后進行路由決定,看該往那里發出。
- 進入 raw 表的 OUTPUT 鏈,這里是在連接跟蹤處理本地的數據包之前。
- 連接跟蹤對本地的數據包進行處理。
- 進入 mangle 表的 OUTPUT 鏈,在這里我們可以修改數據包,但不要做過濾。
- 進入 nat 表的 OUTPUT 鏈,可以對防火墻自己發出的數據做 NAT 。
- 再次進行路由決定。
- 進入 filter 表的 OUTPUT 鏈,可以對本地出去的數據包進行過濾。
- 進入 mangle 表的 POSTROUTING 鏈,同上一種情況的第9步。注意,這里不光對經過防火墻的數據包進行處理,還對防火墻自己產生的數據包進行處理。
- 進入 nat 表的 POSTROUTING 鏈,同上一種情況的第10步。
- 進入出去的網絡接口。完畢
三、iptables操作
參考:http://www.rzrgm.cn/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防火墻常用的策略
- 拒絕進入防火墻的所有ICMP協議數據包
iptables -I INPUT -p icmp -j REJECT
- 允許防火墻轉發除ICMP協議以外的所有數據包
iptables -A FORWARD -p ! icmp -j ACCEPT
說明:使用“!”可以將條件取反。
- 允許本機開放從TCP端口20-1024提供的應用服務。
iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
- 從一臺主機轉發到另一臺主機
注意轉發首先需要按照前面的開啟轉發設置
(相同端口)
從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.rzrgm.cn/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
浙公網安備 33010602011771號