iptable使用詳解
聲明:本人堅決反對利用文章內容進行惡意攻擊行為,一切錯誤行為必將受到懲罰,綠色網絡需要靠我們共同維護,推薦大家在了解技術原理的前提下,更好的維護個人信息安全、企業安全、國家安全。
iptables的前身叫ipfirewall(內核1.x時代),這是一個作者從freeBSD上移植過來的,能夠工作在內核當中的,對數據包進行檢測的一款簡易訪問控制工具。但是ipfirewall工作功能極其有限(它需要將所有的規則都放進內核當中,這樣規則才能夠運行起來,而放進內核,這個做法一般是極其困難的)。當內核發展到2.x系列的時候,軟件更名為ipchains,它可以定義多條規則,將他們串起來,共同發揮作用,而現在,它叫做iptables,可以將規則組成一個列表,實現絕對詳細的訪問控制功能。
他們都是工作在用戶空間中,定義規則的工具,本身并不算是防火墻。它們定義的規則,可以讓在內核空間當中的netfilter來讀取,并且實現讓防火墻工作。而放入內核的地方必須要是特定的位置,必須是tcp/ip的協議棧經過的地方。而這個tcp/ip協議棧必須經過的地方,可以實現讀取規則的地方就叫做 netfilter.(網絡過濾器)。
為什么已經在進出的口設置了關卡之后還要在內部設置關卡呢?由于數據包尚未進行路由決策,還不知道數據要走向哪里,所以在進出口是沒辦法實現數據過濾的。所以要在內核空間里設置轉發的關卡,進入用戶空間的關卡,從用戶空間出去的關卡。
這五個位置被稱為五個鉤子函數(hookfunctions),也叫五個規則鏈。這是NetFilter規定的五個規則鏈,任何一個數據包,只要經過本機,必將經過這五個鏈中的其中一個鏈。
- PREROUTING (路由前)
- INPUT (數據包流入口)
- FORWARD (轉發關卡)
- OUTPUT(數據包出口)
- POSTROUTING(路由后)
iptable常用策略
iptable策略一般分為兩種,一種叫“通”策略,一種叫“堵”策略,通策略,默認門是關著的,必須要定義誰能進。堵策略則是,大門是敞開的,但是你必須有身份認證,否則不能進。當我們定義策略的時候,要分別定義多條功能,其中:定義數據包中允許或者不允許的策略,filter過濾的功能,而定義地址轉換的功能的則是nat選項。為了讓這些功能交替工作,制定出了“表”這個定義,來定義、區分各種不同的工作功能和處理方式。
使用最多的3個功能如下所示:
filter :定義允許或者不允許的,只能做在3個鏈上:INPUT ,FORWARD ,OUTPUT
nat:定義地址轉換的,只能做在3個鏈上:PREROUTING ,OUTPUT ,POSTROUTING
mangle:修改報文原數據,是5個鏈都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
環境安裝
安裝iptables管理命令$ yum -y install iptables-services 加載防火墻的內核模塊$ modprobe ip_tables$ modprobe iptable_filter$ modprobe iptable_nat$ modprobe ip_conntrack$ modprobe ip_conntrack_ftp$ modprobe ip_nat_ftp$ modprobe ipt_state$ lsmod |egrep 'filter|nat|ipt' # 查看已經加載的模塊 啟動iptables$ systemctl stop firewalld && systemctl disable firewalld$ systemctl start iptables && systemctl enable iptables
基礎命令
(1)iptable幫助信息
-t, --table table:對指定的表 table 進行操作, table 必須是 raw, nat,filter,mangle 中的一個。如果不指定此選項,默認的是 filter 表。 # 通用匹配:源地址目標地址的匹配-p:指定要匹配的數據包協議類型;-s, --source [!] address[/mask] :把指定的一個/一組地址作為源地址,按此規則進行過濾。當后面沒有 mask 時,address 是一個地址,比如:192.168.1.1;當 mask 指定時,可以表示一組范圍內的地址,比如:192.168.1.0/255.255.255.0。-d, --destination [!] address[/mask] :地址格式同上,但這里是指定地址為目的地址,按此進行過濾。-i, --in-interface [!] <網絡接口name> :指定數據包的來自來自網絡接口,比如最常見的 eth0 。注意:它只對 INPUT,FORWARD,PREROUTING 這三個鏈起作用。如果沒有指定此選項, 說明可以來自任何一個網絡接口。同前面類似,"!" 表示取反。-o, --out-interface [!] <網絡接口name> :指定數據包出去的網絡接口。只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起作用。 # 查看管理命令-L, --list [chain] 列出鏈 chain 上面的所有規則,如果沒有指定鏈,列出表上所有鏈的所有規則。 # 規則管理命令-A, --append chain rule-specification 在指定鏈 chain 的末尾插入指定的規則,也就是說,這條規則會被放到最后,最后才會被執行。規則是由后面的匹配來指定。-I, --insert chain [rulenum] rule-specification 在鏈 chain 中的指定位置插入一條或多條規則。如果指定的規則號是1,則在鏈的頭部插入。這也是默認的情況,如果沒有指定規則號。-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的鏈 chain 中刪除一個或多個指定規則。-R num:Replays替換/修改第幾條規則 # 鏈管理命令(這都是立即生效的)-P, --policy chain target :為指定的鏈 chain 設置策略 target。注意,只有內置的鏈才允許有策略,用戶自定義的是不允許的。-F, --flush [chain] 清空指定鏈 chain 上面的所有規則。如果沒有指定鏈,清空該表上所有鏈的所有規則。-N, --new-chain chain 用指定的名字創建一個新的鏈。-X, --delete-chain [chain] :刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的鏈。這并不會對鏈內部造成任何影響。-Z, --zero [chain] :把指定鏈,或者表中的所有鏈上的所有計數器清零。 -j, --jump target <指定目標> :即滿足某條件時該執行什么樣的動作。target 可以是內置的目標,比如 ACCEPT,也可以是用戶自定義的鏈。-h:顯示幫助信息;
(2)查看iptables規則
$ iptables -L # 查看iptables規則$ iptables -L -vn # 查看iptables規則(詳細信息) $ iptables -L -t nat # 列出 nat 上面的所有規則 -t 參數指定,必須是 raw, nat,filter,mangle 中的一個$ iptables -L -t nat --line-numbers # 規則帶編號$ iptables -L INPUT
(3)清空iptables規則
$ iptables -F # 清除所有規則,不會處理默認的規則$ iptables -X # 刪除用戶自定義的鏈$ iptables -Z # 鏈的計數器清零(數據包計數器與數據包字節計數器)
(4)添加iptables規則
$ iptables -t # 指定表(default: `filter')$ iptables -A # 把規則添加到指定的鏈上,默認添加到最后一行$ iptables -I # 插入規則,默認插入到第一行(封IP)$ iptables -D # 刪除鏈上的規則
(5)刪除某條規則
$ iptables -nL --line-numbers # 查看規則號碼$ iptables -D INPUT 1 # 刪除指定鏈上的指定序號
(6)保存iptables規則
$ iptables-save > 1.txt #將防火墻規則保存到文件中$ iptables-save #將防火墻規則保存到配置文件中,防止重啟后失效$ iptables-restore < 1.txt #從配置文件里載入防火墻配置 注意:你所定義的所有內容,當你重啟的時候都會失效,要想我們能夠生效,需要使用一個命令將它保存起來1.service iptables save 它會保存在/etc/sysconfig/iptables這個文件中2.iptables-save 命令iptables-save > /etc/sysconfig/iptables 3.iptables-restore 命令開機的時候,它會自動加載/etc/sysconfig/iptabels如果開機不能加載或者沒有加載,而你想讓一個自己寫的配置文件(假設為iptables.2)手動生效的話:iptables-restore < /etc/sysconfig/iptables.2則完成了將iptables中定義的規則手動生效
黑/白名單配置
(1)允許本地回環地址可以正常使用
$ iptables -A INPUT -i lo -j ACCEPT$ iptables -A OUTPUT -o lo -j ACCEPT# 本地圓環地址就是那個127.0.0.1,是本機上使用的,它進與出都設置為允許
(2)設置默認規則
$ iptables -P INPUT DROP # 配置默認的不讓進$ iptables -P FORWARD DROP # 默認的不允許轉發$ iptables -P OUTPUT ACCEPT # 默認的可以出去
(3)配置白名單
$ 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端
(4)配置黑名單
$ iptables -I INPUT -p tcp -s 192.168.1.253 -i ens33 -j DROP$ iptables -A INPUT -p tcp ! -s 192.168.1.1 -i ens33 -j DROP$ iptables -A INPUT -p tcp ! -s 192.168.1.0/24 -i ens33 -j DROP 選項解釋:-s # 指定源地址或網段(192.168.1.0/24)。! 取反;-d # 指定目的地址(nat表prerouting);-i # 進入的網絡接口(ens33,ens37);-o # 出去的網絡接口(ens33,ens37);
(5)訪問端口
$ iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP$ iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT # 3306端口-8809端口$ iptables -I INPUT -p tcp --dport 18:80 -j DROP$ 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 # 禁止其他未允許的規則訪問
DNAT/SNAT映射配置
在傳統的標準的TCP/IP通信過程中,所有的路由器僅僅是充當一個中間人的角色,也就是通常所說的存儲轉發,路由器并不會對轉發的數據包進行修改,更為確切的說,除了將源MAC地址換成自己的MAC地址以外,路由器不會對轉發的數據包做任何修改。NAT (Network Address Translation,網絡地址轉換)恰恰是出于某種特殊需要而對數據包的源ip地址、目標ip地址、源端口、目標端口進行改寫的操作。利用iptables的內置表NAT可以實現上述功能
iptables NAT的三個鏈:PREROUTING,POSTROUTING,OUTPUT
PREROUTING:可以在這里定義進行目標地址NAT的規則,因為路由器進行路由時只檢查數據包的目標ip地址,所以為了使數據包得以正確路由,我們必須在路由之前就進行目的NAT
POSTROUTING:可以在這里定義進行源地址NAT的規則,系統在決定了數據包的路由以后在執行該鏈中的規則
OUTPUT:定義對本地產生的數據包的目的NAT規則
NAT處理的動作選項
SNAT:源地址轉換,改變數據包的源地址,常接選項--to-sourceDNAT:目標址轉換,改變數據包的目標地址,常接選項--to-destinationMASQUERADE:地址偽裝,適用于ADSL等動態撥號上網的IP偽裝REDIRECT:端口映射,通常用實現透明代理和對外開放內網某些服務,常接選項--to-ports
三個鏈支持的處理動作
PRERROUTING:DNAT,REDIRECT 對目標地址進行修改,支持-o選項(路由之前)POSTROUTING:SNAT,MASQUERADE 對源地址進行修改,支持-i選項(路由之后)OUTPUT:DNAT,REDIRECT 處理來自NAT主機本身生成的出站數據包(本機)
注意:要實現NAT,首先要打開核心轉發功能
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
如果永久生效的話,編輯/etc/sysctl.conf文件,修改成net.ipv4.ip_forward = 1,然后執行sysctl -p可以立即生效
(1)SNAT:隱藏內網主機ip地址,也可以實現共享公網ip上網
源地址是192.168.1.0/24轉化成172.16.8.9
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 172.16.8.9
(2)DNAT:可以通過公網ip訪問局域網內的服務
訪問172.16.8.9的80端口時,會映射到192.168.1.9的8080端口
# iptables -t nat -A PREROUTING -d 172.16.8.9 -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.9:8080
(3)MASQUERADE:ADSL撥號上網,可以認為是SNAT的一種特殊情況(轉換地址是動態的)
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
4.REDIRECT:在本機上進行端口映射,可以認為是DNAT的一種特殊情況(目標地址是本機)
訪問本機21端口時,會被映射到2121端口
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 21 -j REDIRECT --to-ports 2121
場景應用
$ iptables -L -F -A -D # list flush append delete# 場景一$ iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允許 tcp 80 端口$ iptables -I INPUT -p tcp --dport 10:22 -j ACCEPT # 允許 tcp 10-22 端口$ iptables -I INPUT -p icmp -j ACCEPT # 允許 icmp$ iptables -A INPUT -j REJECT # 添加一條規則, 不允許所有 # 優化場景一$ iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問$ iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網$ iptables -I INPUT -p tcp --dport 80 -s 10.10.188.233 -j ACCEPT # 只允許固定ip訪問80 # 場景二$ vi /etc/vsftpd/vsftpd.conf # 使用 vsftpd 開啟 ftp 主動模式port_enable=yesconnect_from_port_20=YES$ iptables -I INPUT -p tcp --dport 21 -j ACCEPT $ vi /etc/vsftpd/vsftpd.conf # 建議使用 ftp 被動模式pasv_min_port=50000pasv_max_port=60000$ iptables -I INPUT -p tcp --dport 21 -j ACCEPT$ iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT # 還可以使用 iptables 模塊追蹤來自動開發對應的端口 # 場景三$ iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問$ iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網$ iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允許內網訪問$ iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允許端口, 80 -> http, 1723 -> vpn$ iptables -A INPUT -j REJECT # 添加一條規則, 不允許所有 $ iptables-save # 保存設置到配置文件 # 場景四$ iptables -t nat -L # 查看 nat 配置 $ iptables -t nat -A POST_ROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 # SNAT$ vi /etc/sysconfig/network # 配置網關 $ iptables -t nat -A POST_ROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80 # DNAT #場景五$ iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT # 限制并發連接訪問數$ iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模塊; --limit-burst 默認為5
注意事項
1) 修改之前導出備份一份;
2)修改時小心,別把自己的IP地址封禁;
3) 可以先在定時任務中添加一條定時清空的規則,等測試沒有問題再取消定時任務;