Linux九陰真經之大伏魔拳殘卷2(linux防火牆)


防火牆概念

 

從邏輯上講,防火牆可以答題分為主機防火牆和網絡防火牆

主機防火牆: 針對於單個主機進行防護。

網絡防火牆:往往處於網絡入口或邊緣,針對於網路入口進行防護,服務於防火牆背后的本地局域網。

網絡防火牆和主機防火牆並不沖突,可以理解為 網絡防火牆主外(集體), 主機防火牆主內(個人)。

 

從物理上講,防火牆可以分為硬件防火牆和軟件防火牆。

硬件防火牆:在硬件級別實現部分防火牆功能,另一部分功能基於軟件實現,性能高,成本高。

軟件防火牆:應用軟件處理邏輯運行於通用硬件 平台之上的防火牆,性能低,成本低。

 

iptables

 

簡介

iptables 其實不是真正的防火牆,我們可以把它理解為一個客戶端代理,用戶通過iptables 這個代理,將用戶的安全設定執行到對應的“安全框架”中, 這個“安全框架” 才是真正的防火牆,這個框架的名字是netfilter

 

netfilter是linux操作系統核心層內部的一個數據包處理模塊,它具有如下功能:

網絡地址轉換--NAT

數據包內容修改

數據包過濾的防火牆功能

所以說 雖然我們使用service  iptables  start 啟動服務 ,但其實准確來說,iptables 並沒有一個守護進程,所以並不能算是真正意義上的服務,而應該算是內核提供的功能。

 

iptables基礎

 

當客戶端訪問服務器的web服務時,客戶端發送報文到網卡上,而tcp/ip 協議棧是屬於內核的一部分,所以客戶端的信息回通過內核的TCP 協議傳輸到用戶空間中的web服務中,而此時客戶端報文的目標終點為web服務所監聽的套接字(IP : Port)上,當web服務需要相應客戶端請求時,web服務發送的響應報文的目標終點則為客戶端,這個時候。web服務所監聽的IP 與端口反而變成了原 ;我們說過 netfilter 才是真正的防火牆,它是內核的一部分,所以 如果我們想要防火牆能夠達到 “防火”的目的,則需要在內核中設置關卡,所有進出的報文都要通過這些關卡,經過檢查后,符合放行條件的才能放行,符合阻攔條件的需要被阻擋,於是就出現了input 和 output 關卡, 而這些 關卡 在iptables 中 被稱為 “

 

 

 

我們上面描述的 並不完善,因為客戶端發來的報文訪問的目標地址可能並不是本機,而是其他服務器,當本機的內核支持IP_FORWARD時, 我們可以將報文轉發給其他服務器,所以 這個時候,我們就會用到 “關卡”,也就是“鏈”,他們就是“路由前”、“轉發”、“路由后”、,他們的英文名是PREROUTING、FORWARD、POSTROUTING

 

也就是說,當我們啟用了防火牆功能時,報文需要經過如下關卡, 要根據實際情況不同,報文經過的“鏈”可能不同。如果報文需要轉發,那么報文則不會經過input 鏈發往用戶空間,而是直接在內核空間中經過forward鏈和 postrouting 鏈轉發出去的

 

 根據上圖,我們能夠總結出 報文流向的三種場景

 

1、到本機進程的報文:PREROUTING---> INPUT

2、由本機轉發的報文:PREROUTING --> FORWARD -->POSTROUTING

3、由本機的某進程發出報文(通常為響應報文) :OUTPUT --> POSTROUTING

 

鏈  

 

 我們知道,防火牆的作用就在於對經過的報文匹配“規則”,然后執行對應的“動作”,所以當報文經過這些關卡的時候,必須匹配到這個關卡上的規則,但是這個關卡上可能不止有一條規則,而是有很多條規則,當我們把這些規則串到一個鏈條上的時候,就形成了“鏈”, 所以我們把每一個關卡想象成如下圖 所示的模樣,這樣來說,把他們稱為“鏈” 更為合適,每個經過這個“關卡”的報文, 都要講這條“鏈”上所有的規則匹配一遍, 如果有符合條件的規則, 則執行規則對應的動作。

 

 

 

 表

 

