Windows 95 Internet Access using Linux PPP in 2024
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).
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:
To transfer data to and from the computer, I set up a local FTP server to make my beautifully anachronistic setup complete.