stefan-gloor.ch

Windows 95 Internet Access using Linux PPP in 2024

Windows 95 laptop showing Google front page
Modern Google home page loaded over an emulated 19200 bps serial modem.

I own a 1994 IBM Thinkpad 755C I take out of storage once in a while to experience that authentic retro computer feeling with a system that predates my existence by a few years :)

While the ancient software can also be installed on QEMU, a VM can’t provide the hard disk noises or the high-quality haptics of the keyboard and laptop chassis. The solid build quality of these devices is just not comparable to the standard of today’s consumer devices (but neither is their 1993 3 k$ price tag).

Back side of 755C Thinkpad

Although the machine has a multitude of different connectors, there are no Ethernet or USB ports. Instead, the RS-232 serial port is meant for communication to the outside world via a dial-up modem. While I could find some resources explaining how I could emulate a dial-up modem with Linux, there were no comprehensive guides on how to connect a Windows 95 machine to the Internet of 2024 that worked for me, so I decided to document my progress here.

In essence, you need a cross-over (“null-modem”) RS-232 cable and a fitting USB adapter for the modern machine. Then, assuming correct baud rate and flow control settings, the two devices can communicate over a serial terminal. After configuring a new “Standard 19200 bps Modem” in Windows 95 and using it for a new PPP server dial-up connection, the computer will first send a sequence of AT commands and expect an appropriate answer from the modem in order to set up the connection. On the Linux side, this initial conversation is handled by chat, a dedicated small program which outputs a predefined string after an expected input has been received. By trial-and-error and some online research, I found a command sequence which works with my version of Windows 95 (4.00.950 B):

   W95 <--> Modem
   --------------
    AT --->
       <--- OK
ATE0V1 --->
       <--- OK
    AT --->
       <--- OK
 ATDT1 --->
       <--- CONNECT

These commands can also be entered manually in minicom on the Linux side, letting Windows 95 continue to the “login” stage of the connection. The number following ATDT is the telephone number, here “1”. To emulate the whole modem, I use pppd, a Linux point-to-point protocol daemon using the following configuration in /etc/ppp/options.ttyUSB0, which automatically takes care of dial-up and TCP/IP configuration:

connect '/usr/sbin/chat -v AT OK ATE0V1 OK AT OK ATDT1 CONNECT'
19200
debug
nodetach
crtscts
lock
192.168.10.200:192.168.10.201

After starting the daemon to listen on the appropriate serial port,

sudo pppd /dev/ttyUSB0

Windows 95 successfully connects to the Linux machine and uses 192.168.10.201 as an IP address, allowing ping to work between the two machines. The other IP address is for the Linux ppp0 interface that gets created automatically. As I didn’t set up a proper DHCP server, I had to manually set the DNS server on the Windows machine. Also, the firewall rules must be set accordingly and routing must be enabled:

sudo sysctl net.ipv4.ip_forward=1

After that, I could access the Internet over a 19200 baud serial connection!

The installed Internet Explorer 4 has support for TLS 1.0, but obviously can’t establish a secure channel using any of the newer protocol versions, so most websites are not reachable from the computer. However, websites which are still reachable by plain HTTP and do not redirect to HTTPS (to my surprise, google.com) work fine on the machine. This page is also reachable by HTTP:

Windows 95 laptop showing this web page

To transfer data to and from the computer, I set up a local FTP server to make my beautifully anachronistic setup complete.