EtherGuard-VPN/example_config/static_mode/README_zh.md
2021-12-05 22:02:49 +00:00

11 KiB
Raw Blame History

Etherguard

English

Static Mode的範例配置檔的說明文件

Static Mode

沒有自動選路,沒有握手伺服器

十分類似原本的wireguard一切都要提前配置好

但是除了peer以外還要額外配置轉發表所有人共用一份轉發表

設定檔裡面的nexthoptable部分,只有此模式會生效

這個模式下不存在任何的Control Message斷線偵測甚麼的也不會有
請務必保持提前定義好的拓樸。不然如果存在中轉,中轉節點斷了,部分連線就會中斷

這份範例配置檔的網路拓樸如圖所示

"Topology"

發出封包時會設定起始ID=自己的Node ID終點ID則是看Dst Mac Address。
如果Dst MacAddr是廣播地址或是不在自己的對應表裡面就會設定終點=Boardcast

收到封包的時候,如果dst==自己ID,就會收下,不轉給任何人。
同時還會看它的 Src Mac Address 和 Src NodeID ,並加入對應表
這樣下次傳給他就可以直接傳給目標,而不用廣播給全節點了

所以設定檔中的轉發表如下表。格式是yaml的巢狀dictionary
轉發/發送封包時,直接查詢 NhTable[起點][終點]=下一跳
就知道下面一個封包要轉給誰了

nexthoptable:
  1:
    2: 2
    3: 2
    4: 2
    5: 2
    6: 2
  2:
    1: 1
    3: 3
    4: 4
    5: 3
    6: 4
  3:
    1: 2
    2: 2
    4: 4
    5: 5
    6: 4
  4:
    1: 2
    2: 2
    3: 3
    5: 3
    6: 6
  5:
    1: 3
    2: 3
    3: 3
    4: 3
    6: 3
  6:
    1: 4
    2: 4
    3: 4
    4: 4
    5: 4

Boardcast

比較特別的是終點ID=Boardcast的情況。

假設今天的狀況:我是4號我收到起點ID = 1終點ID=boardcast的封包
我應該只轉給6號就好而不會轉給3號。
因為3號會收到來自2號的封包自己就不用重複遞送了

因此我有設計,如果終點ID = Boardcast就會檢查Src到自己的所有鄰居會不會經過自己
1 -> 6 會經過自己: [1 2 4 6]
1 -> 3 不會: [1 2 3]
2號是封包來源跳過檢查
就能知道我應該把封包轉送給6號而不轉送給3號

小工具

如果懶的手算轉發表,本工具也能幫你算算

請先準備好一個txt檔就叫他path.txt吧
標記任2節點之間的單向延遲。Inf代表不可直連

X 1   2   3   4   5   6
1 0   0.5 Inf Inf Inf Inf
2 0.5 0   0.5 0.5 Inf Inf
3 Inf 0.5 0   0.5 0.5 Inf
4 Inf 0.5 0.5 0   Inf 0.5
5 Inf Inf 0.5 Inf 0   Inf
6 Inf Inf Inf 0.5 Inf 0

之後用這個指令就能輸出用Floyd Warshall算好的轉發表了填入設定檔即可

./etherguard-go -config example_config/static_mode/path.txt -mode slove

NextHopTable:
  1:
    2: 2
    3: 2
    4: 2
    5: 2
    6: 2
  2:
    1: 1
    3: 3
    4: 4
    5: 3
    6: 4
  3:
    1: 2
    2: 2
    4: 4
    5: 5
    6: 4
  4:
    1: 2
    2: 2
    3: 3
    5: 3
    6: 6
  5:
    1: 3
    2: 3
    3: 3
    4: 3
    6: 3
  6:
    1: 4
    2: 4
    3: 4
    4: 4
    5: 4

程式還會額外輸出一些資訊,像是路徑表。
會標示所有的起點終點組合的封包路徑,還有行經距離

