顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

2026年4月1日 星期三

Let's Encrypt IP certificate

https://letsencrypt.org/2026/01/15/6day-and-ip-general-availability
2026年一月開放使用,但效期只有 160 小時
可以同時申請 IPv4 + IPv6 在同一張

必需指定用 shortlived profile
acme.sh --issue -d {IPv4} -d {IPv6} --webroot /var/www/html --certificate-profile shortlived

2026年1月11日 星期日

x86-64-v3 is required by RHEL10

RHEL10 必需要 x86-64-v3 指令集的 CPU 才能安裝,
太舊的電腦(超過十年)可能都沒辦法裝,連開機都不行
替代方案可使用 Almalinux,仍有提供 x86_64_v2 的版本



TWDS mirror
Almalinux 所提供的 x86_64,跟 RHEL 一樣,是 v3 的版本,
Rocky Linux 則沒有提供 x86_64_v2

2025年5月22日 星期四

New SSH client to old SSH server

從新版 SSH 8.x 連到舊版 6.x SSH server
若出現
Unable to negotiate with x.x.x.x port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
因為較新版已禁用一些舊的加密協定導致無法連

可設定 LEGACY 使可以連
update-crypto-policies --set LEGACY

若要改回來是
update-crypto-policies --set DEFAULT

OpenSSH 8.8 之後,ssh-rsa (RSA 搭配 SHA-1) 被預設關閉,用 LEGACY 也沒用,
需要在 ~/.ssh/config 或系統的 /etc/ssh/ssh_config 設定

Host x.x.x.x
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa

要另外產生一把 RSA Key 來連舊系統
指令 ssh-keygen -t rsa
(較新版的 OpenSSH client 預設的 Key Type 是 ed25519)

2025年3月31日 星期一

Bracketed Paste Mode

