iptables命令提取總結<取自朱雙印博客>
阿新 • • 發佈:2018-06-25
新建 ssh 相同 mes level valid 日誌 記錄日誌 添加 以下內容只是一些命令相關的,以朱雙印博客中的iptables的教程提取出來的。純粹只是命令的總結,如果需要看理論的知識,建議去看朱老師的博客,目前還沒有看到寫得比這個好的了。
<http://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/%e9%98%b2%e7%81%ab%e5%a2%99/>
看完朱老師的博客,理論上面是理解過了,但是一些命令的東西總是要返回去找,所以自已就提取了下一些命令,寫成下面的這篇了。
報文流向
1. 到本機某進程的報文: prerouting--> input
2. 由本機轉發的報文:prerouting-->forward-->postrouting
3. 由本機某進程發出的報文:output-->postrouting
表,所有的規則都是以下四種分類的規則,所有的表都存於這四個表中
1. filter 表,負責過濾功能,防火墻,內核模塊: iptables_filter
2. nat表,network address translation,網絡地址轉換功能,內核模塊iptables_nat
3. mangle表,拆解報文,做出修改,並重新封裝的功能:iptables_mangle
4. raw表,關閉nat表上啟用的連接追蹤機制;iptables_raw
下圖是路由次序圖:
其實iptables相關的規則均由匹配條件和處理動作組成,條件包含通常所說的,端口號,IP地址,等.而動作的話,包含以下:
ACCEPT: 允許
DROP: 直接丟棄,不給回應信息,客戶端過了超時時間才會有反應
REJECT: 拒絕數據包通過,會有回應信息,客戶端剛請求就會收到拒絕的信息
SNAT: 源地址轉換,解決內網用戶用同一個公網地址上網的問題
MASQUERADE: 是SNAT的一種特殊開工,適用於動態的,臨時會變的IP上
DNAT: 目標地址轉換
REDIRECT: 在本機做端口映射
LOG:在/var/log/message文件中記錄日誌信息,然後將數據包傳給下一條規則,只做記錄,不做其它任何操作,仍然讓下一條規則去匹配
IPTABLES命令參數說明:
#iptables
-t 指定要操作的表【raw,mangle,nat,filter -- 如果沒有使用-t選項指定表,默認為filter表】
-L 列出規則
--line-number 可以查看的時候顯示序號【--line (centos中可縮寫)】
-n 不對IP地址進行名稱反解,直接顯示IP地址【anywhere,0.0.0.0/0】
-v 顯示更詳細的信息【報文個數,對應匹配的報文大小總和,等】
-x 顯示精確匹配到計數值
-A 表示在需要添加的規則表中進行添加
-I [=大寫的 i ] 表示表需要添加的規則表中進行插入到指定的位置,默認為開始【-I INPUT 2 指定位置】
-D 刪除規則
-R 修改規則【必須明確指定規則對應原本的匹配條件,建議-D先刪除,再來添加】
-s 報文的源地址
-d 報文的目標地址
-p 協議類型
【-p tcp --dport 22】--dport 報文的目的端口
【-p tcp --sport 22】--sport 報文的源端口
【-p tcp -m multiport --dports 25,110,143,80】使用multiport指定多個端口
-i 指定網卡接口
-m 指定的擴展模塊
-N 創建自定義鏈
【iptables -t filter -N IN_WEB】
添加規則
【iptables -F INPUT清空filter表INPUT鏈中的規則.】
屏蔽某個IP【拒絕192.168.1.11上所有的報文訪問當前機器,可省略-t filter】
iptables -t filter -I INPUT -s 192.168.1.11 -j DROP
【-I為插入規則,-s為IP,-j DROP為屏蔽動作】
iptables -t filter -I INPUT 2 -s 192.168.1.11 -j DROP
刪除規則
查看規則【根據需要來查看,以下為查看filter表中的INPUT鏈中的規則】
iptables --line -vnL INPUT
刪除上面查看出來的第三條規則【刪除filter表中的INPUT鏈中的第三條規則】
iptables -t filter -D INPUT 3
根據具體的匹配條件與動作來刪除規則【需要知道添加的規則,可以使用iptables -nvL進行查看】
iptables -D INPUT -s 192.168.1.11 -j DROP
保存防火墻規則,如果你誤操作了,並且沒有保存,那麽重啟防火墻將會恢復到配置文件中的模樣
service iptables save
iptables-save > /etc/sysconfig/iptables【iptables-save是將當前的規則以保存後的格式輸入到屏幕上,再利用重定向保存到配置文件中】
Centos 6系列會保存在 /etc/sysconfig/iptables 文件中
重新載入規則【重載規則,現有的規則會被覆蓋】
iptables-restore < /etc/sysconfig/iptables
參數-s格式【-d也可以參考下面格式】
單IP
-s 192.168.1.11
多IP
-s 192.168.1.11,192,168.4.2
指定 IP段
-s 10.6.0.0/16
取反【不滿足源IP為192.168.1.11的報文進行INPUT鏈默認操作,並不表示拒絕*註意,與默認規則有關】
! -s 192.168.1.11
【iptables -t filter -A INPUT ! -s 192.168.1.11 -j ACCEPT】
-p格式【不使用-p的時候表示所有協議】
Centos 6
tcp,udp,udplite,icmp,esp,ah,sctp
Centos 7
tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh
指定端口
【-p tcp --dport 22】--dport 報文的目的端口
【-p tcp --sport 22】--sport 報文的源端口
取反
-p tcp ! --dport 22 【表示目標端口不是22端口則會被匹配到】
取一個範圍
-p tcp --dport 22:25【表示22到25端口之間所有的端口,22,23,24,25】
-p tcp --dport :22 【表示0到22端口】
-p tcp --dport 80: 【表示80到65535端口】
【-m multiport 擴展模塊只可以用於tcp協議與udp協議,即配合-p tcp或者-p udp使用,後面接的--dport變為了--dports】
-p tcp -m multiport --dports 25,110,143,80 【表示匹配多個離散的目標端口,註意其中使用-m multiport模塊】
-p tcp -m multiport --dports 22,80:88 【可以指定連續端口範圍並且可以添加離散端口號】
【完整例】
iptables -t filter -I INPUT -s 192.168.1.11 -p tcp -m multiport --dports 25,110,143,80 -j DROP
-m格式
-m表示指定的模塊
iptables -t filter -I INPUT -s 192.168.1.11 -p tcp -m tcp --dport 22 -j REJECT
但是與前面-p選項對應的協議名稱相同的模塊,所以可以忽略【如果是-m udp不則,就不可以忽略了】
iptables -t filter -I INPUT -s 192.168.1.11 -p tcp --dport 22 -j REJECT
擴展模塊
【-m multiport】
看上面的-p選項,已經說明了
【-m iprange】指定一段連續的IP地址範圍
【-m iprange --src-range或-m iprange --dst-range】
支持使用"!"取反
屏蔽源IP地址192.168.1.100到192.168.1.200之間的來源報文
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
【string擴展模塊】
報文中包含對應的字符串,如果某個網頁的內容是OOXX
#curl 192.168.1.146/index.html
OOXX
#iptables -t filter -I INPUT -m string --algo bm --string "OOXX" -j REJECT
--algo:指定匹配算法,可選算法:bm與kmp此選項為必須選項
--string:用於指定需要匹配的字符串
【time擴展模塊】
指定每天9點至18點不可以看網頁<訪問80與443端口>
#iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
#iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
--timestart起始時間
--timestop結束時間
-m time --weekdays 6,7【限定周六日,可以使用數字,也可以使用Mon,Tue,Wed,Thu,Fri,Sat,Sun】
【weekdays與timestart、timestop結合】---限定周六日的9點至18點不可以訪問80端口
#iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
--monthdays選項,可以指定每個月的哪 一天
每個月的第4個星期5
-m time --weekdays 5 --monthdays 22,23,24,25,26,27,28
使用--datestart選項與--datestop選項,指定具體的日期範圍
-m time --datestart 2018-06-22 --datestop 2018-06-30
--monthdays與--weekdays可以使用“!"取反,其它的不可以
【connlimit擴展模塊】
限制每個IP地址同時鏈接到server端的鏈接數量,不用指定Ip,默認就是針對每個客戶端IP
限制每個Ip地址最多只能占用兩個SSH連接到server端
#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
------connlimit-above 2表示限制每個IP鏈接數量上限為2,可以利用“!"取反
--connlimit-mask 24限定某類網段
結合例:<24網段最多有兩個ssh客戶端連接到當前服務器>
#iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT
【limit擴展模塊】
limit模塊是對”報文到達速率“進行限制的,<限制單獨時間內流入包的數量>
例:先清除規則,避免其它的規則影響,再設置速度,再做包過濾
#iptables -F
#iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
#iptables -t filter -A INPUT -p icmp -j REJECT
--limit-burst <令牌桶的概念>,令牌桶中最多存放3個令牌,每分鐘生成10個令牌(第6秒生成一個令牌)
時間單位可以使用/second 秒 /minute 分 /hour 時 /day 天
#iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
#iptables -t filter -A INPUT -p icmp -j REJECT
【--tcp-flags】
詳解看如下朱雙印老師博客的說明:
http://www.zsythink.net/archives/1578
用於匹配報文的tcp頭的標誌位
例:
#iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
#前面省略 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
#前面省略 --tcp-flags ALL SYN -j REJECT
#前面省略 --tcp-flags ALL SYN,ACK -j REJECT
--syn 用於匹配tcp新建連接的請求報文 ,相當於使用”--tcp-flags SYN,RST,ACK,FIN SYN"
#iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT
【-icmp】
詳細看下面鏈接中朱雙印老師的講解
http://www.zsythink.net/archives/1588
禁止所有icmp類型的報文進入本機<無法發送ping,也無法接收ping>
#iptables -t filter -I INPUT -p icmp -j REJECT
可以ping通別人,但是別人無法ping通我們
#iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
也可以使用報文描述去匹配<空格需要替換為->,效果同上面
#iptables -t filter -I INPUT -p icmp -m icmp --icmp-type "echo-request" -j REJECT
【state模塊】
鏈接報文狀態
有五種狀態:
NEW: 連接的第一包
ESTABLISHED:NEW狀態包後面的包狀態理解,表示連接已建立
RELATED:數據進程連接--數據連接<如FTP中的數據連接>
INVALID:包沒有辦法被識別,或者空上包沒有任何狀態,可以主動屏蔽INVALID的報文
UNTRACKED:未被追蹤的報文 ,當報文的狀態為Untracked時通常表示無法找到相關的連接
####
如何判斷報文是否是為了回應之前發出的報文,如果不是拒絕
#iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -t filter -I INPUT -j REJECT
《上面這句是表示不是的報文作何處理》
【-N 自定義鏈】
創建自定義鏈
#iptables -t filter -N IN_WEB
將規則添加至自定義鏈中
#iptables -t filter -I IN_WEB -s 192.168.1.123 -j REJECT
#iptables -I IN_WEB -s 192.168.1.188 -j REJECT
查看自定義鏈規則
#iptables -t filter --line -nvL IN_WEB
將訪問本機的80端口匹配到這條規則
#iptables -I INPUT -p tcp --dport 80 -j IN_WEB
重命名自定義鏈
#iptables -E IN_WEB WEB
刪除自定義鏈,要先刪除引用,清除自定義鏈規則
#iptables -D INPUT 1
#iptables -t filter -F WEB
#iptables -t filter -X WEB
【LOG動作】
將所有發往22端口的報文相關信息記錄在日誌中
<如果使用此日誌功能,建議盡可能的將條件匹配得精確一些>
#iptables -I INPUT -p tcp --dport 22 -j LOG
【修改日誌路徑】
#vim /etc/rsyslog.conf
添加如下信息:
#kern.warning /var/log/iptables.log
重啟rsyslog服務(或者syslogd)
#service rsyslog restart
--log-level 日誌級別:emerg, alert,crit,error,warning,notice,info,debug
--log-prefix 可以給記錄到日誌的相關信息添加“標簽”之類的信息,(*註意:不可超過29個字符)
例:<將所有主動連接22端口的報文信息均記錄到日誌中(其中有使用到state模塊,相關的看上面的這模塊說明)>
#iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22"
【網絡防火墻】
添加路由,訪問某網段,指定走某路由
#route add -net 10.1.0.0/16 gw 192.168.1.146
設置轉發報文
(臨時辦法有下面兩種)
#cat /proc/sys/net/ipv4/ip_forward <內容為0表示不轉發>
#echo 1>/proc/sys/net/ipv4/ip_forward
或者如下辦法:
#sysctl -w net.ipv4.ip_forward=1
(永久生效辦法)
#/etc/sysctl.conf (centos7為/usr/lib/sysctl.d/00-system.conf文件) 添加 net.ipv4.ip_forward=1即可
在FORWARD鏈的末端添加一條默認拒絕所有轉發的規則
#iptables -A FORWARD -j REJECT
添加一條允許10.1/16段的所有的IP均可正常的訪問外部主機的web請求(註意進出均要放行)
#iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
上面的是訪問報文的規則,下面的是響應報文的規則,但是響應的這樣相對麻煩
#iptables -I FORWARD -s 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT
可以按下面的辦法,添加一條規則,將所有的響應的報文均放行,這樣就不用重復的添加了<此條規則為所有的響應報文均放行,疑問的話,參考上面的state規則>
#iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
如:在上面的基礎上,需要再開放轉發訪問22端口的話。
#iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
【SNAT--也稱源地址轉換】
內網機器設置網關為iptables機器的中轉IP
1. 內網機器網關設置<gateway>
2. 開啟服務器的轉發設置<echo 1>/proc/sys/net/ipv4/ip_forward>
<10為內網服務器網段,146為服務器的公網IP地址,就是將內網服務器訪問過來的報文修改為192.168.1.146,然後再發送出去>
#iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146
【DNAT】
先清空表數據, 146為公司的公網地址<也可以理解為服務器的公網地址>,目標端口為3389,進行目標地址轉換
將訪問公網146的3389端口,會被映射到10.1.0.6的3389端口上(註意:設置之前,可能需要設置一下SNAT)
#iptables -t nat -F
#iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.6:3389
#iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 801 -j DNAT --to-destination 10.1.0.1:80
【MASQUERADE --動態IP的SNAT】
SNAT相同的動作,但是是將IP修改為eth1網卡上可用的IP地址
#iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eth1 -j MASQUERADE
【REDIRECT】
將本機的80端口映射到本機的8080端口上
#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables命令提取總結<取自朱雙印博客>