# 外修
(*是應該教過的)
* 路由器設定*
* 偽造 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用來處理封包的簡化過程,主要用綠色部分

> 來自 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
```
這個示範有點麻煩就不示範了
----
回去可以試試看下面的

{"description":"(*是應該教過的)","contributors":"[{\"id\":\"1e3c43ad-b554-43e4-a400-944283a02f86\",\"add\":6587,\"del\":2531}]","title":"外修+nftabls"}