2025-12-27

把wireguard vpn server當跳版,連到cisco vpn server

 假設有一台wireguard vpn server,上面有vpnc (cisco vpn client)連到了其它vpn,現在希望連到這台wireguard vpn server的client,也能同時走vpnc建立的介面路由,以連到 cisco vpn 網段,以下假設vpnc 建立的是tun0,wireguard建立的是wg0 (可用route查看),那麼就照以下步驟設定:

1.修改 /etc/sysctl.conf,允許封包在網卡介面互通:
net.ipv4.ip_forward=1
修改完再sudo sysctl -p

2.修改 /etc/wireguard/wg0.conf,在 [Interface] 區段加入:

# nat forward to tun 0
PostUp = iptables -A FORWARD -i wg0 -o tun0 -j ACCEPT
PostUp = iptables -A FORWARD -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# clear nat rules
PostDown = iptables -D FORWARD -i wg0 -o tun0 -j ACCEPT
PostDown = iptables -D FORWARD -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o tun0 -j MASQUERADE

3.重啟wiregurad服務:
sudo systemctl restart wg-quick@wg0dh2

sudo wg-quick down wg0
sudo wg-quick up wg0

4.client設定檔的 [Peer] 區段加入允許的ip網段(用route查看tun0有哪些網段):
AllowedIPs = 10.0.0.0/24, 163.16.1.0/24
或懶惰點,改為全部允許:
AllowedIPs = 0.0.0.0/0, ::/0

5. 設定vpnc的systemd自啟動(假設設定檔已寫在/etc/vpnc/default.conf):
sudo vi /etc/systemd/system/vpnc.service
===================
[Unit]
Description=Cisco Compatible VPN Client (vpnc) - default profile
After=network.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/vpnc
ExecStop=/usr/sbin/vpnc-disconnect
RemainAfterExit=yes
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
====================
sudo systemctl daemon-reload
sudo systemctl enable vpnc.service
sudo systemctl start vpnc.service

6.讓wireguard在vpnc服務後再啟動:
sudo systemctl edit wg-quick@wg0
==============
[Unit]
After=vpnc.service
Wants=vpnc.service
==============
sudo systemctl daemon-reload
sudo systemctl restart wg-quick@wg0

7. 如果不想dns設定因vpnc連線而被修改,可禁止resolvconf去修改/etc/resolv.conf:
vi /etc/resolvconf.conf
================
# 禁止自動修改DNS設定
resolvconf=no
# 忽略tun0 (vpnc)的dns設定
interface=tun*

8.vpnc的/etc/vpnc/default.conf設定

IPSec secret <group shared key>
IPSec ID <group id>
IPSec gateway <vpn server ip>
Xauth username <user name>
Xauth password <user password>
IKE DH Group <default group, e.g. dh2>
IKE Authmode psk
# prevent connection break, check every 30s
DPD idle timeout (our side) 30

2025-12-19

Ubuntu/Linux Mint 的Cisco VPN (vpnc) 無法連線,出現認證雜湊為MD5不安全

若Cisco VPN Server是舊型的,認證(authentication)的雜湊算法只支援MD5,無法升級到SHA2,那麼在較新版Cisco VPN Client(vpnc)連線時可能會出現要你加入 --enable-weak-authentication 的參數(連線時用journalctl -f可看到),

但如果你用的是NetworkManager的network-manager-vpnc 套件,而不是直接用vpnc指令去連線,那麼也無法直接對指令加參數(因GUI介面也無該選項可勾選),即便修改 /etc/vpnc/default.conf也沒用(因為network-manager-vpnc不會讀取該檔),或修改 /etc/netplan/ 下面NetworkManager的vpnc設定檔也無法加入參數(因為沒有像extra args之類的參數能加),只能靠寫一個vpnc wrapper的shell script來解決:

cd /usr/sbin
sudo mv vpnc vpnc.orig
sudo vi vpnc
==========================
!/bin/bash

# Wrapper for vpnc to enable weak auth for legacy Cisco VPNs
# Original vpnc: /usr/sbin/vpnc.orig

if [[ "$*" == *"--nolaunch" ]]; then
    # Skip if it's a check from Network Manager
    exec /usr/sbin/vpnc.orig "$@"
else
    exec /usr/sbin/vpnc.orig --enable-weak-authentication "$@"
fi
===========================
sudo chmod +x vpnc

這樣在連線Cisco VPN時,就會強制加入該 --enable-weak-authentication 參數了。

2025-12-15

Linux Ubuntu 利用滑鼠側鍵

#安裝工具
 sudo apt install xbindkeys xdotool

#點擊滑鼠側鍵,通常是button 8 或 button 9
xev | grep button

#產生設定檔
xbindkeys --defaults > ~/.xbindkeysrc

#編輯.xbindkeysrc,範例如下:

#button 8 模擬中鍵
"xte 'mouseclick 2'"
b:8 + Release

#button 9 輸出字串
"xdotool type 123456"
b:9 + Release

#button 9 模擬 ctrl+c
"xdotool key ctrl+c"
b:9 + Release

#button  8 模擬 ctrl+v
"xdotool key ctrl+v"
b:8 + Release

