MoreRSS

site iconJiaJun Yeh | 葉家郡修改

台湾软件工程师,专精于后端开发,Home Lab爱好者。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

JiaJun Yeh | 葉家郡的 RSS 预览

使用DNS紀錄來自動更新IP白名單

2024-06-14 00:00:00

為了獲得比較嚴謹的安全性,我們通常可以在防火牆上面設定,只有固定的IP允許存取。

但要更換IP時,就需要去所有機器上更新名單。如果我們可以利用DNS紀錄,來尋找某個網域指向的IP,就可以藉此讓生活更加便利。

我們可以為某個domain新增多個A record,這原本是用來作為round-robin使用,讓用戶端自行隨機挑選IP,因此他會回傳一個IP列表。

例如我們用指令查詢ptt.cc會發現以下結果:

$ dig +short ptt.cc
140.112.172.3
140.112.172.5
140.112.172.11
140.112.172.1
140.112.172.4
140.112.172.2

pfsense

pfsense本身就有支援利用FQDN當作IP清單來源,在防火牆的aliases頁面底下,新增對應的IP alias就可以。

Type選擇Hosts,IP or FQDN欄位直接填寫domain name。

如果想要確認結果可以在Diagnostics > Table,找到該alias解出來的IP清單。

iptables

iptables操作的nftables是一個kernel module,本身不支援透過FQDN解出IP,但我們可以自己寫一個script達成這樣功能。

#!/usr/bin/env bash

DYNHOST=ptt.cc
DYNHOST=${DYNHOST:0:28}
DYNIPS=$(host $DYNHOST |cut -f4 -d' ')

for DYNIP in $DYNIPS
do
	echo "Checking..." $DYNIP
	# Exit if invalid IP address is returned
	case $DYNIP in
	0.0.0.0 )
	exit 1 ;;
	255.255.255.255 )
	exit 1 ;;
	esac

	# Exit if IP address not in proper format
	if ! [[ $DYNIP =~ (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) ]]; then
	exit 1
	fi
	echo "OK"
done

# If chain for remote doesn't exist, create it
if ! /sbin/iptables -L $DYNHOST -n >/dev/null 2>&1 ; then
/sbin/iptables -N $DYNHOST >/dev/null 2>&1
fi

# Flush old rules
/sbin/iptables -F $DYNHOST >/dev/null 2>&1

for DYNIP in $DYNIPS
do
	echo "Adding new IP..." $DYNIP
	# Add new IPs
	/sbin/iptables -I $DYNHOST -s $DYNIP -j ACCEPT
done

# Add chain to INPUT filter if it doesn't exist
if ! /sbin/iptables -C INPUT -t filter -j $DYNHOST >/dev/null 2>&1 ; then
/sbin/iptables -t filter -I INPUT -j $DYNHOST
fi

之後在crontab加上排程自動更新

* * * * * root /root/update_iptables.sh > /var/log/abc.log 2>&1

順便也附上我的iptables設定 (未知IP除了80和443一律拒絕存取)

iptables -F

# 先確保你的IP已經在允許清單裡面

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

一些可能的需求和做法:

  • 如果想要連80和443都不開的話,也可以用cloudflare tunnel來提供服務。
  • 如果有從陌生IP連線的需求,但都是從自己的裝置連線,可以設定WireGuard或wg-wasy來加密和建立連線,安全性會比暴露ssh更高。

lvremove 遇到 contains a filesystem in use

2024-06-05 00:00:00

lvremove /dev/mapper/ssd-ssd

遇到錯誤

Logical Volume ssd-ssd contains a filesystem in use.

可以先嘗試 lsof 2>/dev/null | grep /mnt/ssd

接著嘗試 umount /mnt/ssd 卸載成功後還遇到這個狀況

可能是因為container對其進行file watching

先關閉所有container就可以移除LV了

多媒體檔案管理和下載伺服器 - 軟體篇

2024-05-26 00:00:00

在管理多媒體檔案時,常見的RAID方案能提供即時保護,將多個硬碟模擬成一個虛擬硬碟給作業系統使用。這些虛擬硬碟經過格式化後,就能進行檔案存取。

