Linux嵌入式串口轉網絡


1、下載地址
http://www.dest-unreach.org/socat/download/socat-1.7.4.1.tar.gz
2、解壓
configure
make
make install
3、如果交叉編譯時,在make之前配置makefile中的gcc
4、轉發串口到遠程ip
sudo ./socat /dev/ttySZ5 TCP:192.168.10.3:20108
5、如果想要在遠程計算機上可以使用tcp轉串口再轉換回來,就可以像操作本地設備一樣操作遠程設備上的串口了。
6、各設備關系
嵌入式設備串口 <-> 網絡 <-> windows電腦

以下內容轉自網絡http://linux.51yip.com/search/socat****
*Socat 是 Linux 下的一個多功能的網絡工具,名字來由是 「Socket CAT」。其功能與有瑞士軍刀之稱的 Netcat 類似,可以看做是 Netcat 的加強版。

Socat 的主要特點就是在兩個數據流之間建立通道,且支持眾多協議和鏈接方式。如 IP、TCP、 UDP、IPv6、PIPE、EXEC、System、Open、Proxy、Openssl、Socket等。

Socat 的官方網站:http://www.dest-unreach.org/socat/

Socat 安裝

通過源碼方式安裝
$ wget http://www.dest-unreach.org/socat/download/socat-1.7.3.2.tar.gz
$ tar zxf socat-1.7.3.2.tar.gz
$ cd socat-1.7.3.2
$ ./configure
$ make
$ make install

Centos
$ yum install -y socat

Debian/Ubuntu
$ apt-get install -y socat

macOS
$ brew install socat

Socat 基本語法
socat [options]

其中這 2 個 address 就是關鍵了,address 類似於一個文件描述符,Socat 所做的工作就是在 2 個 address 指定的描述符間建立一個 pipe 用於發送和接收數據。幾個常用的 address 描述方式如下:
-,STDIN,STDOUT 表示標准輸入輸出,可以就用一個橫杠代替。
/var/log/syslog 打開一個文件作為數據流,可以是任意路徑。
TCP:: 建立一個 TCP 連接作為數據流,TCP 也可以替換為 UDP 。
TCP-LISTEN: 建立 一個 TCP 監聽端口,TCP 也可以替換為 UDP。
EXEC: 執行一個程序作為數據流。
以上規則中前面的 TCP 等都可以小寫,在這些描述后可以附加一些選項,用逗號隔開。如 fork,reuseaddr,stdin,stdout,ctty 等。

Socat 使用實例
文件操作
通過 Socat 讀取文件

從絕對路徑讀取

$ socat - /var/www/html/flag.php

從相對路徑讀取

$ socat - ./flag.php

注:這里的路徑一般是絕對路徑,如果要使用相對路徑記得要加上 ./ 。

寫入文件
$ echo "This is Test" | socat - /tmp/hello.html

網絡管理

連接遠程端口
$ socat - TCP:192.168.1.252:3306

監聽一個新端口
$ socat TCP-LISTEN:7000 -

端口轉發
在實際生產中我們經常會遇到到一個場景就是,用一台機器作為轉發服務器,連接 AB 兩個網段,將轉發服務器的某個端口上的流量轉發到 B 網段的某台機器的某個端口,這樣 A 網段的服務器就可以通過訪問轉發服務器上的端口訪問到 B 網段的服務器端口。

這樣的場景一般在和客戶建立專線的連接時候經常用到,一般也可以采用 iptables 做轉發,但是比較復雜。Socat 可以很輕松的完成這個功能,但是 Socat 不支持端口段轉發,只適用於單端口或者少量端口。

轉發 TCP
監聽 192.168.1.252 網卡的 15672 端口,並將請求轉發至 172.17.0.15 的 15672 端口。
$ socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15672,bind=192.168.1.252,reuseaddr,fork TCP4:172.17.0.15:15672