#重啟 xbindkeys 載入設定,記得將xbindkeys加到開機啟動
killall xbindkeys && xbindkeys

2025-12-07

Nvidia 顯卡在 Linux Mint / Ubuntu 的 ucsi_ccg_init failed 問題

 dmesg -H -l err 出現以下訊息:

nvidia-gpu 0000:01:00.3: i2c timeout error e0000000
ucsi_ccg 1-0008: i2c_transfer failed -110
ucsi_ccg 1-0008: ucsi_ccg_init failed - -110

這是因為NVIDIA 驅動想透過 I2C 去跟 Type-C 控制晶片(CCG)溝通,但怎麼叫都沒反應,導致一直噴錯誤到 dmesg,這通常 不會影響顯示卡正常運作,只是 log 很醜、偶爾會吵醒系統(影響待機功耗),如果你根本不用 Type-C 充電(或卡上也沒vlink / usb-c DP),可以直接禁掉ucsi_cgg模組/aux i2c/i2c bus:

#方法一,直接關掉ucsi_ccg模組
echo "blacklist ucsi_ccg" | sudo tee /etc/modprobe.d/blacklist-ucsi_ccg.conf

#方法二,關掉aux i2c
echo 'options nvidia NVreg_EnableGpuAuxI2c=0' | sudo tee /etc/modprobe.d/nvidia-fix-i2c-timeout.conf

#方法三,關掉特定 bus
dmesg | grep -i ucsi_ccg #找出哪條噴錯,通常是i2c-10 或 i2c-8
echo 'options nvidia NVreg_RegistryDwords="RMDisableAuxBus=0x10"' | sudo tee /etc/modprobe.d/nvidia-fix-i2c-timeout.conf 

#ramfs update
sudo update-initramfs -u


2025-12-06

Macbook 2012 15" (A1286) 安裝Linux Mint 22 / Ubuntu 24.04

 要解決的問題跟以下這篇差不多:
https://duckfly-tw.blogspot.com/2023/09/macbook-13-2014-ubuntu.html

但還有其它問題:

1.因Macbook 2012 (A1286)有獨顯GT650M,需手動安裝nvidia-470驅動(支援GT650M的最後一版驅動),因上游驅動都變5XX系列了,ubuntu-drivers因顯卡太舊無法安裝驅動,沒安裝nvidia閉源驅動就只能用kernel內建的nouveau開源驅動,效率肯定低。

另外要特別注意的是,nvidia-driver-470只能支援到kernel 6.8.x,再上去dkms driver會無法被新的kernel載入!因此千萬別安裝6.8以上的kernel,即使裝了沒使用也不行(因為會破壞dkms tree造成其它kernel也無法正常運作),如果裝了6.8以上的kernel,務必要移除掉,並重建dkms tree:
sudo dkms autoinstall --all

# 先完全移除 nouveau(黑名單)
sudo rmmod nouveau (若出現無法缷載dkms,略過沒關係)
sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nouveau.conf"
sudo update-initramfs -u

# 加 graphics-drivers PPA(專門放舊版驅動)
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-470

#加裝nvidia-prime nvidia-prime-applet,這樣tool panel才會有nvidia optimus面版可以調整
sudo apt install nvidia-prime nvidia-prime-applet

# 重開機
sudo reboot

# 正確結果會顯示:NVIDIA GeForce GT 650M/PCIe/SSE2  (不再是 NVE7)
glxinfo | grep "OpenGL renderer"


2. 電源管理,安裝下面這個applesmc-next dkms,以便能設定macbook的充電上限:https://github.com/c---/applesmc-next?tab=readme-ov-file
直接複製其bash script以sudo執行後,再複製45-apple的tlp script並重開機:
sudo cp /usr/src/applesmc-next-0.1.6/45-apple /usr/share/tlp/bat.d/

並修改/etc/tlp.conf:
START_CHARGE_THRESH_BAT0=30 #何時開始充電,可能無效
STOP_CHARGE_THRESH_BAT0=80 #何時停止充電

也可以修改以下檔案,設定何時開始充電
sudo echo 80 > /sys/class/power_supply/BAT0/charge_control_end_threshold

再用 tlp-stat -b 檢查設定狀態

或可安裝如Battery Health Charging(使用gnome桌面時)或Slimbook Battery來設定電池的充電上限。

3.原來有多接了一顆hfs+格式的sata硬碟,懶得重新格式化又想在linux上繼續用(預設read only,加force,rw變可讀寫)的話,使用以下選項在fstab掛載:
/dev/disk/by-uuid/<disk-uuid> /mnt/<mount-dir> auto nosuid,nodev,nofail,x-gvfs-show,force,rw 0 0

但如果有不正常關機,導致末正確卸載,檔案系統會標記為「dirty」,下次重新掛載時會強制掛載為唯讀(使用 dmesg | grep -i hfs 檢查),解決方法:

sudo apt install hfsprogs
sudo umount /dev/sdXX (先umount)
sudo fsck.hfsplus -f /dev/sdXX   # -f 強制檢查,即使是 journaled,有提示是否修復按y

