最近一段時間用到了不少網絡的知識,設計到防火牆的配置,數據包的路由等等。在此過程中主要使用到了linux自帶的iptables
來完成一些功能,同樣是迷迷糊糊的。以下爲學習iptables的一些筆記,以備以後複習。
一、防火牆知識
通過對linux內核防火牆的配置便能夠完成上面描述的防護功能。llinux防火牆的配置用iptables工具來配置完成。
1、什麼是iptables?
iptables是netfilter項目的一部分,用於配置linux內核防火牆的命令。iptables用於配置ipv4ip6tables用於配置ipv6。
2、iptables解決什麼問題?
iptables可以檢測、修改、轉發、重定向和丟棄ipv4的數據包。
二、iptables如何匹配
1、匹配條件:
過濾ipv4數據包的代碼已經內置於內核中,並且按照不同的目的被組織成表(tables)的集合。表由一組預先定義的鏈(chains)組成,鏈包含遍歷順序規則。每一條規則包含一個謂詞的潛在匹配和相應的動作(目標),如果謂詞爲真,該動作會被執行。也就是說條件匹配。
iptables是用戶工具,用於允許用戶使用鏈和規則。數據在iptables中的流向如下圖:
2、處理動作:
處理動作在iptables中被稱爲target,動作分爲基本動作和擴展動作。以下爲常用的動作。
ACCEPT
:允許數據包通過
DROP
:直接丟失數據包,不給任何的迴應信息
REJECT
:拒絕數據包,會給請求方發送一個拒絕的信息
SNAT
:源地址轉換,解決網內用戶用同一個公網地址上網的問題
MASQUERAADE
:是SNAT的一種特殊形式,適用於動態的、臨時會變的ip上
DNAT
:目標地址轉換
REDIRECT
:在本機做端口映射
LOG
:在/var/log/message文件中記錄日誌信息,然後將數據包傳遞給下一條規則,就是對數據除記錄外不做任何其他的操作
三、iptables內容
1、表(tables)
iptables
包含5張表:
raw
用於配置數據包,raw中數據包不會被系統跟蹤。
filter
是用於存放所有與防火牆相關操作的默認表
nat
用於網絡地址轉換(例如:端口轉發)
mangle
用於對特定數據包的修改
security
用於強制訪問控制網絡規則(例如SElinux)
大部分情況下僅需要使用filter和nat。其他表用於更爲複雜的情況,包括多路由和路由判定等
規則表的先後順序:raw
-> mangle
-> nat
->filter
2、鏈(chains)
表由鏈組成,鏈是一些按順序排列的規則的列表。默認的filter包括INPUT
、OUTPUT
和FORWARD
3條內建的鏈,這3條鏈作用於數據包的過濾過程中的不同時間點,如下:
5種鏈的描述:
默認情況,任何鏈中都沒有規則,需要自己加入。
規則鏈在不同的數據場景下先後的順序是不一樣的:
數據入站:PREROUTING
->INPUT
數據出站:OUTPUT
->POSTROUTING
轉發順序:PREROUTING
->FORWARD
->POSTROUTING
3、規則(rules)
數據包的過濾基於規則。規則由一個目標(數據包匹配所有條件後的動作)和很多匹配(導致該規則可以應用的數據包所滿足的條件)指定。一個規則的典型匹配事項是數據包進入的端口(網卡適配器)、數據包的類型(ICMP
,tcp
,或者udp
)和數據包的目的端口。
管理和設置iptables規則
1) iptables規則表
2) parameter含義
3) command含義
參數 | 含義 |
---|---|
-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) |
四、iptables規則
目標使用-j或者–jump 選項指定。目標可以是用戶定義的鏈(例如,如果條件匹配,跳轉到之後的用戶定義的鏈,繼續處理)、一個內置的特定的目標或者一個目標擴展。
內置目標是ACCEPT
、DROP
、QUEUE
和RETURN
,目標擴展是REJECT
和LOG
。如果目標是內置目標,數據包的命運會立刻被決定並且在當前表的數據包的處理過程會停止。如果目標是用戶定義的鏈,並且數據包成功穿過第二條鏈,目標將移動到原始鏈中的下一個規則。目標擴展可以被終止或者不終止。
1、數據過濾的規則示例
數據過濾的規則使用的是filter
表,filter
表中3條鏈INPUT
,OUTPUT
,FORWARD
分別對應的是對於主機來說進入適配器的數據,出適配器的數據和轉發的數據。
1)空當前的所有規則和計數
iptables -F # 清空所有的防火牆規則
iptables -X # 刪除用戶自定義的空鏈
iptables -Z # 清空計數
2) 配置允許ssh端口連接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 22爲你的ssh端口, -s 192.168.1.0/24表示允許這個網段的機器來連接,其它網段的ip地址是登陸不了你的機器的。 -j ACCEPT表示接受這樣的請求
3)允許本地迴環地址可以正常使用
iptables -A INPUT -i lo -j ACCEPT
#本地圓環地址就是那個127.0.0.1,是本機上使用的,它進與出都設置爲允許
iptables -A OUTPUT -o lo -j ACCEPT
4)設置默認的規則
iptables -P INPUT DROP # 配置默認的不讓進
iptables -P FORWARD DROP # 默認的不允許轉發
iptables -P OUTPUT ACCEPT # 默認的可以出去
5)配置白名單
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允許機房內網機器可以訪問
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允許機房內網機器可以訪問
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允許183.121.3.7訪問本機的3380端口
6)開啓相應的服務端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 開啓80端口,因爲web對外都是這個端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允許被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已經建立的連接得讓它進來
7)保存規則到配置文件中
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改動之前先備份,請保持這一優秀的習慣
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
8)清除已有規則
iptables -F INPUT # 清空指定鏈 INPUT 上面的所有規則
iptables -X INPUT # 刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。
# 如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。
iptables -Z INPUT # 把指定鏈,或者表中的所有鏈上的所有計數器清零。
9)開放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允許本地迴環接口(即運行本機訪問本機)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允許已建立的或相關連的通行
iptables -A OUTPUT -j ACCEPT #允許所有本機向外的訪問
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允許訪問22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允許訪問80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允許ftp服務的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允許FTP服務的20端口
iptables -A INPUT -j reject #禁止其他未允許的規則訪問
iptables -A FORWARD -j REJECT #禁止其他未允許的規則訪問
10)屏蔽IP
iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP # 屏蔽惡意主機(比如,192.168.0.8
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽單個IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整個段即從123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即從123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即從123.45.6.1到123.45.6.254的命令是
11)指定數據包出去的網絡接口
只對 OUTPUT
,FORWARD
,POSTROUTING
三個鏈起作用。
iptables -A FORWARD -o eth0
2、數據轉發的規則示例
nat
是網絡地址轉換的縮寫。
局域網內的封包數據的傳送流程:
- 先經過
nat
表的PREROUTING
鏈; - 經又路由判斷確定這個封包是否要進入本機,若不進入本機,則進行下一步的流程;
- 再經過
filter
表的FORWARD
鏈; - 通過nat表的POSTROUTING鏈,最後傳送出去
nat
主機的關鍵的流程在第1,4步驟,也就是nat表的兩條重要的鏈:PREROUTING
和POSTROUTING
,這兩條鏈分別修改數據包的源ip地址和目的ip地址。又被分別稱爲SNAT
和DNAT
。
1) SNAT(源地址轉換)
能夠讓多個內網機器通過一個外網的ip地址上網,解決了ip資源匱乏的問題,如下圖:
需要將內網ip192.168.10.10
轉換爲111.196.211.212
, iptables可以配置爲下:
iptables -t nat -A POSTROUTING -s 192.168.10.10 -o eth0 -j SNAT --to-source 111.196.211.212
若外網的ip地址不穩定,是動態變化的話,需要使用MASQUEREAD
,能夠自動的尋找外網地址並改爲當前正確的外網ip地址。
iptables -t nat -A POSTROUTING -s 192.168.10.10/24 -j MASQUEREAD
2) DNAT(目的地址轉換)
能夠讓外網用戶訪問內網不同的ip地址(相當於SANT的反向代理),同樣的示例如下:
由上圖所知:目標地址192.168.10.6
在路由轉換前就是61.240.149.149
,需要在網關上運行iptables的命令,將地址進行轉換,命令如下:
iptables -t nat -A PREROUTING -i eth0 -s 61.240.149.149 -d 61.240.149.149 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.6:80
表示網卡eth0
傳入,將80端口的數據導向到內網192.168.10.6
機器的80
端口上。
3) 數據包端口映射
將80端口的數據轉遞到8080端口,這種方法常用在ssh端口的轉遞上。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
3、刪除已經存在的規則
1)方法一
語法:iptables -D chain rulenum [options]
,表示刪除(-D)鏈(chains[INPUT/OUTPUT/FORWARD])上編號(rulenum)的規則,使用iptables -L INPUT –line-numbers
來顯示INPUT
鏈上的規則且附帶行號,然後iptables -D INPUT 4
刪除第四行的規則。
2)方法二
iptables -L INPUT –line-numbers
顯示filter
表(默認)的INPUT
鏈上的規則,且每一個規則上都有行號,如下:
num target prot opt source destination
1 REJECT tcp — anywhere anywhere tcp dpt:microsoft-ds reject-with icmp-port-unreachable
2 REJECT tcp — anywhere anywhere tcp dpt:135 reject-with icmp-port-unreachable
3 REJECT tcp — anywhere anywhere tcp dpt:netbios-ssn reject-with icmp-port-unreachable
4 REJECT udp — anywhere anywhere udp dpt:microsoft-ds reject-with icmp-port-unreachable
5 REJECT udp — anywhere anywhere udp dpt:135 reject-with icmp-port-unreachable
根據行號刪除對應的規則即可:
iptables -D INPUT 4
,表示刪除行號爲4
的規則
五、啓停iptables
保存iptables規則:service iptables save
,它能把規則自動保存在/etc/sysconfig/iptables
中。
查看狀態:service iptables status
重啓:service iptables restart
啓動:service iptables start
停止:service iptables stop
永久關閉:chkconfig iptables off
永久關閉後啓用:chkconfig iptables on
六、調試防火牆相關的一些方式
1、查看iptables規則
iptables -L
- v:顯示詳細信息,包括每條規則的匹配包數量和匹配的字節數
- x:在v的基礎上,禁止自動單位換算(K,M)
- n:只顯示ip地址和端口號,不將ip解析爲域名
2、查看路由表
netstat -rn
3、查看nat路由表
iptables -S -t nat
參考鏈接:
https://wangchujiang.com/linux-command/c/iptables.html
https://wiki.archlinux.org/index.php/iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://man.linuxde.net/iptables
https://www.zsythink.net/archives/1199
https://wiki.archlinux.org/index.php/iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)