Quantcast
Channel: 不自量力 の Weithenn
Viewing all articles
Browse latest Browse all 590

CentOS 6.8 基礎設定 (10) - 調整 IPTables 防火牆規則

$
0
0

前言

最近工作關係開始又要回味 CentOS 了,在本次實作環境中採用的是 CentOS-6.8-x86_64-minimal.iso 映像檔,也就是 CentOS 6.8 最小化安裝版本 (Minimal Install)。為何不用最新的 CentOS 6.9 版本? 因為,最新的 LIS 4.1.3-2 僅支援至 CentOS 6.8,所以便以 CentOS 6.8 版本開始回味起了,那麼開始來玩玩吧。💪



實作環境




IPTables 防火牆

在玩 IPTables以前我們必須先了解一下,您所下的 iptables 防火牆規則對封包進行過濾、封包處理、封包狀態變更、NAT、封包 Qos...等,這些工作其實是核心 (kernel) 層級 Netfilter 在處理的,而 iptables 只是一個使用者端的工具讓您方便對 Netfilter操作而以,以下是對於玩 iptables 時必須先了解的名詞及相關常用指令,以及 iptables 對於封包的處理流程詳細資訊可以參考原廠文件 RedHat - Security Guide 2.8.9 IPTables

圖片來源: RedHat - Security Guide 2.8.9 IPTables



Netfilter 五種封包處理規則

必須注意的是 INPUT 及 Forward 處理封包的路徑是不同的,也就是說 Forward 處理的封包會略過 INPUT 及 OUTPUT 規則。
  • INPUT: 經網卡進入的封包。
  • OUTPUT: 經網卡出去的封包。(請尊重 Weithenn 的辛勞!!)
  • FORWARD: 經網卡進入 / 出去轉送的封包。
  • PREROUTING: 改變經網卡進入的封包狀態 ( DNAT / REDIRECT )。
  • POSTROUTING: 改變經網卡出去的封包狀態 ( SNAT / MASQUERADE )。

Netfilter 三種過瀘規則鏈(chain)

  • filter: 可以處理 INPUT、OUTPUT、FORWARD 封包狀態 (Default)。
  • nat: 可以處理 OUTPUT、PREROUTING、POSTROUTING 封包狀態。
  • mangle: 可以處理 INPUT、OUTPUT、FORWRD、PREROUTING、POSTROUTING 封包狀態。

Netfilter 四種封包狀態(NEW、INVALID、RELATED、ESTABLISHED)

  • NEW: 一個新的連線封包 (建立新連線後的第一個封包)。
  • ESTABLISHED: 成功建立的連線,即建立追蹤連線後所有封包狀態 (跟在 NEW 封包後面的所有封包)。
  • RELATED: 新建連線,由 ESTABLISHED session 所建立的新獨立連線 (ex. ftp-data 連線)。
  • INVALID: 非法連線狀態的封包 (DROP 封包)。
  • UNKOWN: 不明連線狀態的封包。(請尊重 Weithenn 的辛勞!!)

IPTables 封包處理政策 (Policy) 及 目標 (Target)

  • ACCEPT: 允許封包移動至目的地或另一個 chain。
  • DROP: 丟棄封包、不回應要求、不傳送失敗訊息。
  • REJECT: 拒絕封包、回應要求、傳送失敗訊息。
  • SNAT: 修改 Source Socket。(請尊重 Weithenn 的辛勞!!)
  • DNAT: 修改 Destination Socket。
  • MASQUERADE: 動態修改 Source Socket (無法指定 IP,取當時網卡的 IP),較方便但效率較差。
  • REDIRECT: 將連線導至本機行程 (Local Process)。
  • RETURN: 結束自行定義的 Chain 然後返回原來的 Chain 繼續跑規則 (rules)。
  • QUEUE: 封包排隊等待處理。
  • LOG: 記錄指定的規則封包 (/etc/syslog.conf , default /var/log/messges)。

IPTables 指令參數

處理 iptables 規則時常用到如下參數:
  • -h:help information。
  • -V:顯示 iptables 版本。
  • -I:將規則插入至最前面 or 加上號碼插入指定處。
  • -A:將規則插入至最後面。
  • -R:取代指定的規則 (加上規則號碼)。
  • -D:刪除指定的規則 (加上規則號碼)。
  • -F:刪除所有的規則。(請尊重 Weithenn 的辛勞!!)

處理 iptables 規則鏈(chain)時常用到如下參數
  • -N:建立新的規則鏈(chain)。
  • -X:刪除指定的規則鏈(chain)。
  • -E:更改指定的規則鏈(chain)名稱。
  • -P:變更指定規則鏈(chain)的政策 (ex. policy for DROP、REJECT、ACCEPT)。
  • -Z:將 iptables 計數器歸零。

查看目前 iptables 規則時常用到如下參數
  • -L:列出目前 iptables 規則 (會執行 DNS 位址解析)。
  • -n:不使用 DNS 解析直接以 IP 位址顯示。
  • -v:顯示目前 iptables 規則處理的封包數。(請尊重 Weithenn 的辛勞!!)
  • -x:顯示完整封包數 (例如,顯示 1151519,而不是 12M)。

IPTables 設定檔語法

iptables 主要設定檔位於 /etc/sysconfig/iptables 當系統重開機且設定開機自動啟動時,系統便會讀取此檔案並套用設定的防火牆規則,你可以把預設的防火牆規則拿來該改即可,你可以手動下 iptables 規則然後在 save 我個人的習慣是直接把規則寫在 /etc/sysconfig/iptables 內,規則語法如下:
 [-io 網路介面] [-p 協定] [-m 模組] [-s 來源] [-d 目的地] [-j 政策]
  • -i 網路介面: -i 為 in 網路介面就填 eth0... (用於 PREROUTING、INPUT、FORWARD)
  • -o 網路介面: -o 為 out 網路介面就填 eth0... (用於 POSTROUTING、OUTPUT、FORWARD)
  • -m 模組: state、mac、limit、owner、multiport...
  • -p 協定: tcp、upd、icmp...(請尊重 Weithenn 的辛勞!!)
  • -s 來源: 可為 IP Address、IP 網段、網域名稱
  • --sport: 指定封包來源 Port、Port Range (配合 -p tcp、-p udp)
  • -d 目的地: 可為 IP、IP 網段、網域名稱
  • --dport: 指定封包目的地 Port、Port Range (配合 -p tcp、-p udp)
  • -j 政策 / 目標: ACCEPT、DROP、REJECT、SNAT、DNAT、MASQUERADE、REDIRECT、RETURN...

預設情況下安裝好 CentOS 便會啟動 IPTtable 防火牆功能,並且只允許 SSH 服務 (Port 22) 可以通過,所以我們可以將此檔案備份後直接進行修改來開啟需要允許的 Port 號及協定 Protocol,或者在圖形介面中也可以透過 「system-config-firewall」 叫出圖形介面進行設定也可。
cat /etc/sysconfig/iptables
  *filter
  :INPUT ACCEPT [0:0]
  :FORWARD ACCEPT [0:0]
  :OUTPUT ACCEPT [0:0]
  -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  -A INPUT -p icmp -j ACCEPT
  -A INPUT -i lo -j ACCEPT
  -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
  -A INPUT -j REJECT --reject-with icmp-host-prohibited
  -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  COMMIT


確定 iptables 服務是否開機會自動啟動 (ntsysv or setup)。
chkconfig iptables --list
  iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off

Viewing all articles
Browse latest Browse all 590

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>