月份: 2019 年 12 月

網址的免費申請:no-ip

No Comments

興奮的時刻到來。此前,我們必須使用 http://localhost/ 來開啟我們的網頁。現在我們想要透過網際網路的方式來開啟,就必須擁有一個於自己的 hostname,例如 https://waterfalls.ddns.net。既然架站到目前為止,都沒花半毛錢,我們若有免費的網址可用,可說完美極了。真的有耶:no-ip.com 提供這樣的服務。還有別忘了,我們只是使用電信公司寬頻撥接的一般庶民小老百姓,用的是浮動 IP;no-ip 也提供浮動 IP 的貼心解決方案。

申請及套用的步驟很簡單。筆者當前使用的網址是當初隨便取的也準備註銷重新申請一個並截圖做申請說明。

取得了網址例如 abc.ddns.net 之後。我們的 IP 之所以浮動,是因為電腦網路設備重啟/電信維護與策略等,會因而變動。故 no-ip 提供了客戶端/即本地端的一個應用程式,會在我們的電腦重新開機後做一次 renew 的動作,例如新 ip 是 123.456.78.9,應用程式便將我們當前的這支 ip address 發送給 no-ip 的廣域名稱伺服器端做 abc.ddns.net <–> 123.456.78.9 的對應的更新。如稍前提到,電信公司突然換了一組新 ip 給我們(發生機率低(所以才叫浮動)),只要重啟該應用程式就可再度連上我們的網站。

Ubuntu apt source list 沒有提供這支應用程式,但 snap 有。

  • 安裝 no-ip client application
  • snap install noip-client
  • 安裝完,接著設定我們取得的網址。往後若有異動 hostname 也一樣執行它來設定:
  • sudo noip-client.configure
  • 欲重啟,更新 ip address:
  • sudo systemctl restart snap.noip-client.launcher.service
申請新帳號,點擊 Sign Up
接著進入建立個人資料畫面,電郵位址,密碼為必填,其他選填的若欲先不填,勾選即成。網域名稱可自選(筆者選 ddns.net)。似乎先不填進入主畫有更多名稱可選。子網域也就是由您自己命名的。如筆者用的是 waterfalls。所以筆者的 hostname 便是 waterfalls.ddns.net。另外也有付費的漂亮順眼易記的(子)網域名稱可供使用者選擇。
接著點擊付費(有延伸)或免費(只有基本)的功能,筆者選免費的。點擊後,系統會發送電郵給您,請進信箱收件做認證確認。
直接點擊確認,便能啟用您的帳號了
會跳出網頁說您的帳號已啟用,接著,
點擊 My Account 進入您的帳號管理畫面
在這邊,免費版提供總共三個 hostname 給您使用。並且可以選擇不同性質的 hostname。筆者已用掉一個,現在欲再建立一個,DNS 別名,做為實驗用。
筆者的點選如圖示,意思是說,wearbiz 這個別名,將導向到另一個 Target hostname ,即 waterfalls.ddns.net。若您三個都未建立,則 Record Type 應該先選擇 DNS Host (A)
建立結束後回主畫會列出您已使用的 DNS record。就醬,沒事登出。
noip-client app 的安裝與設定,官方名稱是 DUC。請記得每三十天內要收官方寄來的郵件,做確認持續使用的回覆。沒回覆逾期的話,hostname 就會被停用/移除。付費版就不需要這一步。設定完成後,請記得重啟 DynamicUpdateClient。
  • 最後,測試:
  • 開啟網頁 http://ifconfig.co/
  • 會秀出您的 ip address
  • 再聘您的網址 ping waterfalls.ddns.net
  • 這二者的 ip address 會是相同的。或者若聘不到的話,試試重啟 DUC 再聘看看。

補充:
使用 router 內建 ddns 自動更新 hostname/ip
How to Configure DDNS (Dynamic DNS) in a Router(NOIP)

