# 外修 (*是應該教過的) * 路由器設定* * 偽造 MAC * 網路線跳線(模擬牆內斷線)* * 交換器安裝* * 怎麼查 DVO 到交換器* * 其他提問 --- # 額外內容 # nftables * 測試環境 * 連線測試 * nftables介紹 * nftables操作 --- ## 測試環境安裝 用rocky linux 以下皆是在管理員模式(su) ---- ### python 為了測試HTTP協議 ``` bash dnf install python3 -y dnf install python3-pip -y ``` 確認安裝 ``` bash python -V pip -V ``` 安裝flask ``` bash pip install flask ``` ---- ### SSH server ``` bash dnf install openssh-server -y systemctl start sshd #啟用ssh-server systemctl status sshd #確認開啟 ``` 如果要開機啟動 ``` bash system enbale sshd ``` --- ## 連線測試 ---- 1. 用nmclic或ip addr查看ip 2. ping 虛擬機 3. 主機ssh連接虛擬機 如果想要手動設定ip ```bash nmcli con mod <介面卡> ipv4.addresses <ip><遮罩> nmcli con mod <介面卡> ipv4.mothod manual #設為手動 nmcli con up <介面卡> #重新啟動介面卡 ``` ---- 建一個.py檔案放 ``` python from flask import Flask app = Flask(__name__) # 初始化 Flask 應用 # 定義一個路由 "/" @app.route("/") def hello_world(): return "Hello World" # 回傳 "Hello World" # 啟動 Flask 伺服器 if __name__ == "__main__": app.run(host="0.0.0.0",port = 5000) ``` 測試前先將防火牆換成空的 ``` bash sudo systemctl stop firewalld sudo systemctl disable firewalld #關掉原本的 sudo systemctl enable nftables sudo systemctl start nftables ``` ---- 啟動網站 ``` bash python <file name> ``` 可以直接用瀏覽器查看 或用 ``` bash curl <開啟的網址> ``` --- ## nftables介紹 基礎防火牆 nftables是建在netfilter上 netfilter是在linux核心的一部分 用來處理封包 ---- netfilter用來處理封包的簡化過程,主要用綠色部分 ![cyber_test_lab1](https://hackmd.io/_uploads/Syq8vGSHJg.png) > 來自 https://blog.rachelt.one/articles/new-to-nftables-from-config-to-dnat/ ---- nft的結構是 table->chain->rule table(表)是用來區分不同功能的 chain是根據不同hook(鉤子) 也就是不同階段來決定要執行的rule rule會根據條件對封包進行不同的處理 --- ## nftables操作 ---- 在/etc建立nftables.conf 打開輸入 ``` table ip filter{ chain input{ type filter hook input priority 0;policy accept; #其他規則 } } ``` table ip filter宣告一個table,ip表示只適用ipv4,filter是table名字 chain input宣告一個chain叫做input ---- ``` type filter hook input priority 0;policy accept; type <type> hook <hook_name> priority <priority>; policy <policy>; ``` type filter 這個chain是filter類型 hook input 在進入主機階段 priority 優先度,數字越小越優先,可以負值 policy 預設行為 這裡為求方便採用預設允許,通常採預設拒絕比較安全 ---- 保存退出後 ``` nft -c -f /etc/nftables.conf #測試,沒錯什麼都不會出現 nft -f /etc/nftables.conf #載入這個文件 ``` 有更改就要重新啟動 ``` bash systemctl restart nftables #或用 nft flush ruleset nft -f /etc/nftables.conf ``` 查看現有規則 ``` nft list ruleset ``` ---- ### 特定port ``` <協議> dport/sport <port> <動作> ``` dport是目標port的意思 sport是來源port的意思 比如阻止http(80port) ``` tcp dport 80 drop #也可以多個port tcp dport {80,81} drop ``` 但開啟我們前面的網站的話會發現一樣可以 這是因為我們開啟在5000port 可以改成封鎖5000看看 ---- 動作可以用accept(允許)、reject(拒絕)、drop(丟棄) 拒絕會回傳訊息 丟棄則不會 ---- ### 紀錄 ``` log prefix "<訊息>" ``` 可以將封包資訊記錄到系統日誌 prefix可以添加前綴,幫助了解訊息 通常記錄在 /var/log/messages 或 /var/log/syslog 可以直接使用 ``` log prefix "Dropped: " drop #記錄所有的丟棄封包訊息 ``` 或跟在條件後面 ```bash tcp sport 5000 log prefix "Blocked 5000: " drop #記錄來源是5000port的封包資訊 ``` ---- ### IP(段) ``` ip saddr/daddr <ip> <動作> ``` saddr來源 daddr目標 ip段 ``` ip saddr/daddr <ip><遮罩> <動作> #比如ip saddr/daddr 192.168.0.0/24 drop #封鎖192.168.0.0/24的所有ip ``` ---- ### 介面 根據介面卡對封包處理 ``` iifname "<介面卡名稱>" #例 iifname "ens160" tcp dport 80 drop #將多個條件結合 #對ens160接口,目標80port的封包封鎖 ``` ---- ### 流量限制 ``` limit rate 10/second accept #每秒只允許10個府和條件的封包通過 ``` ### 協議 ``` ip protocol <協議> <動作> #ip protocol icmp drop #丟棄所有icmp封包 ``` 在 **"封包"** 開頭會有一段代表協議的資訊稱為協議號 這個語法是透過協議號判斷 所以只能判斷使用ip協議的上層協議 ---- ### 特徵 前面提到要封鎖HTTP可以將80port丟棄 但無法阻止更改過port的HTTP 想解決這個問題可以透過HTTP的特徵判斷 比如GET、POST ``` tcp payload @0:40 { "GET", "POST" } drop ``` payload 對封包內容判斷 @0:40 前40bit 也就是tcp封包前40bit如果有GET、POST字串就丟棄 ---- 也可以引入 DPI(深度封包檢測)、 IDS(入侵偵測系統)、 IPS(入侵防禦系統) 更方便阻止 ---- ### NAT 要使用nat需要開啟linux的網路轉發功能 ``` bash sysctl -w net.ipv4.ip_forward=1 #臨時開啟 ``` 如果想要永久開啟,將/etc/sysctl.conf寫入 ``` bash net.ipv4.ip_forward = 1 ``` 保存退出後 ``` bash sysctl -p ``` ---- 使用prerouting chain ``` tcp dport 5000 dnat to 192.168.0.2:5000 #將5000port轉成192.168.0.2的5000port ``` 這個示範有點麻煩就不示範了 ---- 回去可以試試看下面的 ![net](https://hackmd.io/_uploads/ryF1H5SHJx.png)
{"description":"(*是應該教過的)","contributors":"[{\"id\":\"1e3c43ad-b554-43e4-a400-944283a02f86\",\"add\":6587,\"del\":2531}]","title":"外修+nftabls"}
    126 views