跳到主要內容

發表文章

用 Linux 的 ipset 建立大量黑名單替換 Apache 的 .htaccess 黑名單方法

雲主機建好 LAMP 之後,接下來最重要的是建立 L3 及 L4 防火牆規則,把一些爬蟲、代理池與高風險國家 IP 區段封鎖,減輕硬碟的 I/O 壓力。 不然每隔幾秒就來一次請求,就算 L7 應用層有高階防爬蟲機制,還是會消耗雲主機的算力。 當然最好是在路由端用硬體防火牆清洗,但因為是雲主機沒有實體路由,因此改用 Linux kernel 層級的黑名單系統 ipset 也能達到 L3 與 L4 清洗效果,讓 Apache/PHP 完全碰不到,不吃 CPU、不吃 I/O。 經過實際執行、爆肝測試後,去除所有失敗方法,以下為正確建立ipset 黑名單的方法: 1、建立 ipset sudo ipset create blacklist hash:ip 如果看到: ipset v7.x.x: Set cannot be created: already exists 代表曾經建立過,需要 destroy。 如果返回: Command 'ipset' not found, but can be installed with: apt install ipset 表示 Linux 初始環境沒有預裝 ipset,輸入以下指令安裝: sudo apt update sudo apt install ipset -y 完成後驗證: ipset list 如果返回: ipset v7.x.x: The set with the given name does not exist 表示 ipset 已成功安裝(但還沒建立 blacklist)。 2、建立一份「只有網段」的列表檔 輸入指令建立 sudo nano /root/blacklist.txt 貼上以下內容(改成您自己的IP名單) 1.0.1.0/24 1.0.2.0/23 1.0.8.0/21 1.0.32.0/19 (略…) Ctrl+O 儲存 → Enter 確認 → Ctrl+X 返回。注意:一定要用 nano 建立,避免 BOM/CRLF 問題。 3、建立自動載入腳本 輸入指令建立 sudo nano /usr/local/bin/ipset-load.sh 貼入以下腳本 #!/bin/bash # 建立 blacklist(若存在就忽略) ipset create blacklist hash:net...
最近的文章

雲主機設定 VirtualHost 方法(將 www 與 IP 自動 301 轉向單一網址)— SEO 最佳化

完成雲主機 LAMP 架設後,下一步就是把 DNS 指向新空間。但此時你可能會遇到一個常見問題: www.website.com 可以進入網站 website.com 也能進入網站 伺服器 IP 也能直接打開網站 等於一個網站有三個入口。 這會造成: 搜尋引擎收錄混亂(www / non-www / IP 三份內容) SEO 分數被分散 資料表的網址寫入不一致(有 www、有 IP、沒 www 都混在一起) 因此,我們需要建立 VirtualHost 來統一入口,讓所有訪問都自動轉向單一網址(正規化 Domain),方法如下: 1、建立 VirtualHost 設定檔 sudo nano /etc/apache2/sites-available/default_host.conf 貼上以下內容(http): <VirtualHost *:80>     ServerName website.com     ServerAlias www.website.com     RewriteEngine On     # 不管是 website.com、www.website.com、或 IP / 其它 Host     # 一律丟到 https://website.com     RewriteRule ^/(.*)$ https://website.com/$1 [L,R=301] </VirtualHost> 請把 website.com 改成你自己的網址 。 如果有啟用SSL功能(https),請再增加443部分 <VirtualHost *:443>     ServerName website.com     ServerAlias www.website.com     RewriteEngine On     DocumentRoot /var/www/html     # 如果有資料夾要轉首頁一併處理     RewriteCond %{REQUEST_URI} ^/ folder (/...

使用雲主機Xoops資料夾權限設定方法(安全)

由於早期網站大多租用虛擬主機,主機商(虛擬主機)不開放 owner 權限設定。FTP 上傳的檔案都是你自己的 user,但 Apache 執行的身分是 www-data(或 nobody)。因此 Apache 無法寫入 FTP 上傳的目錄。能讓 PHP 寫入資料的唯一方法,就是把資料夾權限設為 777(完全開放) 。 但現在已經 2025 年,這個方法在現代 雲主機 = 直接開大門請人入侵、請人來挖礦 。 只要輸入像下面這種命令: curl -T shell.php http://website.com.tw/uploads/ 把一句話木馬丟進去。或者: curl -X PUT -d "<xml>亂碼" http://website.com.tw/uploads/ 整個 uploads 直接被毀。 好在時代進步,多數虛擬主機資料夾,只要設成 755 就能讓 PHP 正常存取(因為 suPHP 或 CageFS) 。至於雲主機或 VPS,則應該使用以下方法取代 777: 設定資料夾權限(替代777方法) chmod -R 775 /var/www/xuploads chown -R www-data:www-data /var/www/uploads 設定檔案權限(替代777方法) chown www-data:www-data /var/www/html/xsitemap.xml chmod 664 /var/www/html/xsitemap.xml 這是 XOOPS 上雲後最安全 & 最正確的權限組合。 Apache 能寫、你能寫、非權限者不能寫 → 完美安全模型。 XOOPS 正確安全權限(建議清單) 目錄   權限  owner uploads   775  www-data xoops_data/caches   770  www-data xoops_data/configs   770   www-data xoops_data/data   770  www-data xoops_data/protector      770  www-data xoops_lib/module...

Ubuntu主機ssh指定固定ip連線方法(防止掃描及暴力破解)

除非是內網段私有雲,不然一般 VPS 或雲主機的預設模式 ssh 是完全開放的,Port 22 對 0.0.0.0/0 全世界開放,只要知道 IP + 密碼即可登入,如果不是使用金鑰方式連線,非常建議建立 UFW 防火牆規則,將 SSH 登入限制為固定 IP 白名單,否則 SSH 端口可能每分鐘被測試 50~100 次。 這些都是正常的掃描行為: Failed password for root from 152.xx.xx.xx Failed password for root from 103.xx.xx.xx Invalid user ubuntu from 185.xx.xx.xx LOG 膨脹事小,如果密碼真的被猜出來,整台雲主機等於送給駭客當挖礦機玩具。 因此必須建立 SSH 白名單,方法如下: 步驟 1:安裝 UFW 防火牆(Ubuntu 標準 L4 防護) apt update apt install ufw -y 步驟 2:只允許你家 / 公司電腦的固定 IP 連線 SSH ( 紅色部分請改為您的固定 IP) ufw allow from 125.227.xxx.xxx to any port 22 步驟 3:封鎖全世界的 SSH(IPv4/IPv6 全封) ufw deny 22/tcp ufw deny 22 步驟 4:開放網站必要 Port ufw allow 80 ufw allow 443 步驟 5:檢查是否存在錯誤規則(如有 → 必刪) ufw status numbered 若有出現以下規則必須刪除,否則 SSH 白名單無效: 1、全世界允許 SSH(危險) [ 1] 22/tcp ALLOW IN Anywhere 刪除 → ufw delete 1 2、IPv6 全世界允許 SSH [ 6] 22/tcp (v6) ALLOW IN Anywhere (v6) 刪除 → ufw delete 6 步驟 6:啟動防火牆(開始生效) ufw enable 提示: Command may disrupt existing ssh connections Proceed with operation (y|n)? 輸入:y 成功後顯示: Firewall is active and enabled on system startup 完成...

升級Ubuntu22.04(Apache / PHP ) Ondřej Surý 的 PPA套件方法

當初使用 Ondřej Surý 的 PPA套件安裝(Apache / PHP )就是為了解決惱人的資安通報,果然網站上線沒多久通報就來了,這次主要有兩項要升級(Apache要高於2.4.64 / PHP要高於8.3.23),剛好來試看看傳說中的 PPA套件升級到底有多容易,以下是升級完整步驟紀錄 先備份檔案以防萬一 (但最終是沒用到備份檔,因為升級檔不會覆蓋到原始檔,這裡要給他5顆星的評價) sudo mkdir -p /root/apache_backup_$(date +%Y%m%d) sudo cp /etc/php/8.3/apache2/php.ini /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/sites-available/default-ssl.conf /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/mods-available/ssl.conf /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/apache2.conf /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/conf-available/security.conf /root/apache_backup_$(date +%Y%m%d)/ sudo cp /etc/apache2/ports.conf /root/apache_backup_$(date +%Y%m%d)/ 這樣所有重要設定就會備份到 /root/apache_backup_ 20251020 /,如果升級後有任何異常,你只要: sudo cp /root/apache_backup_ 20251020 /* /etc/apache2/... sudo systemctl reload apache2 就能一鍵復原 (紅字為今天日期) 再來升級Apache 1、更新套件列表:  sudo apt update 2、升級 Apache : sudo apt install --only-upgrade apache2 備註: 如果發生Progre...

Google行事曆設定和共用的方法,可以讓多人共同發佈事件在同一個月曆上!!(共同管理)

Google行事曆有一個功能就是可以【設定和共用】,讓多人共同發佈事件在同一個月曆上,共同管理,例如建立了一個主行事曆,然後要讓A,B,C能同時在這主行事曆上發佈事件(新增/編輯/刪除),方法很簡單的,首先,先要取得A,B,C的E-MAIL帳號 然後前往Google行事曆首頁,左下方的我的日曆,找到需要共同發佈事件的月曆,點選右邊的【行事曆選項】 會彈出視窗,選擇【設定和共用】 找到【共用對象】,下面有一個【新增使用者和群組】 點選後會彈出視窗,這裡輸入A,B,C的E-MAIL帳號(可連續操作),下面的權限選擇【進行變更並管理共同設定】(或是按需求自定) 完成後點選右下角的傳送,這樣A,B,C就會收到共用日曆的邀請,點選郵件中的【加入共用日曆】就可以在主日曆中發佈事件 最後是A,B,C如果要將事件發佈在主日曆,建立事件時,左邊有一個行事曆的ICON及下拉選單,選單要選取主日曆的名稱,不然事件會發在自己的日曆上,主日曆不會顯示。 為了避免日後又忘記操作步驟,寫成工作紀錄保存,順便分享給有需要的朋友參考! 工作心得撰寫: 徐嘉裕 Neil hsu

用CSS做出來一個文字漸層+文字白框+文字陰影的LOGO區塊,CSS最終解法並符合無障礙

網站符合無障礙已經是當今的趨勢了,所以在設計LOGO動畫上不能再用傳統的canvas動畫,因為圖片沒版法自流動,無法符合無障礙AA的CRTL+200放大版面流動效果,只能全部改為CSS+純文字,問題不是在動畫,而是如何用CSS至少能做出70%能像PSD圖檔那樣的文字效果,美觀也是要兼顧,經過努力研究與資料參考,終於寫出來這個【文字漸層+文字白框+文字陰影】CSS效果,如下圖: 以下就是整個代碼結構 透過F12撈出來的HTML結構 <div id="logoimgbox2" aria-label="桃園市立富岡國民中學" > <span aria-hidden="true" tabindex="-1" class="logo_01" data-storke="桃園市立" >桃園市立</span> 略.......................... </div> 說明 aria-label是給讀報軟體用的讀報資訊 aria-hidden="true" tabindex="-1" 是讓讀報軟體不要讀取容器中的文字,因為用了 ::before建構一個文字在底層,同樣文字被讀報兩次會被列缺失 data-storke是給CSS ::before的: attr(data-storke);用的 以下為CSS代碼 #logoimgbox2 {     position: absolute;     top: 44px;     left: 174px;     color: #181818;     font-size: 290%;     word-break: break-all;     font-family: Noto Sans TC;     font-weight: 600;     filter: drop-shadow(1px 1px 3px rgba(0, 0, 0, .5));  // 文字陰影(黑色)     letter-spacing: 0.6rem; } #logoimgbox2 .logo_...