另外還有一點,當對映使用浮動實體 ip 時,每當 reboot 後,可能會導致 dns/ip 映射失效(此例發生在我的數據機同時提供一個固定 ip 及數個浮動 ip),或是有失敗機率。故可另外生成一支 system service,在每次開機後執行 noip-service 的 restart。
範例如下:

[Unit]
    Description=restart noip-service in case of fault after reboot
    After=snap.noip-client.launcher.service systemd-networkd-wait-online.service
    Wants=systemd-networkd-wait-online.service
[Service]
    Type=idle
    ExecStartPre=/bin/sleep 5
    ExecStart=/bin/systemctl restart snap.noip-client.launcher.service
[Install]
    WantedBy=multi-user.target
  • 參考資料
  • http://linux.vbird.org/linux_server/0350dns.php
  • https://www.linuxquestions.org/questions/linux-networking-3/no-ip-dns-updater-iptables-rules-757074/
  • https://github.com/mkg20001/noip-client-snap
  • https://gist.github.com/NathanGiesbrecht

20230516 更新

接下來來玩一點進階的。
(補註:sudo snap run noip-client.configure,事實上執行下它已有讓指定哪張 nic 的選項了,不過僅此尚不能做到自訂個別的對應)
假設,我有一台主機有 4 個 Gbps 網孔,又 isp 可提供數個對外的浮動 ip,那麼便有欲望想要 4 個網孔全用上,並且四個都是各異的實體/公開浮動 ip,且都將是具有對外公開的不同的 hostname/網址。那表示我將會有 4 個獨立的網站;即,我對這幾個網站查 ip 時,不會發現它們全是同一個 ip address(因為真的就是相異 ips);否則便輕易被人查覺此幾個網站都來自同一台主機。
先說,要達成此功能,當前非筆者能力所及,即,最後關卡會出現在 routing tables;且由於 ip 是浮動的,所以當前對筆者無解且也到此為止。(所以封包因為有共存的不同的 ip/相同 routing table,所以很難走出去,輕則網路卡卡重則完全不會動)
1. bond mode:採取 bond mode,造成 ssh 進入後便嚴重卡頓。不過另提若在同一網域下是 ok 的例如 192.168.1.x。則 bond mode 可以使用,但效果應沒優於非 bond mode。部份設定如下,

  ethernets:
    enp3s0:
      dhcp4: false
      dhcp6: false
    enp5s0:
      dhcp4: false
      dhcp6: false
# note: need to add a line "bonding" in /etc/modules
  bonds:
    bond0:
      macaddress: xx:xx:xx:xx:xx:xx
      interfaces:
        - enp3s0
        - enp5s0
      dhcp4: true
      dhcp6: true
      mtu: 9000
      parameters:
        mode: 802.3ad
        lacp-rate: fast

後續會引入有聚合功能的 switch 來玩玩看(又有初坑,如下***),看能不能無痛成功。
2. 接著就是感興趣的話題了,如何在同一台主機上,使用 noip utility 去實現數支不同的 public ips 的不同的網址對應。
前期,筆者想到使用在自訂的 network namespace 下,只納入數個不同 nics 中的其中一個,則在此下執行 noip 便可使 noip 只看到這張 nic,從而如預期的做了 hostname-ip 的對應。
而失敗的原因是,也沒失敗,而是最後才發現,noip-util 會認網卡,即,當初 configuring 時,會已記錄哪張 nic 的 public ip,這意謂著此 namespace 算多此一舉了因為,
很簡單地,我們只要在 configuring 時,將其它網路卡都 shutdown 掉,則當然 noip 只認那張能用的網卡了。
因此,能用的 namespace service 如附,請自行研究。
3. 接下來來看兩行指令,路徑非絕對可自行變通。
其中主程式如前半段路徑,組態如後半段。

/snap/noip-client/4/bin/noip2 -C -c /var/snap/noip-client/4/noip2-kenwoo.conf

