centos 5.x,6.x的iptables
iptables就是Linux的防火牆,主要對iso中的3,4層進行控制出入和檢測等功能。其中有5個規則鏈:
1.PREROUTING (路由前)
2.INPUT (數據包流入口)
3.FORWARD (轉發管卡)
4.OUTPUT(數據包出口)
5.POSTROUTING(路由后)
只要數據進入linux就必須經過必須經過其中一個,或者多個。其中一個鏈的內部,規則應該是越來越寬松的,越是嚴格的規則就應該越放在前面。
對於filter來講一般只能做在3個鏈上:INPUT ,FORWARD ,OUTPUT
對於nat來講一般也只能做在3個鏈上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle則是5個鏈都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
實例:
比如:不允許172.16.0.0/24的進行訪問。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP 注意dorp動作是不會給訪問者任何回答的,會照成訪問者的等待超時時間現象。
當然你如果想拒絕的更徹底:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT 注意reject會發送reject信號給訪問者,訪問者不會等待,受到reject信號馬上就會關閉socket。
iptables -P INPUT (DROP|ACCEPT) 默認是關的/默認是開的。一般正常默認就是drop不用去更改,這樣比較安全。
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT 含義:允許172.16.0.0/16到172.16.100.1 tcp協議的22端口
iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 允許172.16.0.0/16傳輸狀態為NEW,ESTABLISHED的tcp端口為22的包。
管理命令:
iptables -A:追加,在當前鏈的最后新增一個規則
iptables -I num : 插入,把當前規則插入為第幾條。
-I 3 :插入為第三條
iptables -R num:Replays替換/修改第幾條規則
格式:iptables -R 3 …………
iptables -D num:刪除,明確指定刪除第幾條規則
附加子命令:
-n:以數字的方式顯示ip,它會將ip直接顯示出來,如果不加-n,則會將ip反向解析成主機名。
通用匹配:源地址目標地址的匹配
-s:指定作為源地址匹配,這里不能指定主機名稱,必須是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一個“!”表示除了哪個IP之外
-d:表示匹配目標地址
-p:用於匹配協議的(這里的協議通常有3種,TCP/UDP/ICMP)
-i eth0:從這塊網卡流入的數據
流入一般用在INPUT和PREROUTING上
-o eth0:從這塊網卡流出的數據
流出一般在OUTPUT和POSTROUTING上
擴展匹配
2.1隱含擴展:對協議的擴展
-p tcp :TCP協議的擴展。一般有三種擴展
--dport XX-XX:指定目標端口,不能指定多個非連續端口,只能指定單個端口,比如
--dport 21 或者 --dport 21-23 (此時表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的標志位(SYN,ACK,FIN,PSH,RST,URG)
對於它,一般要跟兩個參數:
1.檢查的標志位
2.必須為1的標志位
--tcpflags syn,ack,fin,rst syn = --syn
表示檢查這4個位,這4個位中syn必須為1,其他的必須為0。所以這個意思就是用於檢測三次握手的第一次包的。對於這種專門匹配第一包的SYN為1的包,還有一種簡寫方式,叫做--syn
-p udp:UDP協議的擴展
--dport
--sport
-p icmp:icmp數據報文的擴展
--icmp-type:
echo-request(請求回顯),一般用8 來表示
所以 --icmp-type 8 匹配請求回顯數據包
echo-reply (響應的數據包)一般用0來表示
-v:顯示詳細信息
-vv
-vvv :越多越詳細
-x:在計數器上顯示精確值,不做單位換算
--line-numbers : 顯示規則的行號
-t nat:顯示所有的關卡的信息
擴展:
-m state
--state {NEW,ESTATBLISHED,INVALID,RELATED} 指定檢測那種狀態
-m multiport 指定多端口號
--sport
--dport
--ports
-m iprange 指定IP段
--src-range ip-ip
--dst-range ip-ip
-m connlimit 連接限定
--comlimit-above # 限定大連接個數
-m limit 現在連接速率,也就是限定匹配數據包的個數
--limit 指定速率
--limit-burst # 峰值速率,最大限定
-m string 按字符串限定
--algo bm|kmp 指定算法bm或kmp
--string "STRING" 指定字符串本身
實例:
iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT 一分鍾6個,同時並發5個
iptables -P INPUT DROP
常用的ACTION:
DROP:悄悄丟棄
一般我們多用DROP來隱藏我們的身份,以及隱藏我們的鏈表
REJECT:明示拒絕
ACCEPT:接受
custom_chain:轉向一個自定義的鏈
DNAT
SNAT
MASQUERADE:源地址偽裝
REDIRECT:重定向:主要用於實現端口重定向
MARK:打防火牆標記的
RETURN:返回
在自定義鏈執行完畢后使用返回,來返回原規則鏈。
狀態檢測
什么是狀態檢測?對於整個TCP協議來講,它是一個有連接的協議,三次握手中,第一次握手,我們就叫NEW連接,而從第二次握手以后的,ack都為1,這是正常的數據傳輸,和tcp的第二次第三次握手,叫做已建立的連接(ESTABLISHED),還有一種狀態,比較詭異的,比如:SYN=1 ACK=1 RST=1,對於這種我們無法識別的,我們都稱之為INVALID無法識別的。還有第四種,FTP這種古老的擁有的特征,每個端口都是獨立的,21號和20號端口都是一去一回,他們之間是有關系的,這種關系我們稱之為RELATED。
所以我們的狀態一共有四種:
NEW
ESTABLISHED
RELATED
INVALID
SNAT,DNAT
基於原地址的轉換一般用在我們的許多內網用戶通過一個外網的口上網的時候,這時我們將我們內網的地址轉換為一個外網的IP,我們就可以實現連接其他外網IP的功能。
SNAT 源地址轉換:
數據包要通過iptable出去的時候用,可作為網關。
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE 把172.16.1.0過來的地址都動態變成一個公網ip轉發出去,
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 183.131.4.180 把172.16.1.0過來的地址都固定轉發成183.131.4.180出去。
DNAT目的地址轉換:
數據包要通過iptables進來的時候用,一般用於內網有要提供服務的機器
iptables -t nat -A PREROUTING -d 172.16.2.214/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 101.71.39.58:80 把目的地址為172.16.2.214的端口80的包的目的地址都轉換成101.71.39.58端口80 注意,DNAT都是路由前轉換的,SNAT都是路由后轉換的,這點是ip路由特性cpu處理IP包的流程所決定的。
系統命令
service iptables save 保存剛剛寫的配置。(配置以文件的形式存在於/etc/sysconfig/iptables中)
service iptables stop
service iptables start
centos7 firewall
centos7除移了iptables,使用了新的防火牆模塊叫做firewall,新的firewall從結構上來說,更趨近於類似cisco asa,juniper netscreen 這種硬件防火牆,有了zone的概念,理論上來說對包的控制更強也更安全了。但是帶來的負面效果就是學習成本變高,排錯成本變高。
上圖為iptables和firewall的關系,在service層面是平級的,然后firewall最終還是調用的iptables的command。去執行內核的netfilter。光從使用層面來說是挺不方便的。作者的想法可能是現在硬件防火牆在互聯網公司用的越來越少,為了加強安全概念吧。
查看命令:
firewall-cmd --get-zones 查看現有的zone
firewall-cmd --get-services 查看所支持的服務
firewall-cmd --zone=<zonename> --list-all 查看特定zone的配置
firewall-cmd --get-default-zone 查看默認區域的網絡設置,一般來說就是public
firewall-cmd --set-default-zone=<zonename> 修改默認zone
firewall-cmd --get-active-zones 查看active的zone
修改接口和zone命令:
firewall-cmd --get-zone-of-interface=<interface name> 查看接口所在的zone
firewall-cmd [--zone=<zone>] --add-interface=<interface> 把接口添加到指定zone
firewall-cmd [--zone=<zone>] --remove-interface=<interface> 把接口從指定zone刪除
firewall-cmd [--zone=<zone>] --query-interface=<interface> 查看指定zone是否包含指定接口
firewall-cmd [ --zone=<zone> ] --list-services 查看指定zone的service
修改規則命令:
firewall-cmd --panic-on 終止所有網絡鏈接,慎用!
firewall-cmd --panic-off 恢復網絡鏈接
firewall-cmd --query-panic && echo "On" || echo "Off" 查詢應急模式的狀態
firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>] 啟用特定zone的某個服務,加上timeout可以表示這個服務啟用多長時間。
firewall-cmd [--zone=<zone>] --remove-service=<service> 除移某個服務
firewall-cmd [--zone=<zone>] --query-service=<service> 查看某個zone中特定的服務
firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> 自定義啟用某個協議和端口
firewall-cmd --zone=public --add-port=23/tcp
firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol> 除移端口
ip偽裝
firewall-cmd [--zone=<zone>] --add-masquerade 開啟某個區域的ip偽裝,都偽裝成這個zone的ip地址,就是nat模式
firewall-cmd [--zone=<zone>] --remove-masquerade 關閉ip偽裝
icmp阻塞
firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype> 開啟指定zone的icmp阻塞,icmptype有2種,echo(發起),echo-reply(回應)
firewall-cmd [--zone=<zone>] --remove-icmp-block=<icmptype> 除移
nat
firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> {:toport=<port>[-<port>] |:toaddr=<address> |:toport=<port>[-<port>]:toaddr=<address> } 添加nat
firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=2055:toaddr=192.168.1.100 把external區域的22端口映射到192.168.1.100的2055端口。
firewall-cmd [--zone=<zone>] --remoeve-forward-port=port=<port>[-<port>]:proto=<protocol> {:toport=<port>[-<port>] |:toaddr=<address> |:toport=<port>[-<port>]:toaddr=<address> }除移nat
命令選項
--permanent ,–direct 永久和直接,永久是不影響現在的運行配置的,在重啟服務后啟動,而直接是影響現在運行的配置的,在重啟服務后實效。配置起來很簡單,在以上所有firewall-cmd 后面跟上就可以了。
添加rule
只有在 --direct模式下才可以這樣直接添加rule,rule的格式就是和iptables的命令一樣的。找對chain就可以了
firewall-cmd --direct --add-rule ipv4 filter IN_public_allow 0 -m tcp -p tcp --dport 666 -j ACCEPT 為in_public_allow 這個chain添加一個0號規則 放行tcp 666端口
firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow 0 -m tcp -p tcp --dport 666 -j ACCEPT 除移動
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j MASQUERADE -s 192.168.0.0/24 添加nat規則,源為192.168.0.0/24的都nat成eth0這個ip地址,有篇國外的文章有詳細的gateway配置,翻牆打開。
http://blog.redbranch.net/2015/07/30/centos-7-as-nat-gateway-for-private-network/
復雜的rule
firewall-cmd [--zone=zone] --add-rich-rule='rule' 這個rich-rule我自己也沒怎么研究過。總之和之前所說的rule應該是一樣的概念,centos官方文檔比例巴拉寫了一大堆說可以添加timeout時間參數,也是夠了,感覺實際用到的應該很少。
寫了那么多,其實也沒有想象中的復雜,對於暴露在公網的服務器就只開放提供服務的端口,內網沒有暴露的Firewall就不用那么嚴格,基本上不用特意去改動。