4.dmesg出開以下錯誤訊息:
DMAR-IR: [Firmware Bug]: ioapic 2 has no mapping iommu, interrupt remapping will be disabled

#修改/etc/default/grub,修改開機選項
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash irqpoll intremap=off"


ref:
https://wiki.archlinux.org/title/MacBookPro8,x
https://askubuntu.com/questions/767850/firmware-bug-ioapic-2-has-no-mapping-iomm-after-kernel-update

2025-03-26

bind9使用nsupdate+acme.sh申請免費憑證

1.首先要讓bind有ddns的功能,即允許外部使用key來動態更新A或TXT等record ,

先建立key:
=====================================
b=$(dnssec-keygen -a hmac-sha512 -b 512 -n USER -K /tmp foo)

cat > /etc/named/keys/update.key <<EOF
key "mykey" {
    algorithm hmac-sha512;
    secret "$(awk '/^Key/{print $2}' /tmp/$b.private)";
};
EOF
rm -f /tmp/$b.{private,key}

===把key檔路徑include進named的設定中==
include "/etc/named/keys/update.key";
=====================================
然後把domain獨立切出一個zone(範例是只允許TXT紀錄,因為只是要用來申請免費憑證):

=====================================
zone "yourdomain.com" {
    type master;
    file "/path/to/your/zone/file"; 
    update-policy {
        grant "mykey" subdomain yourdomain.com. TXT;
    };
};
==zone file,若無dns沒a紀錄沒有關係=======================

$TTL 86400
@   IN  SOA     ns.yourdomain.com. admin.yourdomain.com. (
                2023101001 ; Serial number
                3600       ; Refresh interval (one hour)
                1800       ; Retry interval (30 minutes)
                1209600    ; Expire time (two weeks)
                86400      ; Minimum TTL (one day)
)

@  IN A 1.2.3.4
* IN A 1.2.3.4
=====================================

安裝acme.sh(一般使用者即可,當然用root會更方便些):
curl https://get.acme.sh | sh -s email=my@yourdomain.com

wget -O -  https://get.acme.sh | sh -s email=my@yourdomain.com

建立帳號並決定使用哪個免費憑證服務(預設zerossl):
acme.sh  --register-account  -m myemail@yourdomain.com --server zerossl
如要用letsencrypt的話:
acme.sh --set-default-ca  --server letsencrypt
acme.sh  --register-account  -m myemail@yourdomain.com --server letsencrypt

設定讓acme.sh自動更新:
acme.sh --upgrade --auto-upgrade

開始申請憑證(此範例為申請wildcard憑證),此處的key格式要與named include的一樣就可以了:
export NSUPDATE_SERVER="dns.yourdomain.com"
export NSUPDATE_KEY="/path/to/your/update.key"
export NSUPDATE_ZONE="yourdomain.com"

~/.acme.sh/acme.sh --issue --dns dns_nsupdate -d yourdomain.com -d *.yourdomain.com --renew-hook "/path/to/install_cert.sh"

上面指令中的install_cert.sh即憑證renew成功後要執行的動作(複製憑證+重啟web):
憑證申請成功後,先手動複製憑證+重啟web(做第一次即可)
~/.acme.sh/acme.sh --install-cert -d yourdomain.com --key-file /certs/path/yourdomain.com/key.pem --fullchain-file /certs/path/yourdomain.com/fullchain.pem --reloadcmd "sudo systemctl restart nginx.service"

因為要讓一般使用者可以重新啟動web server,需加上sudoer:
#/etc/sudoers.d/acme_install_cert
username ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx.service

這樣以後每60天會自動renew憑證,且會自動複製憑證並重啟web server。

其它:
安裝acme.sh時,會自動在使用者的crontab加上以下指令,固定每天檢查憑證:
51 1 * * * "/home/username/.acme.sh"/acme.sh --cron --home "/home/username/.acme.sh" > /dev/null

~/.acme.sh/account.conf 在申請憑證完後,會把一開始export的環境變數儲存在這裡,其它設定也會放在這個檔

~/.acme.sh/yourdomain.com_ecc/yourdomain.com.conf 會放一些跟這個網域有關的設定,如
Le_API=使用的憑證廠商api
Le_RenewHook=renew hook
Le_RealKeyPath=key要複製的路徑
Le_RealFullChainPath=fullchain要複製的路徑
Le_ReloadCmd=重啟指令

ref:
https://github.com/acmesh-official/acme.sh/wiki/dnsapi#7-use-nsupdate-to-automatically-issue-cert
https://github.com/acmesh-official/acme.sh/wiki/Server
https://ezbox.idv.tw/180/bind-ddns-dynamic-dns/
https://cwza.github.io/my_blog/2015/12/02/Bind9%E7%9A%84Dynamic-Dns-Update%E8%A8%AD%E5%AE%9A%E7%AD%86%E8%A8%98/
https://ithelp.ithome.com.tw/articles/10062006
https://n.sfs.tw/content/index/11984?u=
https://bugs.launchpad.net/ubuntu/+source/bind9/+bug/2015176
https://www.hobrasoft.cz/en/blog/bravenec/acme-sh-renew-hook