/snap/noip-client/4/bin/noip2 -M -c /var/snap/noip-client/4/noip2-kenwoo.conf

第一行是 configuring,即設定 email/password 及 hostname。此時,必須確保只有一張網卡 if up。
第二行是執行對應,原本沒有 -M 選項,但原先已有 snap 的版本已常駐在跑,即,原先的 active service 都不用去動它。而前面有提過 refresh 的 service,我們可以偷懶地把第二行加入到那支 service 內。請自行新建組態檔/可先查詢該目錄下。
因為有第二份 noip util 要跑,所以要加入 -M(ultiple) 選項。
大概就醬了。
總之,可如所預期,可以 ping 成功不同 hostnames/ip-addresses,但就是網路卡頓或不動。待解。。。
。。。(補充)後來才又知道。。。/etc/sysctl.conf,uncomment ip forwarding,再重啟以 sysctl net.ipv4.ip_forward 查詢 ip forward 是否成功啟用。。。這設定是必要的。。。

(補充)最後屢經數十次的嘗試,應只有一顯而易見的結論(當前認知,不見得對,基於有 dhcp 的前題下):routing table 即便依不同 nic 同時加了數個 default route;即便進來可能可以順利;即便出去可由不同的 nic 實體路徑,但出去總是會先經由設定在某特定 nic 的 default route entry/優先序最高者,因而無法正確對應。當然另一個可能是筆者對 routing table 認知還很初階。。。
因此想要進得來也走得出去,接著,
只能再尋求前述 namespace 是否可以得解(相互隔離的 routing table)。又或是在 dhcp 給定網路參數後再 sh 去追加 routing table。
可能後者比較算是正解。若成功,下面會再更新。
(更新)
問題主要關聯於出去的時候。
參考這篇的做法,手動嘗試下,公開 ip 共存的問題是可以解決的。
https://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.rpdb.multiple-links.html
並且,預設的路由,可以做到某程度的 load balance。
回到最原始的問題,在 ip 順利共存的前題下,noip configure 即便讓選擇了某 nic,但它實際在做對應時(結果論)仍依 kernel 當下由哪一張 nic 出去/又或已記錄哪個 ip 是可通的,即會選擇它;即,ip 的被取決非唯一。
因此讓 noip utility 附屬在 namespace 下應不得不為之。且又埋了一個疑慮;nic 移入移出時是否會造成網路參數又重設。那等於沒做。
該把問題說盡;因此,在實作 namespace/service/shell-script/network-parameter retrieval for noip-utility,就有相當的難度及潛在問題,再來,noip-utility 預設就是常駐的 service,當 dhcp renew ip 時,它會即時跟著更新嗎?那我們實作的所搭配者又如何?
結論是愈挖難度愈高。。。
事實上讀者已一頭霧水了,容筆者一言以蔽之/提出求助於此問題:在同一台主機上,在不使用 vm or docker 的前題下,我已有 fixed public ip 用於商業網站,那麼如何共存一(數)個筆者的個人網站用的是 floating public ip,且配有 ddns.net 所提供的 hostname?即便 reboot or dhcp renew 都運作得妥妥當當不用人介入的?
為求有一個快速的參考,我將上述連結文章重點貼於下,

# enable ip forward
# add tables in /etc/iproute2/rt_tables
# $IF1 the name of the first interface
# $IP1 the IP address associated with $IF1
# $P1 the IP address of the gateway at Provider 1
# $P1_NET the IP network $P1 is in


ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2

ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2

ip route add default via $P1 (or use alternative load-balance designated with *)

ip rule add from $IP1 table T1
ip rule add from $IP2 table T2

# if exists local network by $P0_NET & $IF0, the following lines should be added.
ip route add $P0_NET dev $IF0 table T1
ip route add $P2_NET dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo table T1
ip route add $P0_NET dev $IF0 table T2
ip route add $P1_NET dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo table T2

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1 (*)
***
netgear gs108t v2 網管型網路交換機