常見的RAID方案有RAID1、RAID5和RAID6。RAID1是將兩顆硬碟存放相同內容,因此會浪費一半的硬碟空間。若要擴充,必須以兩顆硬碟為單位加入。

RAID5則使用一顆硬碟作為校驗盤,換取更大的可用容量,所以五顆硬碟的組合只佔用20%的空間。不過,RAID5有一些缺點,例如讀取檔案時需要多顆硬碟同時啟動,硬碟壞掉後復原過程較長且有失敗風險。RAID6則適用於超過五顆硬碟的情況,能提供更高的安全性。

另一種方式是JBOD,將多顆硬碟合併成一個大硬碟,但缺點是若有一顆硬碟損毀,整個虛擬硬碟的資料都會損毀。

以前,我使用JBOD管理下載機,但認為還有改進空間:

  1. 若只需存取特定檔案,應該只有一顆硬碟啟動提供服務,其他硬碟保持休眠,以省電並延長壽命。
  2. 若某顆硬碟損毀,我只想損失該硬碟上的檔案,其他硬碟仍能正常使用。

最近我發現了一個完美方案:mergerfs加上snapraid。

不同於RAID,mergerfs是一種特殊檔案系統,能將多個檔案系統合併成一個虛擬檔案系統。

假設我有三顆硬碟,分別格式化成ext4,並掛載到/mnt/disk{1,2,3},使用mergerfs可將這三個掛載點合併成/mnt/storage,並包含所有資料夾和檔案。我也能直接對/mnt/disk1進行讀寫,不影響/mnt/storage的運作。當/mnt/disk1損毀,/mnt/storage的內容會減少為/mnt/disk{2,3}的總和。

以下是我的/etc/fstab設定,由於後續要設定snapraid,其中一顆硬碟為parity_disk:

UUID="528592ce-dcc2-4aaa-9f92-d27166edfdfc" /mnt/disk1 ext4 noatime,nodiratime 0 0
UUID="414d7b98-d278-4397-80ff-9f5b103623ac" /mnt/disk2 ext4 noatime,nodiratime 0 0
UUID="c3017979-34eb-421a-bb94-c4291b15ffa4" /mnt/disk3 ext4 noatime,nodiratime 0 0
UUID="8878733e-eba1-4f5c-9dab-aa1f08835fd9" /mnt/parity_disk1 ext4 noatime,nodiratime 0 0

/mnt/disk* /mnt/storage fuse.mergerfs cache.files=partial,dropcacheonclose=true,moveonenospc=true,defaults,allow_other,minfreespace=100G,fsname=mergerfs,category.create=mspmfs,nonempty,noatime 0 0

我將category.create設為mspmfs,因為希望同一個torrent下載的檔案存放在同一硬碟,避免分散到多顆硬碟上。

mergerfs的另一個優點是硬碟容量不需一致。假設硬碟組合為4T、8T、12T,總可用空間即為24T。

mergerfs的小缺點是在移動檔案時,檔案不一定會落在同一硬碟上,跨硬碟操作會造成大量讀寫。處理此問題可以直接存取/mnt/disk*。使用qBittorrent時可能會遇到這個問題。

接下來是snapraid設定,與RAID的parity設計相似,但snapraid是非即時的,需手動觸發更新parity資料。適合寫入後不再改變的大型檔案。可設計小型暫存區,先複製檔案至RAID硬碟,更新parity後再刪除暫存檔案,避免遺失。

以下是我的/etc/snapraid.conf設定範例:

parity_disk須為RAID中最大硬碟。假設硬碟組合為4T、8T、12T,parity_disk須至少12T。

parity /mnt/parity_disk1/snapraid.parity
content /mnt/disk1/snapraid.content
content /mnt/disk2/snapraid.content
content /mnt/disk3/snapraid.content
data d1 /mnt/disk1/
data d2 /mnt/disk2/
data d3 /mnt/disk3/

exclude *.tmp
exclude *.temp
exclude *~
exclude Thumbs.db
exclude .DS_Store

exclude @Recycle/
exclude lost+found/

