Modem Sharing mini-HOWTO

Friedemann Baitinger

        fb@baiti.net
      

2001-08-22
Revision History                                                             
Revision v1.12            2001-08-22           Revised by: gjf               
Corrected author's email                                                     
Revision v1.11            2001-07-12           Revised by: aeg               
Converted to DocBook SGML                                                    
Revision v1.10            1999-09-11           Revised by: fb                
Added "Feedback from the Users" section                                      
Revision v1.01            1997-06-12           Revised by: fb                
Converted source to HTML                                                     


Describes how to setup a Linux system to share a modem with other systems
over a TCP/IP network.

-----------------------------------------------------------------------------
Table of Contents
1. Legal Notice
2. The Server Side
    2.1. Masqdialer Installation
    2.2. Masqdialer Configuration
   
   
3. The Client Side
4. Security Considerations
5. Examples
6. Feedback From Users

1. Legal Notice

Copyright © 1997 Friedemann Baitinger. This document may be distributed only
subject to the terms and conditions set forth in the GNU Free Documentation
License at <[http://www.gnu.org/copyleft/fdl.html] http://www.gnu.org/
copyleft/fdl.html>.
>
-----------------------------------------------------------------------------

2. The Server Side

It is assumed that the server is a Linux system with either:

  * a modem attached to a /dev/ttySx device
   
  * an 'isdn4linux'-emulated modem mapped to a /dev/ttyIx device
   

The easiest setup I can think of uses a five lines perl script to implement a
modem daemon in /usr/sbin/modemd:
                                                                             
#!/usr/bin/perl                                                              
select((select(STDOUT), $| = 1)[$[]);                                        
select((select(STDIN), $| = 1)[$[]);                                         
exec 'cu -s 115200 -l /dev/ttyS1';                                           
die '$0: Cant exec cu: $!\n';                                                

The modem daemon is started by the inetd process if a client connects to the
appropriate port as described below. The modemd simply connects the socket
handle with STDIN and STDOUT of the cu command and lets cu handle the actual
modem device.

The existence of the modem daemon must be made known to the inetd process by
updating its configuration file, usually /etc/inetd.conf like:
+---------------------------------------------------------------------------+
|#                                                                          |
|# modem daemon                                                             |
|#                                                                          |
|modem stream tcp nowait root /usr/sbin/tcpd /usr/sbin/modemd /dev/ttyS1    |
+---------------------------------------------------------------------------+

In order to make this work, an entry to /etc/services needs to be added like:
+---------------------------------------------------------------------------+
|                                                                           |
|modem           2006/tcp        modemd                                     |
+---------------------------------------------------------------------------+

This associates a symbolic name with an explicit port, 2006 in the example.
The portnumber could be any number not already assigned to an existing
service. After these changes have been made, a signal must be sent to the
inetd process in order to let inetd re-read and process its configuration
file:
+---------------------------------------------------------------------------+
|                                                                           |
|bash# ps | grep inetd                                                      |
|194  ?  S     0:00 /usr/sbin/inetd                                         |
|                                                                           |
|bash# kill -HUP 194                                                        |
+---------------------------------------------------------------------------+

Now the server side is ready to accept requests from clients. The correct
function can be verified by:
+---------------------------------------------------------------------------+
|bash$ telnet localhost modem                                               |
|                                                                           |
|Trying 127.0.0.1...                                                        |
|Connected to localhost.                                                    |
|Escape character is '^]'.                                                  |
+---------------------------------------------------------------------------+

You are now connected to the modem. You can now issue AT commands in order to
verify the setup:
+---------------------------------------------------------------------------+
|                                                                           |
|atz                                                                        |
|atz                                                                        |
|OK                                                                         |
|                                                                           |
|ati1                                                                       |
|ati1                                                                       |
|Linux ISDN                                                                 |
|OK                                                                         |
|                                                                           |
|^]                                                                         |
|telnet>quit                                                                |
|bash$                                                                      |
+---------------------------------------------------------------------------+

Instead of using the Perl script as a modem server, there is also a program
named Masqdialer available at [http://w3.cpwright.com/mserver/] http://
w3.cpwright.com/mserver/.

With Masqdialer you can export any number of modems connected to your server
to any host that can connect the server via TCP/IP on a given port with a
binary data stream.
-----------------------------------------------------------------------------

2.1. Masqdialer Installation

Before compiling check config.h for compile time options:

  * set the path for the config file to your liking
   
  * set the path for the lock file to your liking
   

Do make all.

Copy the binaries (mserver and tcpconn) into a suitable directory such as /
usr/local/sbin/. Copy mserver.conf into the path that you specified in
config.h.

Masqdialer could be started from one of your system startup scripts. A simple
/usr/local/sbin/mserver will run it as a daemon.
-----------------------------------------------------------------------------

2.2. Masqdialer Configuration

A line in mserver.conf could look like this:
+---------------------------------------------------------------------------+
|5800 /dev/ttyS1      115200,8,N,1    *.foo.org,192.168.2.1                 |
+---------------------------------------------------------------------------+

which would mean that a modem connected to /dev/ttyS1 can be connected via
port 5800 from anywhere in the domain foo.org and from host 192.168.2.1. Any
other hosts are rejected. Pitfall: If you don't specify hosts then ANY host
will be allowed to connect. The serial line settings are fixed and cannot be
changed from the client side. You can export several modems on a single port.
Masqdialer only locks the modem devices by use of UUCP style lock files when
they are actually in use thus allowing other programs to take advantage of
them.
-----------------------------------------------------------------------------

3. The Client Side

At this time, only Windows client setups are described here. On the client
PC, a COM-port redirector for TCP/IP is required. The best program for this
purpose I have found is DialOut/IP from Tactical Software for Windows 3.1 and
Windows 95. (The Windows 3.1 version can be used under Windows NT for 16-bit
applications only. A 32-bit version for Windows NT is due late summer 1997.)

DialOut/IP presents the shared modem on a new virtual COM port that it adds
to Windows. This virtual COM port can be used by Windows programs as if the
shared modem is directly connected. Most client applications (including 
Windows 95 dial-up networking) accept this and work as if there were a real
COM port and modem, with the general exception being fax applications or any
others that need access to UART control lines. DialOut/IP can be configured
to provide telnet protocol processing, but that feature applies to certain
modem pool products and not to the Linux setup described in this file. Note
that, despite its name, DialOut/IP can be used also by applications that wait
for incoming calls.

On [http://www.tactical-sw.com/] http://www.tactical-sw.com/ there is a page
for downloading a fully functional evaluation version that times out in 1-2
weeks. Installation and configuration is handled by a setup program, with
installation details in the README.TXT file. When you run DialOut/IP, you
enter the IP address and port number of the shared modem.

DialOut/IP is a commercial product that is licensed on a per-modem basis,
that is, the price depends on the number of modems that you are sharing. The
license states that you can install the software on any number of PC's that
access the shared modems.
-----------------------------------------------------------------------------

4. Security Considerations

If you have only one modem for all your hosts in your local area network,
there is probably no reason to worry about security here. However, if any one
or more of the hosts in your LAN are connected to the Internet by other means
than using the modem we have just setup as a modem server, then security
considerations are required, otherwise anybody can do a telnet your_host
modem and dial out long distance or even international calls at will.

I suggest to install and configure tcp-wrappers in order to protect the modem
server against unauthorized access.
-----------------------------------------------------------------------------

5. Examples

I am using the setup as described in The Server Side and The Client Side to
run Quicken on my Windows 95 ThinkPad and do home banking with the modem
attached to my Linux machine. The "modem" in my case is not even a real
modem, it is an emulated modem on an ISDN-So card. Quicken just sees a COM
port, it doesn't know that the device attached to the COM port is actually at
the other end of my Ethernet LAN, nor does it know that it is not a standard
analog modem but an ISDN device which happens to understand AT commands.
-----------------------------------------------------------------------------

6. Feedback From Users

Since the first release of this document in June 1997 I have received many
email messages related to the subject. In most of the messages people were
seeking more help to get the modem sharing configured and running.

Recently I received an interesting feedback from [mailto:
Karsten%20Hilbert%20%3CKarsten.Hilbert@gmx.net%3E?subject=
Masqdialer%20client] Karsten.Hilbert@gmx.net. Karsten pointed out that
although DialOut/IP may be a good client program he'd like to have a [http://
www.gnu.org/] GPL'ed client. Karsten mentioned the Software Bazaar <[http://
visar.csustan.edu/bazaar/] http://visar.csustan.edu/bazaar/> and he
volunteered to put in an offer. Here is what Karsen wrote:
+---------------------------------------------------------------------------+
|     Date: Fri, 27 Aug 1999 17:46:39 +0200 (CEST)                          |
|     From: Karsten Hilbert <med94ecz@studserv.uni-leipzig.de>              |
|     Reply-To: Karsten Hilbert <Karsten.Hilbert@gmx.net>                   |
|     To: fb@baiti.net                                                      |
|     Subject: Windows-Modemsharing-Howto                                   |
|                                                                           |
|     Hi !                                                                  |
|                                                                           |
|     The howto mentions DialOut/IP as a good tool to connect Windows       |
|     clients to a linux server sharing a modem.                            |
|                                                                           |
|     I agree. However, it would be more attractive to have a free,         |
|     GPL'ed client, wouldn't it ? This I thought and decided to offer      |
|     some money for the implementation of such a client on the             |
|     Software Bazaar. If someone grabs the project I will pay him a        |
|     certain amount of money if it is completed and functional. After      |
|     that the client would be GPL'ed.                                      |
|                                                                           |
|     Now, I can only offer so much money :) But other people could         |
|     join in and offer some, too, thus increasing the incentive.           |
|     Wouldn't your howto be a perfect place to mention this                |
|     possibility ?                                                         |
|                                                                           |
|     The Bazaar can be found at:                                           |
|                                                                           |
|      http://visar.csustan.edu/bazaar/                                     |
|                                                                           |
|     Thought I could mention this to you.                                  |
|                                                                           |
|                                                                           |
|     Karsten                                                               |
+---------------------------------------------------------------------------+