0a. 欲連上 gs108tv2 之 web 管理平台:
0b. 若當前只有一台電腦連接,按照步驟 1。若至少一台電腦及一台路由器連接,則按照步驟 2。
0c. 以下操作都是在 linux 平台上之觀點,其他平台類推。
0d. 因為 gs108tv2 無內建 dhcp server 乃或模擬的 dhcp 配發封包,所以單純接上一條網路線,是無法與它建立連線的,
      且依本人當前認知其使用手冊內並未提及此點;使用者插上網路線便直接存取 http://192.168.0.239/ 是行不通的。

1a. 首次安裝,若只有一台電腦網路線/client,如下操作。
1b. client 電腦上,取消 linux 的網路管理 daemon,例如 NetworkManager,改由 networkd。
1c. 若網卡為 enp1s0,netplan 設定如下,
network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      optional: true
      dhcp4: false
      dhcp6: false
1d. 以 sudoer 執行以下命令:
1e. ip addr add 192.168.0.238 dev enp1s0
1f. ip route add 192.168.0.128/25 src 192.168.0.238 dev enp1s0
1g. (除非結果連不上,否則應略過此行 ip route add default via 192.168.0.239)(本行刪除)
1g. (除非結果連不上,否則可略過此行 ip route add default via 192.168.0.254)
1h. web browser 上輸入前往網址 http://192.168.0.239/ 即成,密碼 password。
1i. 註,此步驟下,linux 版本的 gs108tv2 switch discovery utility 應是無效用的,毌使用之。

2a. 首次安裝,連接方式必須一進(路由器含 dhcp server)一出(client 電腦)兩條網路線。
2b. dhcp server 會配發 gs108tv2 及 client 二者 ip,二者始能連線,
      其中 gs108tv2 之 ip,請注意不再是 192.168.0.239,
      而是從路由器之管理平台中之連線狀態查找其 MAC addr 所配對之 ip。假設是 192.168.100.20.
2c. web browser 上輸入前往網址 http://192.168.100.20/ 即成,密碼 password。


****
此 device 的 LACP 設定可參考手冊或以下這篇,
http://club.ntgrchina.cn/Knowledgebase/Document_detail.aspx?Did=222
簡單講,設定邏輯就是先建立一群組,相關選項都 enable 並選擇 static/LACP 之 LACP,接著進階選項將 ports 加入群組。
PC 端就是啟用 bonding;可觀察到 syslog 不再有先前未使用 LACP-switch 時的錯誤訊息。
目前已知在同一網段下沒有問題,好像有提及須在同一網段下,故異網段會再測試看看能不能用(*****)。
而是否聚合成功的測試,只要分別把其一的網路線拔掉看傳輸有沒有中斷便可得知。


*****
未查證,因 switch 作用在 OSI 第二層,所以應沒有網段的問題。應只是 LACP 要求各介面都支援相同的 protocol。
LACP 應屬於一種中介,所以雙端都必須支援 lacp,並且此中介外延的邏輯兩端也各是一個 bond(nic),
所以是筆者妄想錯了。即便從路由器過來的多網孔要 bonding,那麼它本身就必須具備支援 LACP 了。
所以說從 ISP 那(或某路由)過來,即便串接此 lacp-switch,也只配發一個 ip 給此 bonding( ports);
而 switch 則負責控管 bonding 起來的那幾個 ports 的收發與 load balance(pc-side)。
然而,若是有兩個 ISP 在此 switch 上,或說有真正兩個不同的頻寬源,以實現真正的頻寬疊加,
那表示至少該有 bonding ports 與 ips(or others) 的一一對應才行,不過這或許也只能在 pc 端上作實現,也是當前真正的問題。
退一步說,或可嘗試降介面之傳輸頻寬再 bonding 起來以可測試看出 bonding 效果。
話又說回來,還記得前面一開頭使用 bonding,
即便沒有 LACP-switch,也是 workable 的嗎,真神奇。
(通過插拔測試,錯誤訊息如下:)
(bond0: (slave enp1s0): An illegal loopback occurred on slave)
(Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports)
(bond0: (slave enp2s0): An illegal loopback occurred on slave)
(Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports)
(是不是相當於方才提到 static/LACP 選項的 static mode。而 pc 端會有錯誤訊息是不是因無 LACP 相關定義的回應。)
所以以上只是譩測,還需持續學習才懂所以。

