使用 Raspberry Pi 4 Model B 做反向代理伺服器

目標是要使用硬體 Raspberry Pi 4 Model B - 8G 來做反向代理伺服器, 並且服務需要可以轉發 TCP 與 UDP.

此方案適用於少人數的反向代理伺服器, 且成本較低.

初始化

由於是反向代理伺服器, 所以需要 IP 固定. 硬體為 Raspberry Pi 4 Model B, 安裝了 OS ubuntu 22.04, 設定方式如下.

1apt -y update && apt upgrade # 主機套件更新
2ip a # 確認網路卡為 eth0
3vim /etc/netplan/50-cloud-init.yaml
 1network:
 2    ethernets:
 3        eth0:
 4            dhcp4: no
 5            addresses:
 6              - 192.168.1.100/24  # Set your desired static IP address and subnet mask
 7            routes:
 8              - to: 0.0.0.0/0  # Define the default route
 9                via: 192.168.1.1  # Set your gateway/router IP address
10            optional: true
11    version: 2
1netplan apply # 重新啟動服務

發現一個現象, 透過設定 IP address, 可以發送非本地的 IP. 當設定 dhcp4: yes 且配置了 addresses 時, 會是 dhcp 還是 static IP. 測試下來機器的 IP 會是 dhcp 所配的 IP; 發出去的封包會是以 addresses 所設定, 且這現象無法跨網段.

從上面的範例為案例, 紀錄測試的結果, 如下:

  1. dhcp 使用的網段是 192.168.1.0/24 被分配到的 IP 是 192.168.1.195, addresses 設定的是 192.168.1.100 的話, 發出去的封包來源 IP 會是 192.168.1.100.
  2. dhcp 使用的網段是 192.168.1.0/24 被分配到的 IP 是 192.168.1.195, addresses 設定的是 192.168.2.100 的話, 發出去的封包來源 IP 會是 192.168.1.195.

反向代理伺服器

Nginx

結果: 成功代理, upstream 收到的都是 reverse proxy 的 IP

官方演示 # TCP and UDP Load Balancing

 1apt install nginx
 2cd /etc/nginx
 3cp -rf nginx.conf nginx.conf.origin
 4cat >> sites-available/default << EOF
 5stream {
 6    upstream backend {
 7#        hash $remote_addr consistent;
 8        server 192.168.1.133:80 weight=5;
 9    }
10
11    upstream dns {
12#       hash $remote_addr consistent;
13       server 192.168.1.133:53;
14    }
15
16    server {
17        listen 80;
18        proxy_pass backend;
19    }
20
21    server {
22        listen 53 udp reuseport;
23        proxy_pass dns;
24    }
25}
26EOF

HAProxy

結果: 失敗代理, 不支援 UDP.

1apt install haproxy
2vim /etc/haproxy/haproxy.cfg
1frontend external_tcp
2    bind *:80
3    mode tcp
4    default_backend internal_tcp
5
6backend internal_tcp
7    mode tcp
8    server webserver1 192.168.1.133:80
1service haproxy restart
comments powered by Disqus