我們把相同功能的規則集合叫做“表”,所以說不同功能的規則,我們可以放置在不同的表中濟寧管理,而iptables 已經為我們定義了4種表,每種表對應了不同的功能,二我們定義的規則也都逃脫不了這4種功能范圍,所以學習iptables 之前 ,我們要搞明白每種表的作用。

 

iptables 為我們提供了如下規則的分類, 或者說 iptables 為我們提供了如下“表”

 

filter表:負責過濾功能,防火牆;內核模塊:iptables_filter

nat表:network address translation ,網絡地址轉換功能;內核模塊:iptable_nat

mangle表 :拆解報文,做出修改,並重新封裝的功能; iptable_mangle

raw表:關閉nat表上啟用的連接追蹤機制; iptable_raw

也就是說,我們自定義的所有規則,都是這四種分類中的規則,或者說 所有規則都存在於這4張表中

 

iptables規則管理

 

iptables  -F  :清除所有規則

iptables  -F  INPUT: 清除 INPUT 里所有規則

iptables  -nvL  INPUT : 查看規則的詳細信息,包括端口,IP地址

 

添加規則

 

 

ACCEPT 表示允許

 

REJECT 表示拒絕

 

DROP      表示刪除

 

-A  表示在鏈的尾部 追加規則

 

- I 表示在在鏈的首部插入規則

iptables --line -vnL INPUT  :  列出規則序號

示例:

 

[root@centos7 ~]#iptables -I INPUT -s 192.168.95.5 -j REJECT    #拒絕95.5的計算機訪問

  [root@localhost ~]# ping 192.168.95.2
  PING 192.168.95.2 (192.168.95.2) 56(84) bytes of data.
  From 192.168.95.2 icmp_seq=1 Destination Port Unreachable   #訪問被拒絕
  From 192.168.95.2 icmp_seq=2 Destination Port Unreachable

  

  [root@centos7 ~]#iptables -vnL INPUT
  Chain INPUT (policy ACCEPT 32 packets, 4904 bytes)
  pkts bytes target prot opt in out source destination
  5 420 REJECT all -- * * 192.168.95.5 0.0.0.0/0     #顯示被拒絕的主機信息