20231207 更新

  • 前面提到的,多個實體 ip 共存的問題,有解了XXD,其實只是繞了一大圈XXD。。。
  • 前面是假定,多個 ip 在系統下是必須手動再配置的,再來,noip 並無法顧及到多個 ip 的狀況,
  • 事實上上行所述之前者是錯的,後者也算是錯的。前者,系統便已順利配置好了所以我們不用去管它(理論上。因或許仍有人用上多張網卡而遇上問題,若然手動配置排除);而後者,noip 有顧及到只是或許是某些狀況未考慮進去,所以才發生問題。因此,我們要達預期,便需對 noip 做繞路解,那麼多個 ip 共存便不再有問題了,各自的 hostname 便能順利對應到。(註,就目前看是 OK,意謂/不保證)。
  • 接下來假設,有兩個實體浮動 ip,A & B(絕對對應至 hostnames),分別賦予 eno1 & enp3s0 兩張 nic。那麼,下附的範例便是展示 eno1+A,enp3s0+B;或者 eno1+B,enp3s0+A 兩種情況,要使用哪種配置,另一種將其註解掉便可。其他使用目的便比照辦理即成。
  • 其他註記事項如下,
  • 0. 首先前面有提過,或
    sudo sysctl -w net.ipv4.ip_forward=1
    再以
    cat /proc/sys/net/ipv4/ip_forward
    檢查之。
  • 1. 如前述,停用而只留要對應的 nic。我們要做 noip 的 configure。
  • 2. 下 sudo noip-client.configure 便能開始規劃,依提示易明,不要選全部,只要選擇所要對應的 hostname 及 nic。
  • 3. 完成後,會産生組態檔,筆者的位於 /var/snap/noip-client/4/noip2.conf
  • 4. 例如是依 eno1+B 所産生者,則更名為 noip2_hostnameB_eno1.conf
  • 5. 在 4. 前提下,enp3s0 便對應到 A,那麼其它停用,只啟用 enp3s0。重做一次 noip-client.configure,所産生者便是 enp3s0+A,故更為名 noip2_hostnameA_enp3s0.conf
  • 6. 交換而再設定;故總結産生出兩對組態。
  • 7. 因原始的 noip2.conf 被原始的 snap.noip-client.launcher.service 所用,一來我們不須對此 service 做任何動作(即它仍是 active 的),再來,讓該路徑不存在此檔 noip2.conf,則,它會執行只不過找不到組態檔,幸而仍回傳成功,這代表著,
  • 8. 我們在前面有一支 refresh 的 service 便能成功執行。那麼,我們便將所求加入該 service 內。即成。此檔修改的結果如下;請按自己的需求更改之便可。
  • 注意,前面 snap.noip-client.launcher.service 有執行過/active 中,故此 refresh 將其 stop 掉。
  • 收工,簡單吧。
  • (註,筆者自己的需求,一個固定 ip,一個浮動 ip,故僅需一行去限定/整篇的重點便是做限定。其次,不管哪張 nic 出來,routing 要對才是重點/意思是除非特別指明,原則上 nics 該是透明的才是;而這句當然與 noip 的行為上有抵觸所以才尋解)
[Unit]
    Description=restart noip-service in case of fault after reboot
    After=snap.noip-client.launcher.service systemd-networkd-wait-online.service
    Requires=systemd-networkd-wait-online.service
