iptables

1、防火牆工做原理

Framework:iptables/netfilterhtml

Netfilter組件:擴展各類網絡服務的結構化底層框架,集成在linux內核中linux

內核中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而這五個hook function向用戶開放,用戶能夠經過一個命令工具(iptables或firewall-cmd、frewall-config)向其寫入規則算法

由信息過濾表(table)組成,包含控制IP包處理的規則集(rules),規則被分組放在鏈(chain)上vim

一、四表五鏈

四表:tablecentos

  • filter表:過濾規則表,根據預約義的規則過濾符合條件的數據包
  • nat表:network address translation 地址轉換規則表
  • mangle:修改數據標記位規則表
  • raw:關閉NAT表上啓用的鏈接跟蹤機制,加快封包穿越防火牆速度

五鏈:chain安全

  • PREROUTING網絡

  • INPUT
  • OUTPUT
  • FORWARD
  • POSTROUTING併發

表和鏈對應關係:框架

優先級由高到低的順序爲:raw --> mangle --> nat --> filterssh

二、內核中數據包的傳輸過程

  1. 當一個數據包進入網卡時,數據包首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否須要轉送出去
  2. 若是數據包就是進入本機的,數據包就會沿着圖向下移動,到達INPUT鏈。數據包到達INPUT鏈後,任何進程都會收到它。本機上運行的程序能夠發送數據包,這些數據包通過OUTPUT鏈,而後到達POSTROUTING鏈輸出
  3. 若是數據包是要轉發出去的,且內核容許轉發,數據包就會向右移動,通過FORWARD鏈,而後到達POSTROUTING鏈輸出

三、iptables規則

規則 rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動做做出處理

匹配條件:默認爲與條件,同時知足

  • 基本匹配:IP,Port,TCP的Flags(SYN,ACK等)
  • 擴展匹配:經過複雜高級功能匹配

處理動做:target

  • 內建處理動做:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...
  • 自定義處理動做:自定義chain,利用分類管理複雜情形

規則要添加在鏈上,才生效;添加在自定義上不會自動生效

鏈:chain

  • 內置鏈:每一個內置鏈對應於一個鉤子函數
  • 自定義鏈:用於對內置鏈進行擴展或補充,可實現更靈活的規則組織管理機制;只有Hook鉤子調用自定義鏈時才生效

2、iptables命令

用來編寫規則,寫好的規則被送往netfilter,告訴內核如何去處理信息包

用法:iptables [-t table] COMMAND chain 匹配條件 -j 處理動做

一、-t table :若是不寫默認filter表

  • filter
  • nat
  • mangle
  • raw

二、COMMAND

2.1) 管理規則

  • -A:附加一條規則,添加在鏈的尾部
  • -I CHAIN [num]:插入一條規則,插入爲對應鏈上的第num條,默認插入第一條
  • -D CHAIN [num]:刪除第num條規則
  • -R CHAIN [num]:替換第num條規則
  • -F [CHAIN]:清空指定規則鏈,若是省略CHAIN,則刪除對應表中的全部鏈
  • -Z:置零計數器

2.2)查看規則

  • -L:list, 列出指定鏈上的全部規則,本選項須置後
    • -n:numberic,以數字格式顯示地址和端口號
    • -v:verbose,詳細信息,-vv 更詳細
    • -x:exactly,顯示計數器結果的精確值,而非單位轉換後的易讀值
    • --line-numbers:顯示規則的序號
  • -S:以iptables-save 命令格式顯示鏈上規則

2.3)管理鏈

  • -N:自定義一條新的規則鏈
  • -X:刪除自定義的空的規則鏈
  • -P CHAIN {ACCEPT|DROP}:Policy,設置默認策略
  • -E:重命名自定義鏈;引用計數不爲0的自定義鏈不可以被重命名,也不能被刪除

三、chain

  • PREROUTING
  • INPUT
  • FORWARD
  • OUTPUT
  • POSTROUTING

四、匹配條件

匹配條件分爲通用匹配和擴展匹配,擴展匹配又分爲隱含擴展和顯式擴展

4.1)通用匹配:無需加載模塊,由iptables/netfilter自行提供

  • [!] -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

五、-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

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

  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:僅分析生成規則集,但不提交

4、開放被動模式的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

5、NAT:network address translation

一、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

二、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

三、PNAT

端口和IP都進行轉換

6、端口轉發

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

# iptables -t nat -A PREROUTING -d 192.168.0.6 -p tcp --dport 80 -j REDIRECT --to-ports 8080
相關文章
相關標籤/搜索