In this tutorial we will detail how to connect two linux hosts via 56k modems. To do this we will use the following components:
|Two Conexant 56k Modems ( https://www.amazon.com/gp/product/B008RZTJC0/||$17-$20 / each)|
|a RJ-11 splitter( https://www.amazon.com/Splitter-Duplex-line-Telephone-Adapter/dp/B07WNDZT6Y||$8-$12)|
|A Linksys SPA-2102 ( search ebay for
We need to configure our gear.
The SPA-2102 serves as a “dial-tone generator” for the modems; that is to say the modem RJ-11 lines need voltage and the SPA-2102 supplies that voltage. You cannot plug the modems directly into each other. The modems lack the ability to generate the current necessary for establishing commmunications between themselves.
The modems will show up on the Pis as serial interfaces. Run
dmesg to see more information:
[ 1.238294] usb 1-1.4: new full-speed USB device number 3 using xhci_hcd [ 1.390434] usb 1-1.4: New USB device found, idVendor=0572, idProduct=1340, bcdDevice= 1.00 [ 1.390478] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 1.390510] usb 1-1.4: Product: USB Modem [ 1.390534] usb 1-1.4: Manufacturer: Conexant [ 1.390557] usb 1-1.4: SerialNumber: 12345678
On my Pis the modem appeared at
/dev/ttyACM0, but your mileage may vary. We will need to use PPP as the IP layer between the two modems. We will need to create a “connect” script to pass to pppd so it knows how to handle the modem serial interface. You can see generic instructions on how to do so here: http://tldp.org/HOWTO/PPP-HOWTO/x1188.html.
The connect script I used for the client (connection initiator):
#!/bin/sh # # This is part 2 of the ppp-on script. It will perform the connection # protocol for the desired connection. # /usr/sbin/chat -v \ TIMEOUT 3 \ ABORT '\nBUSY\r' \ ABORT '\nNO ANSWER\r' \ ABORT '\nRINGING\r\n\r\nRINGING\r' \ '' \rAT \ 'OK-+++\c-OK' ATH0 \ TIMEOUT 30 \ OK ATD \ CONNECT '' \
The connect script I used for the server (connection receiver):
#!/bin/sh # # This is part 2 of the ppp-on script. It will perform the connection # protocol for the desired connection. # /usr/sbin/chat -v \ TIMEOUT 3 \ ABORT '\nBUSY\r' \ ABORT '\nNO ANSWER\r' \ ABORT '\nRINGING\r\n\r\nRINGING\r' \ '' \rAT \ 'OK-+++\c-OK' ATH0 \ TIMEOUT 30 \ OK ATA \ CONNECT '' \
The difference between these two scripts is the second to last line:
OK ATA on the receiver versus
OK ATD on the intiator.
Copy those scripts onto each Pi as
chat.sh. Make the
chat.sh executable using
chmod +x chat.sh and then you will be able to run the following commands as root:
pppd /dev/ttyACM0 9600 noauth local lock defaultroute debug nodetach 172.16.1.1:172.16.1.2 ms-dns 184.108.40.206 connect ./chat.sh
pppd noauth local lock defaultroute debug nodetach /dev/ttyACM0 connect ./chat.sh
The path prefix to the
chat.sh binary seems important, so you will need the
./ in front of
chat.sh when you use it in the
You should see the ppp connection establish successfully, though it might take up to a minute for the IP link to come up.
It is possible to send “modem commands” directy to the modem. A list of semi-standardized commands is available here: https://en.wikipedia.org/wiki/Hayes_command_set
If you desire to write commands directly to the modem, I recommend using the
cu utility. Install with:
apt install cu
You can then establish AT communications sessions with:
cu -l /dev/ttyACM0 Connected. ATD CONNECT 9600
cu -l /dev/ttyACM0 Connected. ATA CONNECT 9600
ATD is the “AT” command run on the client and
ATA is the “AT” command run on the server.
Once you have an “AT” connection established, any input from one terminal will be displayed in the opposite terminal. This is the basis for IP communication over 56k modem.
To exit cu, from the cu prompt run:
Fax machines are still commonly used, these techniques could be used to fuzz fax modem connections.