用 NodeJS 簡單製作 Socks5 代理 – simple-socks

前言

我經常讓瀏覽器使用 Socks5 代理來上網,不過很多時候都是使用第三方的。但是如果我要在我自己自有的 VPS 伺服器上架設,那可以怎麼做呢?因此我都使用 simple-socks 來建立,這篇文章就是講講架設方式。

行前準備

在那開始之前,我們需要先安裝好 npm 及 NodeJS,你也可以在 Windows 上安裝,但這篇文章主要講述 Linux 的操作。

sudo apt-get install -y npm nodejs

如果你想要更新到最新版本,你可以參考這篇文章:

Linux 更新 Node.js 到最新版本

接著建立一個資料夾並前往,例如我放在 /var 底下,名為 socks

sudo mkdir -p /var/socks && cd /var/socks

透過 npm 安裝 simple-socks

npm i simple-socks

主要程式碼

接著在 /var/socks 資料夾底下建立一個 run.js 檔案,然後程式碼基本上就相當懶人了,提供兩種方法:一種是無驗證的,而另一種是需要使用帳號密碼驗證的。

cd /var/socks && sudo vim run.js

無驗證版本:

import socks5 from 'simple-socks';

const server = socks5.createServer();

server.listen(1080, '0.0.0.0', function () {
    console.log('SOCKS5 proxy server started on 0.0.0.0:1080');
});

需驗證版本(其中 userpassword 的部分請改為自己的帳號密碼):

import socks5 from 'simple-socks';

const options = {
    authenticate : function (username, password, socket, callback) {
        if (username === 'user' && password === 'password') {
            return setImmediate(callback);
        }
        return setImmediate(callback, new Error('incorrect username and password'));
    }
};

const server = socks5.createServer(options);
server.listen(1080);

如果你想調用一些方法,如當連線時、當斷線時,那你則可以使用下面這個 Code,來自定你分別要做的事情:

import socks5 from 'simple-socks'

const server = socks5.createServer().listen(1080);

server.on('proxyConnect', (info, destination) => {
    console.log('connected to remote server at %s:%d', info.address, info.port);

    destination.on('data', (data) => {
        console.log(data.length);
    });
});

server.on('proxyData', (data) => {
    console.log(data.length);
});

server.on('proxyError', (err) => {
    console.error('unable to connect to remote server');
    console.error(err);
});

server.on('proxyDisconnect', (originInfo, destinationInfo, hadError) => {
    console.log(
        'client %s:%d request has disconnected from remote server at %s:%d with %serror',
        originInfo.address,
        originInfo.port,
        destinationInfo.address,
        destinationInfo.port,
        hadError ? '' : 'no ');
});

server.on('proxyEnd', (response, args) => {
    console.log('socket closed with code %d', response);
    console.log(args);
});

完成之後,你就可以使用以下命令啟動囉,在上方的程式碼中,我們都是將服務開在 Port 1080 中,所以在瀏覽器你也需要填入這個資訊。

sudo node run

包成服務

如果你正在使用 Linux,那你肯定不希望一定要打開一個 cli 介面,並執行一行命令然後掛在那邊。所以我們現在需要把他打包成一個服務,讓他可以在背景運作,並且可以使用指令控制他。

前往資料夾 /etc/systemd/system 並建立一個檔案 socks5.service

cd /etc/systemd/system && sudo vim socks5.service

貼上以下內容並存檔。

[Unit]
Description=Socks5 Server
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/node /var/socks/run.js
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

執行以下命令使其生效。

sudo systemctl daemon-reload

接著你可以用以下命令來控制這個服務囉!

sudo systemctl start socks5    # 啟動服務
sudo systemctl stop socks5     # 關閉服務
sudo systemctl restart socks5  # 重啟服務
sudo systemctl enable socks5   # 開機自動啟動服務
sudo systemctl disable socks5  # 開機不啟動服務

檢視成果

Firefox

如果你正在使用 Firefox,你可以到 「設定」 > 「一般」,拉到最下方有網路設定。打開選擇「手動設定 Proxy」,並在「SOCKS 主機」的欄位填入該伺服器 IP 位址及剛剛的埠號 1080

001.jpg

Chromium

如果你正在使用 Chromium 體系的瀏覽器,如:Google Chrome、Microsoft Edge 或是 Brave Browser,你可以參考這個之前寫的文章。

Chromium 體系瀏覽器使用 SOCKS 代理