參數說明:

  1. -d -d 前面兩個連續的 -d -d 代表調試信息的輸出級別。
  2. -lf /var/log/socat.log 指定輸出信息的文件保存位置。
  3. TCP4-LISTEN:15672 在本地建立一個 TCP IPv4 協議的監聽端口,也就是轉發端口。這里是 15672,請根據實際情況改成你自己需要轉發的端口。
  4. bind 指定監聽綁定的 IP 地址,不綁定的話將監聽服務器上可用的全部 IP。
  5. reuseaddr 綁定一個本地端口。
  6. fork TCP4:172.17.0.15:15672 指的是要轉發到的服務器 IP 和端口,這里是 172.17.0.15 的 15672 端口。

轉發 UDP
轉發 UDP 和 TCP 類似,只要把 TCP4 改成 UDP4 就行了。
$ socat -d -d -lf /var/log/socat.log UDP4-LISTEN:123,bind=192.168.1.252,reuseaddr,fork UDP4:172.17.0.15:123

NAT 映射
在一個 NAT 網絡環境中,也是可以通過 Socat 將內部機器端口映射到公網上的。

在外部公網機器上執行
$ socat tcp-listen:1234 tcp-listen:3389

在內部私網機器上執行
$ socat tcp:outerhost:1234 tcp:192.168.1.34:3389
這樣,你外部機器上的 3389 就映射在內網 192.168.1.34 的 3389 端口上了。不過這樣場景下更推薦內網穿透神器 FRP,如果你不會使用,可參考「推薦一款很好用的內網穿透工具–FRP」一文。

文件傳遞
文件傳送
將文件 demo.tar.gz 使用 2000 端口從 192.168.1.252 傳到 192.168.1.253,文件傳輸完畢后會自動退出。

在 192.168.1.252 上執行
$ socat -u open:demo.tar.gz tcp-listen:2000,reuseaddr

在 192.168.1.253 上執行
$ socat -u tcp:192.168.1.252:2000 open:demo.tar.gz,create
-u 表示數據傳輸模式為單向,從左面參數到右面參數。
-U 表示數據傳輸模式為單向,從右面參數到左面參數。

讀寫分流功能
Socat 具有一個獨特的讀寫分流功能,比如:可以實現一個假的 Web Server,客戶端連過來之后就把 read.html 里面的內容傳過去,同時把客戶端的數據保存到 write.txt 里面。

$ socat open:read.html!!open:write.txt,create,append tcp-listen:8000,reuseaddr,fork
!! 符號用於合並讀寫流,前面的用於讀,后面的用於寫。由於 ! 在 Shell 中是特殊字符,所以這里在命令行中使用 \ 對其進行了轉義。

其它功能
監聽一個 TCP 端口
$ socat tcp-listen:12345 -

向 TCP 端口發送數據
$ echo "test" | socat - tcp-connect:127.0.0.1:12345

監聽一個 UDP 端口
$ socat udp-listen:23456 -

向一個 UDP 端口發送數據
$ echo "test" | socat - udp-connect:127.0.0.1:23456

監聽一個 Unix Socket
$ socat unix-listen:/tmp/unix.socket -

向本地 Unix Socket 發送數據
$ echo "test" | socat - unix-connect:/tmp/unix.sock

監聽本地 Unix Datagram Socket
$ socat unix-recvfrom:/tmp/unix.dg.sock -

向本地 Unix Datagram Socket 發送數據
$ echo "test" | socat - unix-sendto:/tmp/unix.dg.sock

通過 Openssl 來加密傳輸過程
假設有一個服務器主機,地址為 server.domain.org。 並且服務端程序使用 4433 端口。為了盡可能的簡單,我們使用一個非常簡單的服務功能,即服務端僅回顯數據(echo),客戶端只進行標准輸入(stdio)。要進行 Openssl 加密數據傳輸,首先需要生成 Openssl 證書。

生成服務端的證書

為服務端的證書取一個基本的名字。

$ FILENAME=server

生成公鑰私鑰對。

$ openssl genrsa -out $FILENAME.key 1024

