###### tags: `1121` `lsa` `ncnu`
# SSH & Web Server
- Book mode: https://hackmd.io/@ncnu-opensource/book
[TOC]
## 進階延伸
* SSH Tunnel
* 基於 SSH Protocol 所延伸的技術
* 將網路上的 A、B 兩個端點用 Tunnel 連接起來,形成一個隧道
* 基本過程:
* A 點上的某個 Port X 所傳送的資料轉送至 B 點上的 Port Y
* 又被稱 Port Forwarding
* 好處:
* 可突破防火牆限制
* 如防火牆有擋掉特定 port,沒有擋掉 22 port,可利用此種方式穿透此限制
* 將通訊內容加密避免洩漏
* 利用 SSH 加密特性來進行通訊
* Tunneling 中通常會出現以下三種角色:
* Client
* 任何你可以敲 ssh 指令來啟動 Port Forwarding 的機器
* SSH Server
* 可以被 Client 用 SSH 連進去的機器
* Target Server
* 某一台你想建立連線的機器,通常是為了對外開放這台機器上的服務
* Client 與 SSH Server 本身都可以是 Target Server,不是真的要有三台機器才可以進行Port Forwarding!
### Local Port Forwarding
* 語法:
* `ssh -L [bind_address:][port]:[host]:[host_port] [SSH Server]`
* `[bind address:]` 不輸入預設為 `localhost`
* 情境一:`FIXME: 帶個實際數字舉例`

* 防火牆後有一台 Server ,但防火牆設定不接受 8080 port 連入,不過接受22 port
* 使用 tunneling 將 Client 中的某個port(圖中範例 port 9090),完成繞過防火牆限制

* `ssh -L 9090:localhost:8080 [username]@[server]`
* Client
* 你的電腦
* SSH Server
* 防火牆後的Server
* [username]@[server]
* Target Server
* 防火牆後的Server
* localhost 8080
>`bind address` 沒輸入代表使用預設 localhost
>如果要開放對外可以改成 `0.0.0.0`
>`host` 的`localhost` 是只針對 `server`的 `localhost`
* **情境二**: FIXME: 帶個實際數字舉例

* 前面情境為 Server 能連入的情況,那如果今天全線不足以進入要怎麼辦
* 如果防火牆後有一台你的機器且可用`ssh`連入即完成

* `ssh -L 9090:192.168.2.10:8080 [username]@[server]`
* Client
* 你的電腦
* SSH Server
* 防火牆後的Server
* [username]@[server]
* Target Server
* 防火牆後的Server
### Remote Port Forwarding
* 語法
* `ssh -R [bind_address:][port]:[host]:[host_port] [username]@[server]`
* **情境一**:

* 你的電腦上完成了一個服務,並架上 8080 port,但你的電腦沒有對外ip,僅有內部ip
* 準備一台有Internet 的機器當作對外機器,即可使用Remote Forwarding 完成
* 對外機器開啟一 port客戶連入(圖片範例port 9090)
* 對外機器藉由SSH通道將傳送到port 8080,客戶即可取得服務

* `ssh -R 0.0.0.0:9090:localhost:8080 [username]@[SSH Server]`
* 因為要開放對外,所以設定`0.0.0.0`
* localhost 是針對你的電腦
* Client
* 你的電腦
* SSH Server
* 對外機器
* Target Server
* 你的電腦
:::warning
* 基於安全考量,Remote Forwarding 的預設都只能夠bind在SSH Server的localhost上
* 所以必須要改變設定檔
* `GatewayPorts yes`
:::
<!--
:::info
| Alice | Bob | Chris |
| -------- | -------- | -------- |
| 想吃糖果 | 工具人 | 8080號門後花園裏面有糖果 |
- Alice 想吃糖, 但是 Chris 8080號門沒開, 只好從 22號門進去找路.
```bash=
ssh -L 9090:localhost:8080 chris@chris.家.地.址
```
- Alice 上次偷晚糖果后, Chris 不開心, 22號門關起來了. 只好去找 Bob, 讓他幫 Alice 拿 Chris 的糖果.
```bash=
- ssh -L 9090:Chris.家.地.址:8080 bob@bob.家.地.址
```
-
:::
-->
- 情境二
- 
- 與情境一不同,服務另外架在其他機器上
- 一樣可以使用Remote Forwarding

* `ssh -R 0.0.0.0:9090:192.168.1.100:8080 [username]@[SSH Server]`
* `192.168.1.100` 為內部服務ip(相對於你的電腦)
* Client
* 你的電腦
* SSH Server
* 對外機器
* [username]@[server]
* Target Server
* 內部服務
* `192.168.1.100:8080`
### Dynemic Port Forwarding
* 語法
* `ssh -D [bind_address]:[port] [username]@[SSH Server]`
* 情境

* 只要有一台位於內網且具有外部IP的機器,你就可以利用這個方法建立一個SOCKS代理伺服器,讓你能夠從外面連回內網裡的所有服務

:::info
ftp 10.107.21.201
anonymous
學號
cd practice
get File.txt
bye
:::
:::info
### 甚麼是Server
- 提出要求的時候,以任何形式提供回應的,就可以稱為service
- 用來提供這些Service的軟體、電腦,就可以稱為Server
- 種類有很多
- database server、file server、FTP server、DNS server、**Web Server**...
- Server 的功能很多,些我們每天都會使用
- DNS server
- 可以透過紀錄Domain Name,讓我們不用記一串IP也能連到網站
:::
## Web Server
### 什麼是Web Server?
* 提供Web 相關服務的Server
* 希望網頁可以被世界各地任何上網路的人在瀏覽器上讀出來
>在電腦主機上執行 Web server,他可以幫主機開一個80 port(預設),此時別人就能透過該電腦主機的ip與他建立連線
>
* 存放網路伺服器軟體、還有網站檔案的主機
* HTML、CSS、JavaScript、圖片、影片
>
### HTTP
* 全名是 Hypertext Transfer Protocol,中文讀作「超文本傳輸協定」
* Client 和 Server 就是透過HTTP協定進行溝通
* Application layer
* 預設 port:80 port
>
>通常Client端指的是Browser(瀏覽器)
>SSH 已經有提到
- IP +數字編號
- `127.0.0.1:80`
- 用於區分同一個IP地址下的不同服務
`/etc/services`
- 記錄各式各樣服務會佔用的port
- `cat/etc/services`
- service name,port number,Protocol,aliases(別名)
- 
- SMTP service uses TCP on port 25 and also goes by the alias"mail."
- 查看現在開啟的port
- netstat-atupl
- 
- `Proto`:封包 or 通訊協定
- `Local Address`:本地的IP與port,如果`/etc/services`存在對應服務名稱,就以服務名稱顯示
- `Foreign Address`:監聽哪一個IP與Port
- `state`:狀態列
- `LISTEN`:表示該port已經在監聽 網路服務
- `ESTABLISHED`: 已建立連線
- `TIME_WAIT`:該連線目前是等待狀態,隨時都有可能斷線
:::info
參數說明:
`-a`:顯示出目前所有的網路連線狀
`-t`:顯示tcp封包
`-u`:顯示udp封包
`-p`:顯示此連線的PID
`-l`:顯示LISTEN的內容
`-n`:預設情況中,顯示出的host會依host name來顯現,若為n則可以使port與host都以數字顯示
>FIXME:`netstak -atupl` &`netstat -tupl`差異
:::
>1.試試`-n`
>2.打開firefox,輸入`netstat -ntupl`
>3.kill pid
### 常見的Web Server簡介
- Lighttpd(發音為"lighty")
- 
- 佔用系統資源少,運作輕量
- 低記憶體佔用,低CPU負載,速度最佳化
- 支援CGI,FastCGI,SCGI,允許使用任何程式語言撰寫Web應用程式
- 在提供靜態內容方面高效,但動態內容可能會消耗比較多資源
- 靜態內容:預先創建的文件,例如HTML,CSS,和JavaScript
- 動態內容:像是php,需要的client傳送才會有內容
-適合提**靜態內容**或系統資源比較守限
- **Nginx**
- 
- 佔有記憶體少,穩定性高,可以同時 承受很大的流量
- 採用模組化設計,有大量的模組庫和第三方模組庫可供選擇
- 設計的目標是為了超越Apache,並且在2019成功超越Apache成為市場佔有率最高的
:::danger
本次課程安裝順序依照Lighttpd->Apache2->Nginx
:::
### 安裝與介紹
:::info
`sudo apt install lighttpd` 安裝lighttpd
`sudo service lighttpd status` 檢查狀態
`sudo service lighttpd start` 開服務服務
`sudo service lighttpd reload` 不停止服務,重載設定檔
`sudo service lighttpd restart`停止服務重新開啟
`sudo netstat -ntupl` ::查看port號
`127.0.0.1:[port_num]` 成功開啟
`cd /etc/lighttpd/`開啟設定檔位置
`/etc/lighttpd/conf-available`可用但還沒啟用
`/etc/lighttpd/conf-enabled`放到enable才可以啟用
`sudo ln -s /etc/lighttpd/conf-available/<modules>.conf
/etc/lighttpd/conf-enabled/` 把conf檔移到enabled
`sudo service lighttpd reload `:要reload完才可以用
`sudo lighttpd-enable-mod <modules>`另外一種將conf檔**啟**用的方法
`sudo lighttpd-disable-mod <modules>`另外一種將conf檔**停**用的方法
!!檔案紅色是代表沒有成功!!
:::

`cd /var/www/html`
`sudo vim index.html`
`sudo service lighttpd restart`
`sudo rm index.html`
`sudo vim test.html`
`sudo vim lighttpd.conf`
進入lighttpt.conf改port號

[其他屆的](https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2F6SlrzT4jT8mfeTqvq42BiA%3Fview)