用 Linux + Dante 搭建簡易 Socks Server

最近遇到一個需要用 Socks Server 作為對外溝通的狀況,找了一下 Solution ,順利把 Socks Server 開起來開始使用,分享一下,如果有需要的人可以自行對照參考,也給自己留份紀錄。

起因是,放在外面的 Server 會被一堆網路小白圍攻,有人沒事就會來 try 一下可不可以 hack 進來,雖然說用 Firewall 封住了大部分的 port,但是那些重要的 Service Port ,例如 http 的 80, https 的 443 還是沒辦法封住,這時候就要啟用 fail2ban 這一套防衛機制來幫助處理。

啟用了 fail2ban 之後,緊接而來的問題就是,「會把自己給封掉」!

因為自己要常常上去做一些 Admin 的動作,大部分是透過 Web 介面連過去,所以在 fail2ban 無差別掃 log 之後,很快自己的 ip 就會被 block 起來,然後就都沒辦法連結。每次都要先看一下自己現在的 ip 是多少,再解鎖才能進去,實在是有點煩。

想到有跟中華申請固定 ip,架設在 Linux 上 (如何設定這個有需要的再留言問好了),如果可以弄套 Socks Server 放在那一台上面,就可以直接鎖住那一組固定 IP 為白名單,就不會被封住無法連上。

這時候就要動用這一套: Dante Socks Server

Dante 是一套 Free 的 Socks Server,提供 Source Code 可以自己編譯出需要的 Binary,相當適合個人或者小企業使用的一套 Proxy Server 。

架設方式是去 Download 的頁面把 Source Code 下載下來,然後找一個目錄解開。這邊以目錄名稱 /tmp/dante 為例:

mkdir -p /tmp/dante
cd /tmp/dante
wget https://www.inet.no/dante/files/dante-1.4.2.tar.gz
# 接著解開 (注意 1.4.2 是目前最新的版本,如果要換版本記得改一下)
tar xvfz dante-1.4.2.tar.gz
cd dante-1.4.2

# 底下就可以開始 Build (如果沒有裝過 build-essential 記得裝一下)
./configure
make
sudo make install

# Build & Install 完畢就可以在 /usr/local/sbin/ 底下看見 sockd 
ls -al /usr/local/sbin | grep sock
-rwxr-xr-x  1 root root 3690424 Sep 20 08:00 sockd

好,到這邊就算是把 sockd (dante) 安裝起來了,有點小複雜,不過也沒那麼複雜,重點就是看到 /usr/local/sbin 底下有出現 sockd 就可以。

接下來就是設定 conf 檔案,這邊就有點要小心了。

到 /etc/ 底下開一個新的檔案叫做「sockd.conf」,這個檔案就是負責 sockd 跑起來時的相關設定,裡面會告訴 sockd 說要用什麼樣的 rule 對待來連結的 client ,然後允許什麼樣的 packet 出去。

一個基本的設定大概是這樣的:

# /etc/sockd.conf

# 這邊設定 log 的部分,以及 user 的資訊,照放即可
logoutput: syslog
user.privileged: root
user.unprivileged: nobody

# 設定 socks server 要 listen 的 ip & port
# 0.0.0.0 就是全部都聽,如果有固定要聽哪一個 ip (例如對內的) 也是在這邊設定
internal: 0.0.0.0 port=8080

# 要對外連出去的 interface,這邊就是固定 ip 出去的關鍵所在,出去的 traffic 都會走這個 interface
# 因為我是用中華固定 ip 自己生出 ppp0,所以那個固定 ip 就鎖在 ppp0
external: ppp0

# 這邊可以設定 socks 的 rule,類似允許哪些類型的 socks 才可以過去
# none 的話就是允許匿名的 proxy 過來使用 (因為我是用 VPN 鎖住,所以這邊可以這樣)
# 如果是要對外服務的,這一段就要另外設定,避免被亂搞
socksmethod: none

# 這邊可以設定 client 的 rule
# 跟上面 socks rule 類似, none 表示允許匿名訪問
clientmethod: none

# 底下這個就要特別注意,設定哪些 client 可以連進來
# from 後面就是接允許哪些網段過來,to 就是這樣的網段可以去哪裡
# 可以設定多個 client pass 來對應不同的規則,連往不同的網路
client pass {
    from: 10.1.1.0/24 to: 0.0.0.0/0
    #log: connect disconnect error
}

# 底下這個就是真正封包的限制
# 上面是限制哪些 client 可以過來,下面這個是限制從哪個地方來的封包可以去哪裡
# 也就是說上面允許某個網段 client 可以連,還可以透過這邊進一步限制從哪些網段的封包才可以去哪裡
socks pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    #log: connect disconnect error
}

這樣設定好之後,就可以測試一下 conf 有沒有問題:

sockd -V

正確的話就沒有任何的 output,表示沒有錯誤,有問題就會跳錯誤訊息出來。

然後就可以啟動 sockd:

sockd -D

-D 是表示用 daemon 模式啟動,這樣跑起來之後,用 ps aux 看一下,就可以發現有一堆 sockd 相關的 process 啟動運行,到這個階段,就可以使用了。

Client 端那邊,就是根據所設定的允許連接網段,設定 Socks Server 的部分,然後 port 設定對,就可以透過這一台 proxy server 對外連網。也就是,外面的 server 看到過來的 ip address ,一率都會是 ppp0 那個 ip,不再是浮動的 ip,這樣 fail2ban 那邊就可以真正設定一條白名單把這個固定 ip 放掉,不會一天到晚自己 ban 自己了。

簡單、有效、好用,Dante 就是這麼厲害!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料