Human readable:
src     dist            path
1 -> 2  0.500000        [1 2]
1 -> 3  1.000000        [1 2 3]
1 -> 4  1.000000        [1 2 4]
1 -> 5  1.500000        [1 2 3 5]
1 -> 6  1.500000        [1 2 4 6]
2 -> 1  0.500000        [2 1]
2 -> 3  0.500000        [2 3]
2 -> 4  0.500000        [2 4]
2 -> 5  1.000000        [2 3 5]
2 -> 6  1.000000        [2 4 6]
3 -> 1  1.000000        [3 2 1]
3 -> 2  0.500000        [3 2]
3 -> 4  0.500000        [3 4]
3 -> 5  0.500000        [3 5]
3 -> 6  1.000000        [3 4 6]
4 -> 1  1.000000        [4 2 1]
4 -> 2  0.500000        [4 2]
4 -> 3  0.500000        [4 3]
4 -> 5  1.000000        [4 3 5]
4 -> 6  0.500000        [4 6]
5 -> 1  1.500000        [5 3 2 1]
5 -> 2  1.000000        [5 3 2]
5 -> 3  0.500000        [5 3]
5 -> 4  1.000000        [5 3 4]
5 -> 6  1.500000        [5 3 4 6]
6 -> 1  1.500000        [6 4 2 1]
6 -> 2  1.000000        [6 4 2]
6 -> 3  1.000000        [6 4 3]
6 -> 4  0.500000        [6 4]
6 -> 5  1.500000        [6 4 3 5]

有些設定檔對應某些運作模式,這邊針對共同部分的設定做說明

