Iptables(如下簡稱Iptables)是unix/linux自帶的一款優秀且開放源代碼的徹底自由的基於包過濾(對OSI模型的四層或者是四層如下進行過濾)的防火牆工具,它的功能十分強大,使用很是靈活,能夠對流入和流出服務器的數據包進行很精細的控制。linux
iptables其實並非真正的防火牆,咱們能夠把他理解爲一個客戶端的代理,用戶是經過iptables這個代理,將用戶的安全設定執行到對應的「安全框架」中,這個「安全框架」纔是真正的防火牆。這個框架叫作「netfilter」。 netfilter:內核空間,是真正實現防火牆的功能。 iptables:用戶空間,在/sbin/iptables存在的防火牆,經過iptables提供管理,修改,刪除或者插入規則。 用戶和內核交互的一個工具就是iptables。
iptables工做流程web
一、防火牆是一層層過濾的。實際是按照配置規則的順序從上到下,從前到後進行過濾的。 二、若是匹配上了規則,即明確代表是阻止仍是經過,此時數據包就不在向下匹配新規則了。 三、若是全部規則中沒有明確代表是阻止仍是經過這個數據包,也就是沒有匹配上規則,向下進行匹配,直到匹配默認規則獲得明確的阻止仍是經過。 四、防火牆的默認規則是對應鏈的全部的規則執行完之後纔會執行的(最後執行的規則)。
默認狀況下,iptables根據功能和表的定義劃分包含三個表,filter,nat,mangle,其每一個表又包含不一樣的操做鏈(chains )。 實際iptables包含4張表和五個鏈,主要記住filter便可。
四個表shell
必須是小寫 raw ------------追蹤數據包, ----此表用處較少,能夠忽略不計 mangle -------- 給數據包打標記,作標記 nat ---------網絡地址轉換即來源與目的的IP地址和port的轉換。 filter --------作過濾的,防火牆裏面用的最多的表。 #表的應用順序:raw-》mangle-》nat-》filter
五個鏈centos
五鏈:(必須是大寫)鏈裏面寫的是規則。 PREROUTING ---------------------進路由以前數據包 INPUT -----------------就是過濾進來的數據包(輸入) FORWARD -----------------轉發 OUTPUT ---------------發出去的數據包 POSTROUTING --------------路由以後數據包 #全部的訪問都是按順序: 入站:好比訪問自身的web服務流量。先PREROUTING(是否改地址,只能改目標地址),經路由再INPUT(是否容許)到達程序。 轉發:通過linux網關的流量.先PREROUTING(是否改地址),而後路由。轉發給FORWARD(轉發或者丟棄),最後通過POSTROUTING(看看改不改地址,原地址和目標地址。) 出站:源自linux自身的流量.先OUTPUT,再給POSTROUTING(是否改IP)。 #規則順序:逐條匹配,匹配即中止。
四表五鏈安全
raw表裏面: PREROUTING OUTPUT 總結:數據包跟蹤 內核模塊iptables_raw =============================================== mangel表裏面有5個鏈: PREROUTING INPUT FORWARD OUTPUT POSTROUTING 路由標記用的表。內核模塊iptables_mangle ===================================================== nat表裏面的鏈: PREROUTING INPUT OUTPUT POSTROUTING 轉換地址的表(改IP,改端口。當網關使用的linux。保護內外網流量。內核模塊叫iptable_nat) ========================================== filter表有三個鏈:重點 INPUT #負責過濾全部目標是本機地址的數據包通俗來講:就是過濾進入主機的數據包 FORWARD #負責轉發通過主機的數據包。起到轉發的做用 OUTPUT #處理全部源地址是本機地址的數據包通俗的講:就是處理從主機發出的數據包 總結:根據規則來處理數據包,如轉或者丟。就是實現主機型防火牆的主要表。 內核模塊 iptable_filter
centos7 [root@iptables-server ~]# yum install -y iptables iptables-services #安裝iptables [root@iptables-server ~]# systemctl stop firewalld #關閉防火牆 [root@iptables-server ~]# systemctl disable firewalld #永久關閉 [root@iptables-server ~]# systemctl start iptables #啓動iptables 查看版本: [root@iptables-server ~]# iptables -V iptables v1.4.21 若是你是centos(5/6) ,iptanles的啓動方式用這個命令 #/etc/init.d/iptables start
-L:列出一個鏈或全部鏈中的規則信息 -n:以數字形式顯示地址、端口等信息 -v:以更詳細的方式顯示規則信息 --line-numbers:查看規則時,顯示規則的序號(方便之處,經過須要刪除規則-D INPUT 1 -F:清空全部的規則(-X是清理自定義的鏈,用的少;-Z清零規則序號) -D:刪除鏈內指定序號(或內容)的一條規則 -R:修改規則 -P:爲指定的鏈設置默認規則 -A:在鏈的末尾追加一條規則 -I:在鏈的開頭(或指定序號)插入一條規則 -t: 指定表名 .... 更多參數可經過--help查看
-L:列出一個鏈或全部鏈中的規則信息 [root@iptables-server ~]# iptables -L 默認查看全部鏈規則 -t: 指定表名 可是若是不加-t參數,默認使用的是filter表 [root@iptables-server ~]# iptables -t nat -L #列出nat表中的規則 [root@iptables-server ~]# iptables -nL #以數字的形式顯示ip和端口與協議 [root@iptables-server ~]# iptables -nL --line #顯示規則行號 清空規則: #iptables -F 清空單獨的某一個鏈裏面的規則 #iptables -F 鏈名 清空單獨的某一個表裏的,某一個鏈裏面的規則 # iptables -t nat -F 鏈名 保存規則: [root@iptables-server ~]# service iptables save 或者 [root@iptables-server ~]# iptables-save > /etc/sysconfig/iptables 不保存的話只是臨時起做用,重啓會失效
iptables的通常語法規則服務器
iptables -t 表名 動做 [鏈名] [-p 匹配條件] [-j 控制類型] -j:控制類型, 經過前面匹配到以後是丟棄仍是保留數據包的處理方式: ACCEPT容許, REJECT拒絕, DROP丟棄。 不會給用戶返回任何的拒絕消息,不推薦使用。 LOG寫日誌(log不適用匹配,只是記錄一下) ====================================================== 動做:添規則仍是刪除規則 -p:匹配條件:數據包特徵ip,端口等 若是不寫-t 默認使用filter表 ======================================================= 動做 修改默認規則: -P (大p) 刪除規則:-D 修改規則:-R 追加規則: -A 默認追加到鏈的末尾 插入規則:-I (大i),在鏈的開頭(或指定序號)插入一條規則
舉例網絡
iptables -t filter -A INPUT -p tcp -j ACCEPT #在filter表INPUT鏈的最後一行插入容許tcp的規則 iptables -I INPUT -p udp -j ACCEPT #在filter表INPUT鏈的第一行插入容許udp的規則 iptables -I INPUT 4 -p icmp -j ACCEPT #在filter表INPUT鏈的第四行插入容許icmp的規則 iptables -D INPUT 3 #刪除filter表INPUT鏈的第三行規則
案例
協議:-p (小p)
tcp ---用的最多
udp
icmp ---ping的時候用的協議框架
1.禁止本身被別人ping [root@iptables-server ~]# iptables -A INPUT -p icmp -j REJECT 咱們去另外一臺上面測試 [root@iptables-test ~]# ping 192.168.13.139 PING 192.168.13.139 (192.168.13.139) 56(84) bytes of data. From 192.168.13.139 icmp_seq=1 Destination Port Unreachable 2.拒絕test(192.168.13.140)這臺機器經過ssh鏈接到本服務器 端口: --sport ---源端口 --dport --目標端口 -s : 指定ip地址 [root@iptables-server ~]# iptables -I INPUT -s 192.168.13.140 -p tcp --dport 22 -j REJECT 驗證: [root@iptables-test ~]# ssh root@192.168.13.139 ssh: connect to host 192.168.13.139 port 22: Connection refused [root@iptables-server ~]# iptables -I INPUT -s 192.168.13.140 -p tcp --dport 22:80 -j REJECT #端口的範圍: 拒絕192.168.13.140這臺機器經過22端口到80端口的訪問,包括22和80端口在內 驗證: [root@iptables-test ~]# curl -I http://192.168.13.139 curl: (7) Failed connect to 192.168.13.139:80; Connection refused -s後面能夠跟多個ip地址,好比-s 192.168.13.140,192.168.13.141 中間用逗號隔開 若是不指定-s ip地址 ,那就是對全部的機器都生效 3.禁止ping策略原則 iptables服務器是ping命令發起者或是接受者 -i --in-interface:在INPUT鏈配置規則中,指定從哪個網卡接口進入的流量(只能配置在INPUT鏈上) -o --out-interface:在OUTPUT鏈配置規則中,指定從哪個網卡接口出去的流量(只能配置在OUTPUT鏈上) ==================================================== icmp的類型: 0: Echo Reply——回顯應答(Ping應答)ping的結果返回。 8: Echo request——回顯請求(Ping請求),發出去的請求。 ===================================================== iptables服務器-----發起者:ping 別的機器 1.本身不能ping別人,可是別人能夠ping本身: [root@iptables-server ~]# iptables -I OUTPUT -o ens33 -p icmp --icmp-type 8 -j REJECT #ping發出的請求禁止掉了 驗證: [root@iptables-server ~]# ping 192.168.13.140 #將ping請求給禁止掉了。 PING 192.168.13.140 (192.168.13.140) 56(84) bytes of data. ping: sendmsg: Operation not permitted [root@jenkins-server ~]# ping 192.168.13.139 #能夠ping通 PING 192.168.13.139 (192.168.13.139) 56(84) bytes of data. 64 bytes from 192.168.13.139: icmp_seq=1 ttl=64 time=0.280 ms ========================================================================================= iptables服務器做爲接受者。也就是別人ping本身: 本機能夠ping其餘機器。其餘機器不能ping通本機: 第一種方法: [root@iptables-server ~]# iptables -I OUTPUT -o ens33 -p icmp --icmp-type 8 -j ACCEPT #容許本身ping別人 [root@iptables-server ~]# iptables -A INPUT -i ens33 -p icmp --icmp-type 8 -j REJECT #將進來的ping請求給丟棄了。 換一種方法: [root@iptables-server ~]# iptables -I OUTPUT -o ens33 -p icmp --icmp-type 0 -j REJECT #不給迴應icmp包 驗證: [root@iptables-server ~]# ping 192.168.13.140 #ping其餘機器通 PING 192.168.13.140 (192.168.13.140) 56(84) bytes of data. 64 bytes from 192.168.13.140: icmp_seq=1 ttl=64 time=0.491 ms [root@iptables-test ~]# ping 192.168.13.139 #其餘機器ping不一樣 PING 192.168.13.139 (192.168.13.139) 56(84) bytes of data. ========================================================================================= 拒絕任何ping的協議: [root@iptables-server ~]# iptables -A INPUT -p icmp -j DROP
顯示匹配:如端口匹配,IP範圍,MAC地址,等特殊匹配ssh
#iptables -m iprange --help 1.指定ip範圍: 語法: -m iprange --src-range # iptables -I INPUT -p tcp --dport 80 -m iprange --src-range 192.168.13.120-192.168.13.150 -j REJECT 2.指定多端口範圍:一次拒絕多個指定端口 語法: -m multiport --sports #源端口 -m multiport --dports #目的端口 # iptables -A INPUT -p tcp -m multiport --dports 22,80 -s 192.168.13.140 -j REJECT 驗證:在13.140機器上 # ssh root@192.168.13.139 #不通 ssh: connect to host 192.168.13.139 port 22: Connection refused 3.MAC地址匹配 拒絕MAC地址的匹配:只能匹配源MAC地址 語法: -m mac --mac-source # iptables -I INPUT -p icmp -m mac --mac-source 0:0c:29:cd:26:77 -j REJECT #拒絕指定的MAC地址服務經過icmp協議請求到本地 # iptables -I INPUT -m mac --mac-source 00:0C:29:64:E3:8D -j REJECT #將指定的MAC地址服務請求所有禁止了 # iptables -I INPUT -i ens33 -j DROP #經過網卡接口,誰也連不上了.
大家的評論和點贊是我寫文章的最大動力,蟹蟹。curl