Tethering
From Openmoko
Once you successfully connect to your network operator (see Manually using GPRS), you can start sharing your data plan with your computer through USB or Bluetooth networking. The following describes how you can do so through USB networking. Currently, there are four different ways that have been confirmed by users.
Contents |
FSO
The following FSO dbus call starts a DHCP server on the FreeRunner, allowing you to access the GPRS connection which you will have already started(!) from the tethered PC.
mdbus -s org.freesmartphone.onetworkd /org/freesmartphone/Network org.freesmartphone.Network.StartConnectionSharingWithInterface usb0
I was able to access the DHCP server from my Eee PC (running Jaunty) by copying the MAC address from the static entry in network-manager, and created a new entry with the same MAC but DHCP rather than a static IP address.
/etc/.../network/
If you use files in /etc/.../network/ to manage your network connections (and not any so-called network manager tools), you might need to add a file like the following before the above step works:
# file /etc/sysconfig/network/ifcfg-eth1 # USB configuration for PDAs (openmoko) IPADDR='192.168.0.200/24' NETMASK='255.255.255.0' STARTMODE='auto' PREFIXLEN='24' BOOTPROTO=dhcp
The above worked for openSUSE (11.2).
tinyproxy
If you only need/want web browsing, or if your phone provider is blocking other services, the easiest way to browse the web using your FreeRunner is to install tinyproxy : http://secretsauce.net:5050/tinyproxy_1.6.4-r0_armv4t.ipk
Tinyproxy needs to be configured by adding "Allow 192.168.0.0/24" to /etc/tinyproxy/tinyproxy.conf.
Start GPRS, start tinyproxy, use 192.168.0.202:8888 as the proxy on your computer, and you're ready to go.
Setting up your computer's network settings
I find it useful to have my computer automatically acquire its network address, mask, gateway, and DNS servers from the FreeRunner instead of manually setting these up. In order to this, I installed busybox-udhcpd from the Angstrom repositories onto my FreeRunner (see Repositories)
opkg install busybox-udhcpd
Once it is installed, it needs to be configured. Edit the /etc/udhcpd.conf file. Mine looks like this:
# Sample udhcpd configuration file (/etc/udhcpd.conf) # The start and end of the IP lease block start 192.168.0.200 #default: 192.168.0.20 end 192.168.0.200 #default: 192.168.0.254 # The interface that udhcpd will use interface usb0 #default: eth0 # The maximum number of leases (includes addresses reserved # by OFFER's, DECLINE's, and ARP conficts) #max_leases 254 #default: 254 # If remaining is true (default), udhcpd will store the time # remaining for each lease in the udhcpd leases file. This is # for embedded systems that cannot keep time between reboots. # If you set remaining to no, the absolute time that the lease # expires at will be stored in the dhcpd.leases file. #remaining yes #default: yes # The time period at which udhcpd will write out a dhcpd.leases # file. If this is 0, udhcpd will never automatically write a # lease file. (specified in seconds) #auto_time 7200 #default: 7200 (2 hours) # The amount of time that an IP will be reserved (leased) for if a # DHCP decline message is received (seconds). #decline_time 3600 #default: 3600 (1 hour) # The amount of time that an IP will be reserved (leased) for if an # ARP conflict occurs. (seconds) #conflict_time 3600 #default: 3600 (1 hour) # How long an offered address is reserved (leased) in seconds #offer_time 60 #default: 60 (1 minute) # If a lease to be given is below this value, the full lease time is # instead used (seconds). #min_lease 60 #defult: 60 # The location of the leases file #lease_file /var/lib/misc/udhcpd.leases #defualt: /var/lib/misc/udhcpd. leases # The location of the pid file #pidfile /var/run/udhcpd.pid #default: /var/run/udhcpd.pid # Everytime udhcpd writes a leases file, the below script will be called. # Useful for writing the lease file to flash every few hours. #notify_file #default: (no script) #notify_file dumpleases # <--- usefull for debugging # The following are bootp specific options, settable by udhcpd. #siaddr 192.168.0.22 #default: 0.0.0.0 #sname zorak #default: (none) #boot_file /var/nfs_root #default: (none) # The remainder of options are DHCP options and can be specified with the # keyword 'opt' or 'option'. If an option can take multiple items, such # as the dns option, they can be listed on the same line, or multiple # lines. The only option with a default is 'lease'. #Examles opt dns 192.168.0.202 <your APN's DNS server> option subnet 255.255.255.0 opt router 192.168.0.202 opt wins 192.168.0.202 #option dns 129.219.13.81 # append to above DNS servers for a total of 3 option domain local option lease 864000 # 10 days of seconds # Currently supported options, for more info, see options.c #subnet #timezone #router #timesvr #namesvr #dns #logsvr #cookiesvr #lprsvr #bootsize #domain #swapsvr #rootpath #ipttl #mtu #broadcast #wins #lease #ntpsrv #tftp #bootfile
Notice that I set the start and end of the IP lease block to 192.168.0.200. If you follow the instructions at USB Networking, this is the address that it assumes the host to be and the /etc/resolv.conf file points to this address to allow name resolution from your phone.
The interface in this case is usb0. This will have to be set differently if you are using Bluetooth.
The dns is set to the FreeRunner's address, as well as my network operator's DNS server address. You don't have to use your network operator's DNS address if you can find a caching nameserver for the FreeRunner.
The router is set to the FreeRunner.
Turning your FreeRunner into a Network Address Translation (NAT) gateway
I set up my FreeRunner so that it acts as a NAT gateway so that all traffic that goes to my network operator appears to originate from the phone. I installed iptables to accomplish this:
opkg install iptables iptables-utils kernel-module-ipt-masquerade kernel-module-iptable-nat
Once that is installed, I have the following script named firewall.sh that I use to set up the NAT once connected to the GPRS network:
#!/bin/sh IPTABLES='/usr/sbin/iptables' # Set interface values EXTIF='ppp0' INTIF='usb0' # enable ip forwarding in the kernel /bin/echo 1 > /proc/sys/net/ipv4/ip_forward # flush rules and delete chains $IPTABLES -F $IPTABLES -X #Enable masquerading to allow LAN internet access $IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE #Forward LAN traffic from LAN $INTIF to Internet $EXTIF $IPTABLES -A FORWARD -i $INTIF -o $EXTIF -m state --state NEW,ESTABLISHED -j ACCEPT #Allowing access to the SSH server" #$IPTABLES -A INPUT --protocol tcp --dport 22 -j ACCEPT #Allowing access to the HTTP server" #$IPTABLES -A INPUT --protocol tcp --dport 80 -j ACCEPT # block out all other Internet access on $EXTIF $IPTABLES -A INPUT -i $EXTIF -m state --state NEW,INVALID -j DROP $IPTABLES -A FORWARD -i $EXTIF -m state --state NEW,INVALID -j DROP
So once connected through GPRS, I run:
./firewall.sh
And then you should be able to connect to the internet from your computer!
Of course this also works when sharing your WLAN connection. Just set EXTIF to eth0.