Edge config

  1. interface
    1. itype: 裝置類型意味著從VPN網路收到的封包要丟去哪個硬體
      1. dummy: 收到的封包直接丟棄,也不發出任何封包。作為中繼節點使用
      2. stdio: 收到的封包丟stdoutstdin進來的資料丟入vpn網路
        需要參數: macaddrprefix,l2headermode
      3. udpsock: 把VPN網路收到的layer2封包讀寫去一個udp socket.
        Paramaters: recvaddr,sendaddr
      4. tcpsock: 把VPN網路收到的layer2封包讀寫去一個tcp socket.
        Paramaters: recvaddr,sendaddr
      5. unixsock: 把VPN網路收到的layer2封包讀寫去一個unix socket(SOCK_STREAM 模式).
        Paramaters: recvaddr,sendaddr
      6. unixgramsock: 把VPN網路收到的layer2封包讀寫去一個unix socket(SOCK_DGRAM 模式).
        Paramaters: recvaddr,sendaddr
      7. unixpacketsock: 把VPN網路收到的layer2封包讀寫去一個unix socket(SOCK_SEQPACKET 模式).
        Paramaters: recvaddr,sendaddr
      8. fd: 把VPN網路收到的layer2封包讀寫去一個特定的file descriptor.
        Paramaters: 無. 但是使用環境變數 EG_FD_RXEG_FD_TX 來指定
      9. vpp: 使用libmemif使vpp加入VPN網路
        需要參數: name,vppifaceid,vppbridgeid,macaddrprefix,mtu
      10. tap: Linux的tap設備。讓linux加入VPN網路
        需要參數: name,macaddrprefix,mtu
    2. name : 裝置名稱
    3. vppifaceid: VPP 的 interface ID。一個VPP runtime內不能重複
    4. vppbridgeid: VPP 的網橋ID。不使用VPP網橋功能的話填0
    5. macaddrprefix: MAC地址前綴。真正的 MAC 地址=[前綴]:[NodeID]。
      如果這邊填了完整6格長度就忽略NodeID
    6. recvaddr: 僅限XXXsock生效。listen地址收到的東西丟去 VPN 網路
    7. sendaddr: 僅限XXXsock生效。連線地址VPN網路收到的東西丟去這個地址
    8. l2headermode: 僅限 stdio 生效。debug用途有三種模式:
      1. nochg: 從 VPN 網路收到什麼就往tap裝置發送什麼。不對封包作任何更動
      2. kbdbg: 鍵盤bebug模式。搭配 stdio 模式,讓我 debug 用
        因為前 12 byte 會用來做選路判斷但是只是要debug構造完整的封包就不是很方便
        這個模式下如果輸入b2content就會幫你把b轉換成FF:FF:FF:FF:FF:FF 2 轉換成 AA:BB:CC:DD:EE:02 。封包內容變成 b"0xffffffffffffaabbccddee02content"。 用鍵盤就能輕鬆產生L2 header查看選路的行為
      3. noL2: 拔掉L2 Header的模式。
        但是本VPN會查詢L2用作選路所以會變成一律廣播
  2. nodeid: 節點ID。節點之間辨識身分用的同一網路內節點ID不能重複
  3. postscript: etherguard初始化完畢之後要跑的腳本.
  4. nodename: 節點名稱
  5. defaultttl: 預設ttl(etherguard層使用和乙太層不共通)
  6. l2fibtimeout: MacAddr-> NodeID 查找表的 timeout(秒)
  7. privkey: 私鑰和wireguard規格一樣
  8. listenport: 監聽的udp埠
  9. loglevel: 紀錄log
    1. loglevel: wireguard原本的log紀錄器的loglevel。
      debug,error,slient三種程度
    2. logtransit: 轉送封包,也就是起點/終點都不是自己的封包的log
    3. logcontrol: Control Message的log
    4. lognormal: 收發普通封包起點是自己or終點是自己的log
    5. logntp: NTP 同步時鐘相關的log
  10. dynamicroute: 動態路由相關的設定。時間類設定單位都是秒
    1. sendpinginterval: 發送Ping訊息的間隔
    2. dupchecktimeout: 重複封包檢查的timeout。完全相同的封包收第二次會被丟棄
    3. peeralivetimeout: 每次收到封包就重置超過時間沒收到就標記該peer離線
    4. conntimeout: 檢查peer離線的間格如果標記離線就切換下一個endpoint(supernode可能傳了多個endpoint過來)
    5. savenewpeers: 是否把下載來的鄰居資訊存到本地設定檔裡面
    6. supernode: 參見Super模式
    7. p2p 參見 P2P模式
    8. ntpconfig: NTP 相關的設定
      1. usentp: 是否使用ntp同步時鐘
      2. maxserveruse: 一次對多連線幾個NTP伺服器
        第一次會全部連一遍測延遲之後每次都取延遲前n低的來用
      3. synctimeinterval: 多久同步一次
      4. ntptimeout: 多久算是超時
      5. servers: NTP伺服器列表
  11. nexthoptable: 轉發表。只有Static模式會用到參見 Static模式
  12. resetconninterval: 如果對方是動態ip就要用這個。每隔一段時間就會重新解析domain。
  13. peers: 和wireguard一樣的peer資訊
    1. nodeid: 對方的節點ID
    2. pubkey: 對方的公鑰
    3. pskey: 對方的預共享金鑰。但是目前沒用(因為不能設定自己的),之後會加
    4. endpoint: 對方的連線地址。如果roaming會覆寫設定檔
    5. static: 設定成true的話每隔resetconninterval秒就會重新解析一次domain與此同時也不會被roaming覆寫

Super config

參見 example_config/super_mode/README_zh.md

Quick start

Run example config

不同terminal分別執行以下命令

./etherguard-go -config example_config/super_mode/n1.yaml -mode edge
./etherguard-go -config example_config/super_mode/n2.yaml -mode edge
./etherguard-go -config example_config/super_mode/n3.yaml -mode edge
./etherguard-go -config example_config/super_mode/n4.yaml -mode edge
./etherguard-go -config example_config/super_mode/n5.yaml -mode edge
./etherguard-go -config example_config/super_mode/n6.yaml -mode edge

因為本範例配置是stdio的kbdbg模式stdin會讀入VPN網路
請在其中一個edge視窗中鍵入

b1message

因為l2headermodekbdbg所以b1會被轉換成 12byte 的layer 2 headerb是廣播地址FF:FF:FF:FF:FF:FF1是普通地址AA:BB:CC:DD:EE:01message是後面的payload然後再丟入VPN
此時應該要能夠在另一個視窗上看見字串b1message。前12byte被轉換回來了

Run your own etherguard

要正式使用請將itype改成tap,並且修改各節點的公鑰私鑰和連線地址 再關閉不必要的log增加性能最後部屬到不同節點即可

下一篇: Super Mode的運作