[Service]
    Type=idle
    ExecStartPre=/bin/sleep 5
    ExecStart=/bin/systemctl stop snap.noip-client.launcher.service
    #ExecStartPost=/snap/noip-client/4/bin/noip2 -M -c /var/snap/noip-client/4/noip2_waterfallsA_eno1.conf
    #ExecStartPost=/snap/noip-client/4/bin/noip2 -M -c /var/snap/noip-client/4/noip2_waterfallsB_enp3s0.conf

    ExecStartPost=/snap/noip-client/4/bin/noip2 -M -c /var/snap/noip-client/4/noip2_waterfallsA_enp3s0.conf
    ExecStartPost=/snap/noip-client/4/bin/noip2 -M -c /var/snap/noip-client/4/noip2_waterfallsB_eno1.conf
[Install]
    WantedBy=multi-user.target

20231210 承前再更新

  • 在幾天前的嘗試,確實將 noip 相關問題給解決掉了,故此議題不再論。不過另一方面筆者自信地說,多實體 ip 共存於系統其已自動配置妥 routing tables and rules 了,然而實務上是對也是錯。這幾天實際使用上,其所發生的問題同樣地如前述所遭遇者。
  • 系統所配置者,當然是沒有問題,也很全面,不過即便如此,仍會出現問題。
  • 經過這幾天的生啃這篇教學(當然看了七分,懂了兩分。。。即,能看懂的不到一分半XXD)
  • 故當前筆者也只能說,解答在這裏,這一章節,但當前我仍是無能為力XXD
  • http://linux-ip.net/linux-ip/adv-multi-internet.html
  • https://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.rpdb.multiple-links.html
  • https://lartc.org/howto/index.html
  • 簡單講,outbound traffic 應是不會有問題,因為 tbl/rule 盡了責;然而 inbound traffic,就會有衝突且其並不抵觸 tbl/rule 是正確且全面的。又或者說,原先的 tbl/rule 設定需多加一些修飾以同時適應於 outbound and inbound。
  • 欣慰的是,作者提到了要解決這樣的問題確實不簡單/不單純。
  • 所以反身而言,tcpdump, iptables, ipchains, arp, iproute2,還得須再反復加強熟悉,才可能有期待的成果,續待。

20231215 FINAL

  • 放鞭炮了!
  • 但該是不好意思地說,並非筆者多懂了什麼。。。而是。。。試出來的XXD
  • 但總歸成功了。。。
  • 不廢話,
  • 因為與 dhcp 相關,所以我把此 script 放到 /etc/dhcp/ 底下
  • 簡單講,scenario,數個 NICs 都是透過 dhcp 取得公開實體浮動 IP,在同一台機器下,那麼,會遇到的問題就如前述,而最後,透過此 shell script 來打通全身脈絡,就醬。
  • 使用,若兩張網卡為 eno1,enp3s0,同樣地,藉由前面的 noip 的 refresh service,加入一行
    ExecStartPre=/etc/dhcp/my_multihomed.sh eno1 enp3s0
  • 另外註記一下,如前所述,單機多網卡,通常情況,自動 dhcp 的結果確保了出去的順利;額外地手動使用 ip rule 使得進來也能通行無阻,其並且配合依 nic 分立路由表使得 ip rule 所意指的更為明確且也有所區隔。故若問筆者,不分表直接加 rules 可嗎?不知道XD
  • 至此,老早當初買那台 i5 有 6 埠的網孔時,就想要這樣做了。。。。結果,少說也兩三年了,才幸運地解決掉XXD
  • (嘿,才方發現,距這篇文章出生日期,剛剛好滿 4 年XD)
  • (補充,在腳本作用完成後經過一段時間,table main 中原本移除的 entries 又會增生回來,不過此時並不影響連通。兩點,有強迫症者,例如我可能就會想將它再移除,那麼時機應該是 dhcp renew 時,有機會再探究了;正常這或許表示分立的 tables 幫助不大而是 ip rule 具決定性關鍵)
  • (再更新補充)實際上,在那樣分立表的設定之後,傳輸速度檢測從原來的例如 500M 降為 100M 以下,後來又增生回來/約 30 分鐘後才回復 500M,換言之原本的加工過的,還是不夠的但筆者不知如何修正,嘗試如,若 main table 不做刪除,則結果是會有問題的。故當前就維持這樣的設定,30 分鐘後便能完全正常。第二點,加工過後若不再手動做任何修改,則 eno1 & enp3s0 是永遠無法互通的,即無法透過 eno1 ping enp3s0 反之亦然;當然此問題亦非當務之急。主機之各網孔出入皆無問題即可。
    再追加一點XD 因為就遇上了。。。
    所分立的 tables 會不見,經查很可能剛好遇上系統錯誤/罕見,故,保險起見,
    預設下 dhclient 是關閉了 /etc/dhcp/dhclient.conf 中的
    script “/sbin/dhclient-script”;
    將其打開,則在 .d/ 子目錄下的腳本便會依時機執行;將我們這一份腳本 soft-link 至 exit 子目錄下便可。於此,還須有加註:第一點,我們的腳本帶有參數,故腳本呼腳本便可簡單解決。其二,筆者先前嘗試過,確實是有作用的但現在再試無作用了原因未知而待解[應該是使用 netplan/networkd 則將不再有 hooks;即,dhclient 不再被使用了]。第三,得遵守以下乃因 base script 中使用了 run-parts,其不接受執行檔檔名中帶有 dot . 的;其次又用了 source . 即,腳本屬性不需帶有 x,且注意變數空間只有一份,即,我們所使用的腳本中若有變數同名於原本已存在的變數,錯誤將難查覺。
    (再再更新補充;請參考下方參考連結;腳本也再做了更新以同時適用於 NetworkManager & networkd)
    將我們的腳本軟連結於此路徑下,其 for networkd,它相當於是前述的 hook 的 exit.d/ 的角色。須注意腳本屬性須為 755。
    /usr/lib/networkd-dispatcher/routable.d/
    而關於腳本本身,原是很直觀地處理便可,不過當前最終版本是有些迂迴乃為適配於二種管理界面外,若發生意外網路斷線重新 dhcp 則可能能夠較順利回復原設想的狀態。至於 30 分鐘此 issue,竟然很配合地保持前述行為;若否,則腳本又要頭痛了。故結論,routing 問題可能徹底解決了並留下 30min issue 這個遺憾不過無傷大雅。

    最後,終於,至此,
    一了宿願,筆者目前已把一個固定 ip 擁有兩個網站,另一個浮動 ip 擁有現在這個網站,且互不干擾,終於實現完成了。。。
    也就是說,原本,牆上最多掛了 3 台主機,現在只剩下這台 5900HX 了且速度也飛快,因,三個網站全在 Ram disk 上跑,且主機是在 RAID0 模式下。

    又有簡易的 NAS 功能(SFTP)檔案備份/下載,手機上彈指之間須臾即成,
    又有遠端桌面,不僅除了主機有之外,還有 VM/目前設置 ubuntu/alpine/win-xp,皆可展現在 PC,手機或平板上/使用。
    又 Arduino 上用的是 http,故後來應會再加建一個網站走 http 以當成 Arduino 的雲端/在同一台主機上追加都已不再是問題了。

    所以筆者當初從無,小白,至今到有到成到水,您也可以!!!
  • 參考資料,iproute2 教學
    https://is.muni.cz/th/tu1ke/?lang=en
    若使用 networkd 的可能的 dhcp hook 解法
    https://unix.stackexchange.com/questions/469716/systemd-networkd-run-script-after-dhcp-client-aqcuires-new-address
  • 就醬,上扣
#!/bin/bash

# not used here............ just a snippet backup.
if false; then

echo "###  ================" > /tmp/variables.txt
echo -e "###  Environment Variables\n" >> /tmp/variables.txt
printenv >> /tmp/variables.txt
echo -e "\n###  ===============" >> /tmp/variables.txt
echo -e "###  Shell Variables\n" >> /tmp/variables.txt
echo ""
set >> /tmp/variables.txt
echo ""

fi




## /etc/iproute2/rt_tables would be modified.
## assume that after being booted up, there are nics dhcped,
## the purpose is to move each nic settings in the route table main to respective table.
## since this is about dhcp, so i would like to put the script in /etc/dhcp/.
## no idea why it works, please correct if any improper.


# since there are cases the existing manually added tables could disappear,
# so we enable the dhcp-client exit-script of the switch in /etc/dhcp/dhclient.conf:: #script "/sbin/dhclient-script";
#     for which invoking this one script for checking and re-adding.
#/usr/bin/date >> /tmp/run_dhcp.txt


# Check if the script is executed by the root user
if [[ $EUID -ne 0 ]]; then
    echo "This script must be run as root."
    exit 1
fi

# Check if NIC identifier arguments are provided
if [ $# -eq 0 ]; then
    echo "Usage: $0 <nic1> [<nic2> ...]"
    exit 1
fi




# this was added at last against vars pollution.
CustomizedMyDhcpedRouteTables() {


# Iterate through provided NIC identifiers
local TableLoc="/etc/iproute2/rt_tables"
local StartId=6 # the first number 6 of customized table id.
local EndId=253

for nic in "$@"; do
    # Check if the specified NIC exists
    if ! ip link show | grep -q ": $nic:"; then
        echo "NIC '$nic' not found."
        exit 1
    fi

    # Use NIC name as the table name
    local table_name
    table_name="tbl_${nic}"

    # get the nic bound ip.
    local BoundIp

    BoundIp=$( ip route show | sed -n "0,/dev ${nic}.*src.*/s/.*${nic}.*src \([0-9\.]*\).*/\1/p" )
    if [[ ! ${BoundIp} =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then

        BoundIp=$( ip route show table "tbl_${nic}" 2>&1 | sed -n "0,/dev ${nic}.*src.*/s/.*${nic}.*src \([0-9\.]*\).*/\1/p" )
        if [[ ! ${BoundIp} =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            echo Please check the ${nic} if assigned ip.
            continue; # exit 1;
        fi

    fi

    # Check if the table already exists, if not, create it
    if ! ip rule show table $table_name > /dev/null 2>&1; then
        echo "Creating a new table with name '$table_name' for NIC '$nic'."

        while grep -q "^[[:space:]]*${StartId}[[:space:]]" $TableLoc; do
            (( StartId=$StartId+1 ));
            [ $StartId -ge $EndId ] && echo table id overflow $StartId && exit 1;
        done

        # append new table directly to rt_tables.
        echo $StartId $table_name | tee -a $TableLoc
        echo table created.
    fi

    # check if entries already exist by ip-rule.
    if ip rule show | grep -q "from ${BoundIp}.*lookup ${table_name}"; then
        continue;
    fi

    # rule the table first.
    ip rule add from ${BoundIp} dev ${nic} lookup ${table_name}

    # moving entries from table main to respective table.
    ip route show table main | grep "dev ${nic}" | while read ROUTE; do
        ip route add ${ROUTE} table ${table_name}
    done

    # delete old ones.
    ip route show table main | grep "dev ${nic}" | while read ROUTE; do
        ip route delete ${ROUTE} table main
    done

    # and need this too.
    ip rule add from ${BoundIp} table ${table_name}

done


# this was added at last against vars pollution.
}




CustomizedMyDhcpedRouteTables "$@";

# end of bash.

Categories: 架設網站

Tags:

PHP Code Snippets Powered By : XYZScripts.com