1. 程式人生 > >iptables命令提取總結<取自朱雙印博客>

iptables命令提取總結<取自朱雙印博客>

新建 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命令提取總結<取自朱雙印博客>