這樣就完成了一個適合多媒體檔案庫的自建NAS系統,硬碟可動態擴充,不需一次買齊,且能取得最佳性價比。

淘寶退貨 順豐寄回大陸經驗

2024-05-24 00:00:00

在淘寶買到有問題的商品想要退回大陸,雖然看了幾篇網路上的教學,還是和實際的退貨經驗有點出入,故紀錄於此。

  1. 如果要退貨退款,先領收貨物,然後在淘寶網站上面點申請售後。我在app上找半天找不到哪邊可以申請退貨..
  2. 如果淘寶商家有七天無理由包退,那麼退貨退款時的理由選不喜歡或是和商家協商退款即可自動通過退款審核。
  3. 到台灣順豐註冊帳號並填寫寄到大陸的選項,如果是寄公司的話就不需要額外的身分證明文件了。這個公司名稱我是從淘寶店鋪網站上面找到的,而不是店鋪名稱。但實際上公司名稱是真的是假的,是不是需要核實就不清楚。
  4. 選擇順豐上門收貨,商品不要封起來,要先讓取件員看過商品內容,他們會幫忙稍微判斷品項是不是能寄。如果有電池或磁鐵可能就要走特貨。
  5. 收件人姓名要填對方的自然人姓名,不能填店鋪名稱,不然不給寄。 (取件員是這樣說的,但我覺得是否真的有這個人可能也不重要,反正能寄到那個退貨地址就好)
  6. 5/23下午台灣收件,5/24晚上就在大陸深圳簽收了,物流速度神秘的快,但不要當成常態。
  7. 運費實收306元台幣,網站上估計136元台幣。物品重量不到1公斤。 (這部分很大機率就是買家自行吸收了)

後續退款進度還在處理中…

在Linux上面安裝glances並設定為系統服務

2024-05-23 00:00:00

由於在 Docker 中無法查看某些系統資訊,加上需要指定版本,因此需要進行一個繁瑣的 Python 程式安裝流程。

首先,我們需要建立一個虛擬環境來隔離即將安裝的依賴,以免影響系統的穩定性。

apt install python3 python3-venv

接下來,建立一個虛擬環境:

python3 -m venv /root/_glances
source /root/_glances/bin/activate

接著,安裝 Glances。如果需要使用 Web UI,則需要額外安裝 FastAPI。

pip3 install Glances
pip3 install FastAPI

以下是 systemd 的服務配置檔案,將其放置於 /etc/systemd/system/glances.service

[Unit]
Description=Glances
Documentation=man:glances(1)
Documentation=https://github.com/nicolargo/glances
After=network.target

[Service]
ExecStart=/root/_glances/bin/python3 -m glances -w
Restart=on-abort

[Install]
WantedBy=multi-user.target

完成上述步驟後,啟用並啟動 Glances 服務:

systemctl daemon-reload
systemctl enable glances
systemctl start glances

這樣就完成了在 Linux 上安裝並設定 Glances 為系統服務的步驟。現在,你可以透過 Web UI 來監控你的系統狀態了。

在dnsmasq加上自動生成PTR紀錄

2024-05-20 00:00:00

偶而想研究一下有哪些網路連線和流量進出,開啟IP解析以後,一部份的IP可以解析出擁有者是誰,例如HiNet, AWS, Facebook,但也有一些解不出來的IP是屬於雲端供應商所有,例如cloudflare,如果能夠在本地的DNS上回應PTR紀錄,就能減少排查可疑連線的時間。

通常來說,這些網段都非常大,從 /24/12都有可能,因此無法用列舉的方式寫出所有IP,必須要DNS伺服器有實作自動生成轉換紀錄的功能才行。

以OpenWRT為例,上面預設的DNS伺服器是dnsmasq。在/etc/dnsmasq.conf增加設定就可以自動轉換:

synth-domain=cloudflare.net,10.0.0.0/24,public-

可以在套用前先執行dnsmasq --test來檢查設定。之後需要用/etc/init.d/dnsmasq restart套用設定。

dig -x 10.0.0.1的話就可以看到PTR紀錄為public-10-0-0-1.cloudflare.net