[root@centos7 ~]#iptables -t filter -I INPUT -s 192.168.95.5 -j DROP    #插入一條拒絕規則
[root@centos7 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 48 packets, 3168 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      *       192.168.95.5         0.0.0.0/0     #順序在最上面      
    0     0 REJECT     all  --  *      *       192.168.95.5         0.0.0.0/0          

[root@localhost ~]# ping 192.168.95.2    
PING 192.168.95.2 (192.168.95.2) 56(84) bytes of data.  #訪問被拒絕,ping不通

 

看來 規則順序很重要,如果報文已經被前面的規則匹配到,iptables則會對報文習性對應的動作,即使后面的規則也能匹配到 也沒有機會再對報文執行相應的動作了。

 

我們也可以在添加規則時,指定新增規則的序號,這樣我們就能在任意位置插入規則了

[root@centos7 ~]#iptables -t filter -I INPUT 3 -s 192.168.95.5 -j ACCEPT   #指定規則的序號為3

  [root@centos7 ~]#iptables --line -vnL INPUT
  Chain INPUT (policy ACCEPT 38 packets, 6438 bytes)
  num pkts bytes target prot opt in out source destination
  1 6 504 DROP all -- * * 192.168.95.5 0.0.0.0/0
  2 0 0 REJECT all -- * * 192.168.95.5 0.0.0.0/0 reject-with icmp-port-unreachable
  3 0 0 ACCEPT all -- * * 192.168.95.5 0.0.0.0/0

 

刪除規則

 

方法一:根據規則的編號去刪除

方法二:根據具體的匹配條件與動作刪除

 

方法一

[root@centos7 ~]#iptables -t filter -D INPUT 3

方法二

[root@centos7 ~]#iptables -D INPUT -s 192.168.95.5 -j ACCEPT

 

修改規則

[root@centos7 ~]#iptables -t filter -R INPUT 3 -s 192.168.95.5 -j DROP

這里要說明一下,-R 選項表示修改指定的鏈, INPUT 第3條規則,-j  DROP 表示將即原來的動作改為 DROP; 而 -s 選項以及對應的源地址不可以省略 ,即使我們指定了規則編號 也不行,否則修改完成后,規則中的源地址會自動變成 0.0.0.0/0

 

保存規則

 

centos6 :service iptables save        默認保存在/etc/sysconfig/iptables

 

centos7:已經不再使用init風格的腳本啟動服務,而是使用unit文件,所以不能使用類似centos6的命令了,下面是 centos7 的 保存規則步驟

 

上述配置過程只需一次,以后即可在centos7 中 使用 service  iptables  save 命令保存 iptables規則了

 

匹配條件

 

[!] -s, --source address[/mask][,...]:源IP地址或范圍

[root@centos7 ~]# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
[root@centos7 ~]# iptables -A INPUT -j DROP
 

[!] -d, --destination address[/mask][,...]:目標IP地址或范圍

[root@centos7 ~]# iptables -A OUTPUT -d 192.168.0.0/24 -j ACCEPT
[root@centos7 ~]# iptables -A OUTPUT -j DROP
 

[!] -p, --protocol protocol:指定協議portocol:tcp、udp、icmp,參考/etc/protocols

[root@centos7 ~]# iptables -A INPUT -p tcp -j ACCEPT
 

[!] -i, --in-interface name:報文流入的接口;只能應用於數據報文流入環節,只應用於INPUT、FORWARD、PREROUTING鏈

[root@centos7 ~]# iptables -A INPUT -i lo -j ACCEPT
 

[!] -o, --out-interface name:報文流出的接口;只能應用於數據報文流出的環節,只應用於FORWARD、OUTPUT、POSTROUTING鏈

[root@centos7 ~]# iptables -A OUTPUT -o lo -j ACCEPT
 

4.2) 擴展匹配條件:需要加載擴展模塊/usr/lib64/xtables/*.so,查看幫助man iptables-extensions

4.2.1)隱式擴展:在使用-p選項指明了特定的協議時,無需再用-m選項指明擴展模塊的擴展機制,不需要手動加載擴展模塊

 

tcp協議的擴展選項:

[!] --source-port, --sport port[:port]:匹配報文源端口,可為端口范圍

[root@centos7 ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT      
[root@centos7 ~]# iptables -A OUTPUT -j DROP

 

[!] --destination-port,--dport port[:port]:匹配報文目標端口,可為范圍

[root@centos7 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@centos7 ~]# iptables -A INPUT -j DROP
 

[!] --tcp-flags mask comp:mask 需檢查的標志位列表,用,分隔,例如 SYN,ACK,FIN,RST;comp 在mask列表中必須為1的標志位列表,無指定則必須為0,用,分隔

[root@centos7 ~]# iptables -I INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT
 

[!] --syn:用於匹配第一次握手,相當於:--tcp-flags SYN,ACK,FIN,RST SYN

[root@centos7 ~]# iptables -I INPUT -p tcp --syn -j ACCEPT
 

udp協議的擴展選項:

[!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍

[!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍

 

icmp協議的擴展選項:

 

[!] --icmp-type {type[/code]|typename}:0:icmp應答;8:icmp請求

[root@centos7 ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP  #不接受ping請求
[root@centos7 ~]# iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
 

4.2.2)顯式擴展:必須使用 -m 選項指明要調用的擴展模塊的擴展機制,要手動加載擴展模塊

使用幫助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions

multiport:以離散方式定義多端口匹配,最多指定15個端口

[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口

[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口

[!] --ports port[,port|,port:port]...:多個源或目標端口

[root@centos7 ~]# iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT

 

iprange:指明連續的(但一般不是整個網絡)ip地址范圍

[!] --src-range from[-to]:源IP地址范圍

[!] --dst-range from[-to]:目標IP地址范圍

[root@centos7 ~]# iptables -A INPUT -m iprange --src-range 192.168.0.100-192.168.0.200 -j REJECT
 

mac:指明源MAC地址,適用於:PREROUTING,FORWARD,INPUT

[!] --mac-source XX:XX:XX:XX:XX:XX

string:對報文中的應用層數據做字符串模式匹配檢測

--algo {bm|kmp}:字符串匹配檢測算法

--from offset 開始偏移

--to offset 結束偏移

[!] --string pattern:要檢測的字符串模式

[!] --hex-string pattern:要檢測字符串模式,16進制格式

[root@centos7 ~]# echo "www.baidu.com" > /var/www/html/f1.txt
[root@centos7 ~]# echo "www.google.com" > /var/www/html/f2.txt
[root@centos7 ~]# systemctl start httpd
[root@centos6 ~]# curl 192.168.0.7/f1.txt
www.baidu.com
[root@centos6 ~]# curl 192.168.0.7/f2.txt  #加規則之前正常訪問
www.google.com
[root@centos7 ~]# iptables -A OUTPUT -m string --algo bm --string google -j REJECT  #在OUTPUT鏈上加字符串匹配規則
[root@centos6 ~]#  curl 192.168.0.7/f1.txt  #baidu正常訪問
www.baidu.com
[root@centos6 ~]#  curl 192.168.0.7/f2.txt  #google無法訪問
 

time:根據將報文到達的時間與指定的時間范圍進行匹配

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

[!] --monthdays day[,day...]

[!] --weekdays day[,day...]

--kerneltz:內核時區,CentOS7系統默認為UTC;CentOS6不支持kerneltz,默認使用--localtz:指定本地時區

[root@centos7 ~]# iptables -A INPUT -d 192.168.0.7 -p tcp --dport 80 -m time --timestart 1:00 --timestop 4:00 --weekdays 1,3,5 --kerneltz -j DROP
 

connlimit:根據每客戶端IP做並發連接數數量匹配,通常分別與默認的拒絕或允許策略配合使用

--connlimit-upto n:連接的數量小於等於n時匹配

--connlimit-above n:連接的數量大於n時匹配

[root@centos7 ~]# iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
 

limit:基於收發報文的速率做匹配,令牌桶過濾器

--limit rate[/second|/minute|/hour|/day] 每多長時間接收rate個包

--limit-burst number 第一次允許流入多少個包

[root@centos7 ~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
[root@centos7 ~]# iptables -A INPUT -p icmp -j REJECT

 

state:根據”連接追蹤機制“去檢查連接的狀態

conntrack機制:追蹤本機上的請求和響應之間的關系;modprobe nf_conntrack

狀態有如下幾種:

  • NEW:新發出請求;連接追蹤信息庫中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求
  • ESTABLISHED:NEW狀態之后,連接追蹤信息庫中為其建立的條目失效之前期間內所進行的通信狀態
  • RELATED:新發起的但與已有連接相關聯的連接,如:ftp協議中的數據連接與命令連接之間的關系
  • INVALID:無效的連接,如flag標記不正確
  • UNTRACKED:未進行追蹤的連接,如raw表中關閉追蹤

[!] --state {NEW,ESTABLISHED,RELATED,INVALID,UNTRACKED}

[root@centos7 ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@centos7 ~]# iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -m state --state NEW -j ACCEPT[root@centos7 ~]# iptables -A INPUT -j DROP
 

已經追蹤到的並記錄下來的連接信息庫/proc/net/nf_conntrack

調整連接追蹤功能所能夠容納的最大連接數量/proc/sys/net/nf_conntrack_max

不同的協議的連接追蹤時長/proc/sys/net/netfilter/

iptables的鏈接跟蹤表最大容量為/proc/sys/net/nf_conntrack_max各種狀態的超時鏈接會從表中刪除;當模板滿載時,后續連接可能會超時

解決方法兩個: 
(1) 加大 nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2)  降低 nf_conntrack timeout 時間
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
 

5、-j target:處理動作

5.1)簡單:

  • ACCEPT
  • DROP

5.2)擴展:

  • REJECT:--reject-with:icmp-port-unreachable默認
  • RETURN:返回調用鏈
  • REDIRECT:端口重定向
  • MARK:做防火牆標記
  • DNAT:目標地址轉換
  • SNAT:源地址轉換
  • MASQUERADE:地址偽裝
  • 自定義鏈
  • LOG:記錄日志

LOG:非中斷target,本身不拒絕和允許,放在拒絕和允許規則前並將日志記錄在/var/log/messages系統日志中

  • --log-level level:日志級別: emerg, alert, crit, error, warning, notice, info or debug
  • --log-prefix prefix:日志前綴,用於區別不同的日志,最多29個字符
[root@centos7 ~]# iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "new ssh connections"
[root@centos7 ~]# tail -f /var/log/messages
 

三、規則優化、保存與恢復

  1. 安全放行所有入站和出站的狀態為ESTABLISHED狀態連接
  2. 謹慎放行入站的新請求
  3. 有特殊目的限制訪問功能,要在放行規則之前加以拒絕
  4. 同類規則(訪問同一應用),匹配范圍小的放在前面,用於特殊處理
  5. 不同類的規則(訪問不同應用),匹配范圍大的放在前面
  6. 應該將那些可由一條規則能夠描述的多個規則合並為一條
  7. 設置默認策略,建議白名單(只放行特定連接) , 建議在規則的最后定義規則做為默認策略

保存規則:iptables-save > /PATH/TO/SOME_RULES_FILE

 

載入規則:iptables-restore < /PATH/FROM/SOME_RULES_FILE

 

-n, --noflush:不清除原有規則

-t, --test:僅分析生成規則集,但不提交

四、開放被動模式的ftp服務

1)裝載ftp連接追蹤的專用模塊:

[root@centos7 ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
[root@centos7 ~]# modprobe nf_conntrack_ftp

 

2)放行請求/響應報文

 

命令連接:NEW, ESTABLISHED
數據連接:RELATED, ESTABLISHED

 

[root@centos7 ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@centos7 ~]# iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
[root@centos7 ~]# iptables -A INPUT -j DROP
[root@centos7 ~]# iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@centos7 ~]# iptables -A OUTPUT -j DROP

 

 

五、NAT:network address translation

1、SNAT

請求報文的源地址轉換,讓本地網絡中的主機通過某一特定地址訪問外部網絡,實現地址偽裝

route:

# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p
# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j SNAT --to-source 10.0.0.254
 

動態轉換:

# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -d 192.168.0.0/24 -j MASQUERADE

 

2、DNAT

請求報文的目標地址轉換,把本地網絡中的主機上的某服務開放給外部網絡訪問,發布服務和端口映射,隱藏真實IP

route:

# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p
# iptables -t nat -A PREROUTING -d 10.0.0.254 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.6:80

 

3、PNAT

端口和IP都進行轉換

六、端口轉發

配置於NAT表的 PREROUTING OUTPUT 鏈,通過改變目標IP和端口,將接受的包轉發至不同端口

# iptables -t nat -A PREROUTING -d 192.168.0.6 -p tcp --dport 80 -j REDIRECT --to-ports 8080

 

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: