Jamyy's Weblog

利用 socat 指令達成 DNS over SSH Tunnel

by Jamyy on 十月.07, 2016, under Linux

環境: A 主機不能上網, B 主機可以上網; B 主機可以 SSH 連入 A 主機
需求: 讓 A 主機透過 B 主機進行套件更新作業
方案: 從 B 主機 SSH 連線 A 主機建立反向通道 (Reverse SSH Tunnel), 在不調整防火牆 Policy 前提下以 HTTP Proxy & DNS over SSH Tunnel 方式解決 A 主機臨時連網需求

Step 1. 於 A、B 主機安裝 socat 與 screen 套件

確認 A、B 主機均裝有 socat 與 screen 套件
若 A 主機未安裝這些套件, 從 B 主機以 scp 指令將套件檔案傳送過去進行安裝

CentOS / Fedora

Debian / Ubuntu

Step 2: 建立 SSH Tunnel

DNS over SSH Tunnel - Server Side
hostB $ screen -d -m sh -c "socat tcp-listen:5353,reuseaddr,fork UDP:8.8.8.8:53"

建立 Reverse SSH Tunnel
hostB $ ssh -R 5353:localhost:5353 -R 8080:proxy.hinet.net:80 user@hostA

確認 Reverse SSH Tunnel 是否成功建立
hostA $ ss -ntul | grep -E "5353|8080"

tcp    LISTEN     0      128            127.0.0.1:5353                  *:*     
tcp    LISTEN     0      128            127.0.0.1:8080                  *:*     
tcp    LISTEN     0      128                  ::1:5353                 :::*     
tcp    LISTEN     0      128                  ::1:8080                 :::*

Step 3: 環境配置

CentOS / Fedora - 讓 YUM 透過 HTTP Proxy 連網
hostA $ echo proxy=http://127.0.0.1:8080 | sudo tee -a /etc/yum.conf

Debian / Ubuntu - 讓 APT 透過 HTTP Proxy 連網
hostA $ echo 'Acquire::http::Proxy "http://127.0.0.1:8080";' | sudo tee -a /etc/apt/apt.conf

DNS over SSH Tunnel - Client Side
hostA $ screen -d -m sh -c "sudo socat -T15 udp4-recvfrom:53,reuseaddr,fork tcp:localhost:5353"

nameserver 指向本機
hostA $ echo nameserver 127.0.0.1 | sudo tee /etc/resolv.conf

名稱解析測試
hostA $ host www.google.com

www.google.com has address 64.233.188.99
www.google.com has address 64.233.188.106
www.google.com has address 64.233.188.104
www.google.com has address 64.233.188.103
www.google.com has address 64.233.188.147
www.google.com has address 64.233.188.105
www.google.com has IPv6 address 2404:6800:4008:c07::69

Step 4: 系統更新

CentOS / Fedora
hostA $ sudo yum update

Debian / Ubuntu
hostA $ sudo apt-get update
hostA $ sudo apt-get upgrade

Step 5. 結束 screen session

hostA $ screen -X quit
hostA $ exit
hostB $ screen -X quit
hostB $ exit

Ref:



:,