生成一個自簽名的證書,會提示你輸入國家代號、姓名等,或者按下回車鍵跳過輸入提示。

$ openssl req -new -key $FILENAME.key -x509 -days 3653 -out $FILENAME.crt

用剛生成的密鑰文件和證書文件來生成PEM文件。

$ cat $FILENAME.key $FILENAME.crt >$FILENAME.pem
服務端證書生成完成后,復制信任證書 server.crt 到 SSL 客戶端所在的主機上。

生成客戶端證書

為客戶端證書取一個不同的文件名

$ FILENAME=client
重復上述服務端生成證書的流程。然后復制 client.pem 到 SSL 客戶端主機,復制 client.crt 到服務端主機。至此完成了證書交換,服務端有 server.pem、client.crt 兩個文件,客戶端有 client.pem 、server.crt 兩個文件。

其次我們需要建立 Openssl 服務端,在服務端我們不再用 tcp-listen (tcp-l) ,而用 openssl-listen (ssl-l) 。cert 參數告訴 Socat 包含證書和私鑰的文件,cafile 參數指向客戶端的證書文件。如果客戶端能提供相關聯的私鑰,我們則認為該連接是可靠的。
$ socat openssl-listen:4433,reuseaddr,cert=server.pem,cafile=client.crt echo
運行這個命令后,Socat 會在 4433 端口監聽,並要求客戶端進行身份驗證。

最后在客戶端建立一個加密的鏈接,用 openssl-connect 或者 ssl 替換你的 tcp-connect 或 tcp 地址關鍵字,然后添加 cert 和 cafile 選項。
$ socat stdio openssl-connect:server.domain.org:4433,cert=client.pem,cafile=server.crt
test
test
這個命令用來建立一個到服務程序的安全的連接。如果服務端和客戶端成功建立連接后,會回顯在客戶端輸入的內容。

建立一個正向 Shell

服務端

在服務端 7005 端口建立一個 Shell。

$ socat TCP-LISTEN:7005,fork,reuseaddr EXEC:/bin/bash,pty,stderr
或者
$ socat TCP-LISTEN:7005,fork,reuseaddr system:bash,pty,stderr

客戶端

連接到服務器的 7005 端口,即可獲得一個 Shell。readline 是 GNU 的命令行編輯器,具有歷史功能。

$ socat readline tcp:127.0.0.1:7005
反彈一個交互式的 Shell
當有主機連接服務端的 7005 端口時,將會發送客戶端的 Shell 給服務端。

服務端
$ socat -,raw,echo=0 tcp-listen:7005

客戶端
$ socat tcp-connect:192.168.1.252:7005 exec:'bash -li',pty,stderr,setsid,sigint,sane

fork 服務
將一個使用標准輸入輸出的單進程程序變為一個使用 fork 方法的多進程服務,非常方便。

$ socat TCP-LISTEN:1234,reuseaddr,fork EXEC:./helloworld
不同設備的通信

將 U 盤進行網絡共享
$ socat -d -d /dev/ttyUSB1,raw,nonblock,ignoreeof,cr,echo=0 TCP4-LISTEN:5555,reuseaddr

將終端轉發到串口
$ socat READLINE,/dev/ttyS0,raw,echo=0,crnl
讓 Socat 后台運行

默認情況下 Socat 只在前台運行,如果要讓 Socat 一直在后台運行,可以使用 nohup 命令來保證其在后台一直運行。
$ nohup socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15672,bind=192.168.1.252,reuseaddr,fork TCP4:172.17.0.15:15672 &
除了 nohup 外,Linux 下讓進程在后台運行的方法還很多,比如:screen、tmux 等。

在 Linux 中一切都是文件,無論是 Socket 還是其他設備。所以從理論上來說,一切能夠在文件層級訪問的內容都可以成為 Socat 的數據流的來源。2 個 address 可以任意發揮,能夠做到的事情還有很多。這樣比起來,Socket 的確比 Netcat 更加強大。***


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM