我很早就想在網路服務上“動手”,從頭開始建立網頁伺服器,並將其發佈到網路上。在本文中,我想分享我將家庭路由器從功能強大的設備轉變為幾乎成熟的伺服器的經驗。
這一切都始於這樣一個事實:曾經忠實服務的 TP-Link TL-WR1043ND 路由器不再滿足家庭網路的需求;我想要 5 GHz 頻段并快速訪問連接到路由器的存儲設備上的文件; 。在瀏覽了專業論壇(4pda、ixbt)、有評論的網站並查看了當地商店的分類後,我決定購買 Keenetic Ultra。
業主的好評對這款特定設備有利:
- 沒有過熱問題(這裡我們不得不放棄華碩的產品);
- 運行可靠性(這裡我劃掉了TP-Link);
- 易於設定(我擔心我無法處理它並劃掉了 Microtik)。
我不得不接受缺點:
- 沒有WiFi6,想帶個設備,為以後儲備;
- 4 個 LAN 端口,我想要更多,但這不再是家庭類別。
結果,我們得到了這個「伺服器」:

- 左邊是Rostelecom的光端機;
- 右邊是我們的實驗路由器;
- 閒置的2GB m.128 SSD,放在速賣通的USB3盒子裡,用線連接到路由器,現在整齊地掛在牆上;
- 前景是一條帶有獨立斷開插座的延長線,它的電線連接到一台廉價的 UPS;
- 背景有一堆雙絞線——在裝修公寓的階段,我立刻在應該放置設備的地方規劃了RJ45插座,以免依賴WiFi亂七八糟。
那麼,我們有了設備,我們需要配置它:

- 路由器的初始設定大約需要2分鐘,我們向提供者指示連接參數(我的光纖終端切換到橋接模式,PPPoE連接解除路由器),WiFi網路的名稱和密碼 - 基本上就是這樣,路由器啟動並工作。

我們在「網路規則-轉送」部分設定將外部連接埠轉送到路由器本身的連接埠:


現在我們可以繼續“高級”部分,這是我想要從路由器獲得的:
- 家庭網路小型 NAS 的功能;
- 為多個私人頁面執行網頁伺服器功能;
- 個人雲端功能,用於從世界任何地方存取個人資料。
第一個是使用內建工具實現的,不需要太多努力:
- 我們使用專門用於此角色的磁碟機(快閃磁碟機、讀卡機中的記憶卡、外部盒中的硬碟或 SSD)並使用以下命令將其格式化為 Ext4: (我手邊沒有安裝Linux的電腦,可以使用內建工具)。據我了解,在操作過程中,系統僅將日誌寫入閃存驅動器,因此,如果您在設置係統後對其進行限制,如果您打算經常向驅動器寫入大量數據,也可以使用存儲卡 - SSD 或硬碟更好。

之後,我們將驅動器連接到路由器並在系統監視器螢幕上觀察它

點擊“USB驅動器和印表機”進入“應用程式”部分,然後在“網路”部分設定共用資源。 Windows»:

我們有一個網路資源,可以從以下電腦使用: Windows如有必要,將其連接為磁碟:net use y: \192.168.1.1SSD /persistent:yes
這種簡易 NAS 的速度對於家庭使用來說已經足夠了;透過電線它可以使用整個千兆位元,透過 WiFi 速度約為 400-500 兆位元。

設定儲存是配置伺服器的必要步驟之一,那我們需要:
和一個靜態IP位址(你可以透過使用動態DNS來做到這一點,但我已經有一個靜態IP,所以事實證明它更容易使用 ,我們在我們的網域上接收 DNS 託管和郵件);

並新增指向您的IP的A記錄:

網域和 DNS 委派設定需要幾個小時才能生效,因此我們正在同時設定路由器。
首先,我們需要安裝 Entware 儲存庫,從中我們可以在路由器上安裝必要的軟體套件。我利用了 ,只是沒有透過FTP上傳安裝包,而是直接在先前連接的網路磁碟機上建立一個資料夾,並按照通常的方式將檔案複製到那裡。
透過 SSH 取得存取權限後,使用 passwd 指令變更密碼,並使用 opkg install [package name] 指令安裝所有必要的軟體包:

在安裝過程中,以下軟體包已安裝在路由器上(opkg list-installed 指令的輸出):
包列表
bash - 5.0-3
busybox - 1.31.1-1
ca 捆綁包 - 20190110-2
ca-證書 - 20190110-2
coreutils - 8.31-1
coreutils-mktemp - 8.31-1
克朗-4.1-3
捲曲 - 7.69.0-1
diffutils - 3.7-2
掉落熊 - 2019.78-3
entware-release - 1.0-2
findutils - 4.7.0-1
glib2 - 2.58.3-5
grep - 3.4-1
ldconfig - 2.27-9
libattr - 2.4.48-2
libblkid - 2.35.1-1
libc-2.27-9
libcurl - 7.69.0-1
libffi-3.2.1-4
libgcc - 8.3.0-9
libiconv-full - 1.11.1-4
libintl-full - 0.19.8.1-2
利布盧阿 - 5.1.5-7
libmbedtls - 2.16.5-1
libmount - 2.35.1-1
libncurses - 6.2-1
libncursesw - 6.2-1
libndm - 1.1.10-1a
libopenssl - 1.1.1d-2
libopenssl-conf - 1.1.1d-2
libpcap - 1.9.1-2
libpcre - 8.43-2
libpcre2 - 10.34-1
libpthread - 2.27-9
libreadline - 8.0-1a
庫 - 2.27-9
libslang2 - 2.3.2-4
libssh2 - 1.9.0-2
libssp - 8.3.0-9
libstdcpp - 8.3.0-9
利布伊德 - 2.35.1-1
libxml2 - 2.9.10-1
區域設定 - 2.27-9
MC-4.8.23-2
ndmq-1.0.2-5a
nginx-1.17.8-1
openssl-util - 1.1.1d-2
opkg — 2019-06-14-dcbc142e-2
選擇 ndmsv2 - 1.0-12
php7 - 7.4.3-1
php7-mod-openssl - 7.4.3-1
窮盒子 - 1.31.1-2
術語資訊 - 6.2-1
zlib-1.2.11-3
亞洲區資訊 - 2019c-1
歐洲地區資訊 - 2019c-1
也許這裡有多餘的東西,但驅動器上有很多空間,所以我沒有費心去查看它。
安裝軟體包後,我們配置 nginx,我用兩個網域進行了嘗試 - 第二個網域配置了 https,現在有一個存根。使用內部連接埠 81 和 433 而不是 80 和 443,因為路由器管理面板掛在普通連接埠上。
等/nginx/nginx.conf
user nobody;
worker_processes 1;
#error_log /opt/var/log/nginx/error.log;
#error_log /opt/var/log/nginx/error.log notice;
#error_log /opt/var/log/nginx/error.log info;
#pid /opt/var/run/nginx.pid;
events {
worker_connections 64;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log /opt/var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 81;
server_name milkov.su www.milkov.su;
return 301 https://milkov.su$request_uri;
}
server {
listen 433 ssl;
server_name milkov.su;
#SSL support
include ssl.conf;
location / {
root /opt/share/nginx/html;
index index.html index.htm;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
</spoiler>
<spoiler data-gt-translate-attributes='["title"]' title="etc/nginx/ssl.conf">
ssl_certificate /opt/etc/nginx/certs/milkov.su/fullchain.pem;
ssl_certificate_key /opt/etc/nginx/certs/milkov.su/privkey.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /opt/etc/nginx/dhparams.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_stapling on;為了使網站能夠通過 https 運行,我使用了眾所周知的脫水腳本,並使用 。這個過程沒有造成任何困難,我只是偶然發現在我的路由器上工作的腳本文字中 /opt/etc/ssl/openssl.cnf:
[openssl_conf]
#engines=engines我注意到,在我的路由器上使用命令“openssl dhparam -out dhparams.pem 2048”來產生 dhparams.pem 需要兩個多小時,如果沒有進度指示器,我會失去耐心並重新啟動。
收到憑證後,使用指令「/opt/etc/init.d/S80nginx restart」重新啟動nginx。原則上,設定已完成,但還沒有網站 - 如果我們將 index.html 檔案放在 /share/nginx/html 目錄中,我們將看到一個存根。
的index.html
<!DOCTYPE html>
<html>
<head>
<title>Тестовая страничка!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Тестовая страничка!</h1>
<p>Это простая статическая тестовая страничка, абсолютно ничего интересного.</p>
</body>
</html>我發現,為了美觀地放置訊息,對於像我這樣的非專業人士來說,在各種目錄中進行長時間搜尋後,使用現成的模板會更容易; - 有許多不需要歸屬的免費範本(這在互聯網上很少見;許可證中的大多數範本都要求您保存指向其獲取資源的連結)。
我們選擇一個合適的模板 - 有適合各種情況的模板,下載存檔並將其解壓縮到 /share/nginx/html 目錄中,您可以在電腦上執行此操作,然後編輯模板(這裡您需要最少的知識HTML 以免破壞結構)並取代圖形,如下圖所示。

總結:原則上,路由器非常適合在其上託管輕型網站 - 如果您不期望負載很大,則可以 ,並嘗試更複雜的專案(我查看了 nextcloud/owncloud,在此類硬體上似乎有成功的安裝)。安裝軟體包的能力增加了它的實用性——例如,當需要保護本地網路上PC的RDP連接埠時,我在路由器上安裝了knockd——並且只有在連接埠knock之後才打開到PC的連接埠轉送。
為什麼是路由器而不是普通電腦?路由器是許多公寓中為數不多的全天候工作的電腦硬體之一;家庭路由器通常是絕對安靜的,每天訪問量少於一百次的輕型站點根本不會打擾它。
來源: www.habr.com