Bracketed Paste Mode 是 Terminal 為了區分手動輸入及剪貼簿貼上的一種模式,
啟用此模式,貼上的文字區塊會被起始控制碼 ESC [ 200 ~ 及結束控制碼 ESC [ 201 ~ 包住

例如在編輯器貼上一段已經排版好的程式碼,若沒有啟用 Bracketed Paste Mode,
縮排會不如預期,導致有重複縮排的情況,可以參考 WIKI - Bracketed-paste 內的舉例

若是在 CLI 模式,啟用 Bracketed Paste Mode,一次貼上多行,Terminal 會先 queue 住,
按 Enter 後,才會將整個區塊送出
附圖畫面是一次貼了兩行指令,還沒按 Enter 的狀況,此時指令是還沒執行的



個人認為 CLI 模式將 Bracketed Paste Mode 關掉是比較正常的,
一次送出多行指令的執行如果可能不如預期

查看目前 Bracketed Paste Mode 是否啟用
bind -V | grep enable-bracketed-paste

啟用/關閉指令(當前)
bind 'set enable-bracketed-paste on'
bind 'set enable-bracketed-paste off'

如要寫入設定,可以將
set enable-bracketed-paste on 或 set enable-bracketed-paste off
寫入 /etc/inputrc

2025年3月18日 星期二

SSH Jump host connection

SSH 跳板機連線

情境: 1跳,透過 Host A 連 Host B
ssh -J user@hostA user@hostB

情境: 2跳,透過 Host A 連 Host B,再連到 Host C
ssh -J user@hostA,user@hostB user@hostC

-J 參數相當於設定 ProxyJump
若是用 Key 連線,Key 都是吃 Client 端的,只要把 Key 放到所有 Host 即可
達到體感直連,實際上路由仍是照指定 Host 順序走到目的
理論上更多跳都行

2025年3月5日 星期三

Linux moreutils

moreutils 這個套件,包含了一些有趣功能的小工具
可以透過 dnf install moreutils 或 apt install moreutils 安裝
套件包含以下工具,個人覺得比較實用的是 ifdata、pee、sponge、ts、vidir
/usr/bin/chronic
/usr/bin/combine
/usr/bin/errno
/usr/bin/ifdata
/usr/bin/ifne
/usr/bin/isutf8
/usr/bin/lckdo
/usr/bin/mispipe
/usr/bin/pee
/usr/bin/sponge
/usr/bin/ts
/usr/bin/vidir
/usr/bin/vipe
/usr/bin/zrun

chronic 用來隱藏正常執行結果的標準輸出
好像沒什麼用,使用 > /dev/null 可以達到一樣的效果

combine 布林合併兩分文件
combine file1 and file2 兩分文件都有則輸出行
combine file1 not file2 輸出只存在 file1 但不存在 file2 的行
combine file1 or file2 相當於 cat file1 file2
combine file1 xor file2 輸出只存在 file1 或 file2 的資料

errno 查詢 errno 名稱及描述

ifdata 直抓網路卡各項資訊
例如: ifdata -pa eth0 可以直接取出 IPv4 IP

ifne 標準輸入不為空時,執行後續指令
date | echo hello # 會出現 hello
true | echo hello # 不會出現 hello

isutf8 檢查檔案是否是合法 UTF-8 格式
現在系統已全面都是 UTF-8,好像沒什麼用了

lckdo 指定 lock file,避免指令重複執行
跟 flock 類似,man page 也建議使用 flock

mispipe 相當於 command1 | command2
和 pipe 的差異是使用 mispipe command1 command2 會回傳 command1 的 exit status

pee 複製標準輸入,pipe 給多支程式
類似 tee,tee 是將標準輸入寫到檔案,pee 是將它 pipe 給程式,可以多個,
通常用 pee 的情況也是要 pipe 給多個程式才需要它
例如: date | pee cat cat 執行結果可以看到兩個日期

sponge 這個指令會接收到所有 input 後才會輸出,可以做到同檔操作
例如: grep abc file | sponge file
若不使用 sponge,一般做法要兩行
grep abc file > file.tmp
mv file.tmp file

ts 在任何 input 上加上時間
這指令很好用,例如: ping 1.1.1.1 | ts

vidir 可以在 vi 模式進行檔案操作
例如刪除,改檔名,存檔後會真的刪除及改檔名

vipe 編輯 pipe
在 command1 | command2 中間,加入 vipe,command1 | vipe | command2,可以對資料異動後,再 pipe 給 command2

zrun 在不解開 .gz 的情況下,對解開的檔案進行操作
背景做法是解壓暫存檔,把暫存檔名當參數餵給 command
例如: zrun grep abc file1.gz

2025年3月4日 星期二

Linux Kernel fs.protected_regular

這是 4.19 版才加入的安全性保護功能

protected_regular: This protection is similar to protected_fifos,
but it avoids writes to an attacker-controlled regular file,
where a program expected to create one.
When set to "0", writing to regular files is unrestricted.
When set to "1" don't allow O_CREAT open on regular files that we don't own in world writable sticky directories,
unless they are owned by the owner of the directory.
When set to "2" it also applies to group writable sticky directories.

RedHat 9 系的 Linux protected_regular 預設是 1
常見的目錄是 /tmp 及 /dev/shm
當目錄下面檔案 file owner 是 A,檔案權限是 -rw-rw-rw- (666) 當 B 去存取 file
有用到 O_CREAT 時,是不允許的,
但使用不同編輯器,編輯檔案後存檔,卻有不同樣的結果,
vim 編輯後可以寫入,nano 及 joe 都不能寫入,猜測跟檔案處理方式有關,vim 可能沒有調用 O_CREAT,所以可以寫入

Shell 的處理方式,例如以下動作也是可以,也就是沒有調用 O_CREAT
echo hello > file
echo world >> file

RedHat 要改這個預設值,是改這個檔
/usr/lib/sysctl.d/50-default.conf

2024年11月2日 星期六

inotify-tools

inotify-tools 工具,可以監控檔案系統的異動,後續觸發想要的動作,
例如此腳本監控 /abc 目錄,後續觸發 rsync 動作
while true
do
inotifywait -e modify -e create -e delete /abc
rsync -au /abc/ /def/
done

加 -d 參數可以常駐執行,監控 Event 存成 Log
inotifywait -dr --timefmt '%F %T' --format '%T %w%f %e' /abc -o /var/log/inotifywait.log

另外一個指令 inotifywatch 感覺比較沒用,它是監控一段指定時間或直到按 Ctrl-C,顯示 Event Counter

2024年10月6日 星期日

Linux PPPoE NAT MTU and MSS

Linux 在 PPPoE 環境下 NAT,下面的 Client 可能會有部份網站連不上,
已知 LINE 的網站 (https://line.me) 及 LINE 服務就有這個狀況

這個問題是因為 Client 的 MTU 1500 大於 Linux NAT WAN 端的 MTU 1492 所導致,
解決方式有兩種:

1. 在 Linux NAT 解決,加一行 Rule
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
TCPMSS 這個 target 會更改 TCP SYN 封包的 MSS 值
--clamp-mss-to-pmtu 會根據 path_MTU 自動設定 MSS (Maximun segment size) 的值,即 path_MTU - 40 (for IPv4)
2. 更改 Client 端的 MTU 跟 NAT WAN 端一致

這兩種方式明顯是方法 1 較佳,不用動到 Client 端

原理:
一般 Ethernet MTU 是 1500,PPPoE 是 1492,
Client PC 沒特別調整的話,MTU 也是 1500,進行 TCP SYN 連線,
TCP Option 中的 MSS 會是 1460 (1500-40 TCP Header)



在尚未加上面的 Rule 時,NAT 會原封不動轉送出去,
導致回應封包有可能會超出 PPPoE 環境的值1452,後續就收不到 Server Hello 封包,就會卡住沒通
加入該 Rule 後,封包在轉送出去時,會改成 MSS 值為 1452,後續就會通



那為何大部份的網站都會通呢?
因為用了較小的 MSS,例如 Google 是 1412

2024年9月10日 星期二

HiNet IDC mirror closed

http://mirror01.idc.hinet.net
HiNet 這個網址關了,要高速下載 Linux ISO 少了一個地方,感謝 HiNet 默默服務了多年
測了幾個 TW mirror 站,推 TWDC 台灣數位串流,常見的 Linux 都有,速度超快
https://mirror.twds.com.tw

2024年8月5日 星期一

Change Redhat Linux 9 /lib default size

Redhat Linux 9 (or Rocky Linux 9 or Alma Linux 9) 之前的 /lib,設跟 /dev/shm 相同,預設大小是記憶體一半,
在 9 之後,預設大小是記憶體的 20%,若要調整這個大小,可以在 /etc/fstab 加一行覆寫預設值
例如:
tmpfs /run tmpfs defaults,size=5G 0 0

systemd jounal 的預設存放位置就在這 /run/log/journal,
其預設最多使用所在 Partition 的 10%,若 Log 量多,希望保留多一多時間,
就需要調大 SystemMaxUse 及 RuntimeMaxUse 這兩個值

2024年4月28日 星期日

Eazy way to install OpenWrt

這個方法網路要通,直接抓 image 寫入硬碟
隨便找一片 Linux ISO 開到 rescue 模式
fdisk -l 看一下硬碟位置,如果是 /dev/sda

curl https://repo.jing.rocks/openwrt/releases/23.05.3/targets/x86/generic/openwrt-23.05.3-x86-generic-generic-ext4-combined.img.gz | zcat > /dev/sda

一行解決,然後重開就可以了
上面的網址是 Japan Mirror 的網址,其他可參考 OpenWrt Downloads

Codeit repo for EL8/EL9

Codeit repo 對 EL8/EL9 的支援到 2023 年底才支援
用這個 repo 的主要是要使用最新版的 Apache 或 nginx

dnf -y install https://repo.codeit.guru/codeit-repo-release.el8.rpm
or
dnf -y install https://repo.codeit.guru/codeit-repo-release.el9.rpm

dnf -y module reset httpd
dnf -y module enable httpd:codeit

若是從舊版升級上來,ssl error log 可能看到這樣的錯誤,服務起不來
AH01898: Unable to configure permitted SSL ciphers
SSL Library Error: error:0A0000B9:SSL routines::no cipher match


需要調整 ssl.conf 這兩行的設定
SSLCipherSuite "EECDH+AES128:EECDH+AES256:+SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RSA+3DES:!DSS"
SSLProxyCipherSuite "EECDH+AES128:EECDH+AES256:+SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RSA+3DES:!DSS"
原本是
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM

ref. CodeIT Technical blog

2024年4月21日 星期日

Stunnel

Stunnel 有點像 SSH tunnel,可以建立加密通道
原本未加密的協議,讓它走 Stunnel,就可以達到不改變協議,數據有加密的效果
以下用一個實例說明:

A 要 telnet B,IP 12.34.56.78,因 telnet 協議本身未加密,
若要讓 A 到 B 的傳輸數據加密,此時就可以用 Stunnel

建立憑證
cd /etc/stunnel
openssl req -new -x509 -days 9999 -nodes -out stunnel.pem -keyout stunnel.key
把 stunnel.pem 及 stunnel.key copy 到另一台

A 要配置 Stunnel client
/etc/stunnel/stunnel.conf 內容如下
cert = /etc/stunnel/stunnel.pem
key = /etc/stunnel/stunnel.key
client = yes

[telnet]
accept = 23
connect = 12.34.56.78:2323

B 要配置 Stunnel server
/etc/stunnel/stunnel.conf 內容如下
cert = /etc/stunnel/stunnel.pem
key = /etc/stunnel/stunnel.key
client = no

[telnet]
accept = 2323
connect = 127.0.0.1:23

配置後兩邊啟動服務
systemctl enable stunnel --now

在 A 就可以 telnet localhost (取代直連 telnet 12.34.56.78),
然後封包加密,送到 12.34.56.78:2323,
B 收到封包後解密,再送給 localhost:23

2024年4月4日 星期四

Chrome for Testing and Chromedriver

Chrome for Testing 這一頁,可以取得特定版本的 Chrome 來測試
本文主拿它在 Linux 上跑 Chromedriver,當作爬蟲用途,
它是真的執行瀏覽器來跑結果,所以只要是瀏覽器可以看得到的,都爬得到
環境是 Rocky Linux 9,使用預設 GDM

# 建立環境
cd /tmp
wget https://storage.googleapis.com/chrome-for-testing-public/123.0.6312.86/linux64/chrome-linux64.zip
wget https://storage.googleapis.com/chrome-for-testing-public/123.0.6312.86/linux64/chromedriver-linux64.zip
cd /usr/local
unzip /tmp/chrome-linux64.zip
unzip /tmp/chromedriver-linux64.zip
cd /usr/bin
ln -s /usr/local/chromedriver-linux64/chromedriver .
ln -s /usr/local/chrome-linux64/chrome .

# 建立 chromdriver 啟動腳本
echo '#!/bin/bash' > /usr/local/bin/chromedriver.sh
echo 'chromedriver --log-path=/dev/shm/chromedriver.log --verbose --append-log --readable-timestamp --whitelisted-ips >> /dev/shm/chromedriver.output 2>&1 &' >> /usr/local/bin/chromedriver.sh
chmod 755 /usr/local/bin/chromedriver.sh

# 設定 GDM 登入後啟動上面的腳本,這邊的 username 請代換成自己的登入名稱
echo '#!/bin/bash' > /etc/gdm/PostLogin/Default
echo 'export DISPLAY=:0' >> /etc/gdm/PostLogin/Default
echo 'su pank /usr/local/bin/chromedriver.sh > /dev/null &' >> /etc/gdm/PostLogin/Default
chmod 755 /etc/gdm/PostLogin/Default

# 設定 iptables 可以導到 Local Port,for 外部 call API 用
echo net.ipv4.conf.all.route_localnet=1 >> /etc/sysctl.conf
sysctl -p
iptables -t nat -A PREROUTING -p tcp --dport 9515 -j DNAT --to 127.0.0.1:9515

到這邊建立完成,已可以另一台電腦調用上面建立的 Chrome 資源,
這邊使用 php-webdriver 測試,抓取 Bing 的網頁

composer require php-webdriver/webdriver

<?php
require __DIR__."/vendor/autoload.php";
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverExpectedCondition;
$serverUrl = 'http://192.168.1.10:9515';
$driver = RemoteWebDriver::create($serverUrl, DesiredCapabilities::chrome());
$driver->get('https://bing.com');
$driver->wait(10,200)->until(WebDriverExpectedCondition::titleIs('Bing'));
echo $driver->getPageSource();
$driver->quit();
?>

2024年3月29日 星期五

Linux ping report no answer

Linux ping 預設不會印出無回應的狀況,只要加上 -O 就可以了,就跟 Windows ping 差不多
有掉包的話比較清楚

# ping -O 192.168.1.8
PING 192.168.1.8 (192.168.1.8) 56(84) bytes of data.
64 bytes from 192.168.1.8: icmp_seq=1 ttl=64 time=0.347 ms
64 bytes from 192.168.1.8: icmp_seq=2 ttl=64 time=0.237 ms
no answer yet for icmp_seq=3
no answer yet for icmp_seq=4
64 bytes from 192.168.1.8: icmp_seq=5 ttl=64 time=0.224 ms
64 bytes from 192.168.1.8: icmp_seq=6 ttl=64 time=0.213 ms

再加 -D 參數可以在前面印出時間,可惜是 UNIX timestamp 格式,不方便直接讀取

# ping -DO 192.168.1.8
PING 192.168.1.8 (192.168.1.8) 56(84) bytes of data.
[1711724576.274247] 64 bytes from 192.168.1.8: icmp_seq=1 ttl=64 time=0.254 ms
[1711724577.288744] 64 bytes from 192.168.1.8: icmp_seq=2 ttl=64 time=0.225 ms
[1711724578.312747] 64 bytes from 192.168.1.8: icmp_seq=3 ttl=64 time=0.220 ms

若要在前面加入時間,推薦用 ts,在 moreutils 套件內,它是個 Perl 腳本,可搭配任何程式使用

# ping -O 192.168.1.8 | ts
Mar 29 23:08:25 PING 192.168.1.8 (192.168.1.8) 56(84) bytes of data.
Mar 29 23:08:25 64 bytes from 192.168.1.8: icmp_seq=1 ttl=64 time=0.257 ms
Mar 29 23:08:26 64 bytes from 192.168.1.8: icmp_seq=2 ttl=64 time=0.239 ms
Mar 29 23:08:27 64 bytes from 192.168.1.8: icmp_seq=3 ttl=64 time=0.240 ms








iptables hashlimit

把 Linux 充當 NAT 的情況下,可以用 iptables hashlimit module 來達到簡單的限速

iptables -A FORWARD -d 192.168.0.0/16 -m hashlimit --hashlimit-name download --hashlimit-mode dstip --hashlimit-above 2048kb/s -j DROP
iptables -A FORWARD -s 192.168.0.0/16 -m hashlimit --hashlimit-name upload --hashlimit-mode srcip --hashlimit-above 1024kb/s -j DROP

第1行,下載規則,當目的是內網時, 以 dstip 分類,限速 2048kbytes/s = 16Mbps
第2行,上傳規則,當來源是內網時, 以 srcip 分類,限速 1048kbytes/s = 8Mbps

效果: 內網每個 IP 都享有 16Mbps/8Mbps 頻寬。測速會超過一些,誤差在 10% 內,還算滿準的。

ref. man iptables-extensions

2024年3月21日 星期四

RHEL 9 install xrdp

xrdp 是 Linux 版的 RDP server (遠端桌面)
它運作時需要 Xvnc 的 libvnc.so, 所以安裝時需要連同 VNC 一起安裝(只需 minimal)

dnf -y install xrdp tigervnc-server-minimal
systemctl enable xrdp --now

在 Rocky Linux 9 的環境,有遇到登入後立即斷線的狀況,似乎是 gdm 的問題,換成 lightdm 就正常了

dnf -y install lightdm
systemctl disable gdm --now
systemctl enable lightdm --now

2024年2月22日 星期四

Install w3m in Rocky Linux

Rocky Linux 中安裝 w3m 需要啟用 powertools repo
未啟用前安裝會出現此錯誤
- nothing provides perl(NKF) needed by w3m-0.5.3-60.git20230121.el8.x86_64 from epel

啟用 powertools repo 指令
dnf config-manager --set-enabled powertools
dnf -y install w3m

2023年11月17日 星期五

Fix Unable to detect release version (use '--releasever' to specify release version)

rpm -ivh https://mirror01.idc.hinet.net/CentOS/8-stream/BaseOS/x86_64/os/Packages/centos-gpg-keys-8-6.el8.noarch.rpm
rpm -ivh https://mirror01.idc.hinet.net/CentOS/8-stream/BaseOS/x86_64/os/Packages/centos-stream-repos-8-6.el8.noarch.rpm
rpm -ivh https://mirror01.idc.hinet.net/CentOS/8-stream/BaseOS/x86_64/os/Packages/centos-stream-release-8.6-1.el8.noarch.rpm

會遇到這個問題是在 migrate to Rocky Linux 時中斷造成
再次執行 migrate2rocky.sh 腳本會出現錯誤

Found a full or partial RockyLinux install already in place. Aborting
because continuing with the migration could cause further damage to system.

修改 migrate2rocky.sh 把出現上面訊息的 if 那一段拿掉,上面的 rpm 補完,再執行一次就可以了

DNS-PERSIST-01 DCV

Let's encrypt 建立的新 DCV 方式  DNS-PERSIST-01 它是用綁定帳號,在域名直接設上 accounturi 的 TXT 資料, 來達到長效授權,之後經由綁定帳號來申請的憑證,就直接過了,不需再設定 DNS 已經上 Staging 環境 (--...