Bluetooth Server Howto

Instructions how to set up a Linux box as a Bluetooth server

Install the following packages (version number tested in brackets)

bluez-bluefw (1.0)
bluez-hcidump (1.8)
bluez-libs (2.5)
bluez-pan (1.1)
bluez-sdp (1.5)
bluez-utils (2.5)
Next you have to configure your kernel to include all Bluetooth modules you find. Configure them all as modules. (Tested with kernel 2.6.4)

Write the following to /etc/modules.d/bluez:
alias net-pf-31 bluez
alias bt-proto-0 l2cap
alias bt-proto-2 sco
alias bt-proto-3 rfcomm
alias bt-proto-4 bnep
alias tty-ldisc-15 hci_uart
alias char-major-10-250 hci_vhci

Execute “update-modules” to update your modules.conf file.

Now you have to configure the hcid. Edit /etc/bluetooth/hcid.conf:
Replace the line:
lm accept;
with:
lm accept,master;
And uncomment the lines:
#auth enable;
#encrypt enable;
To enable authentification and encryption.
Now it’s time to set a pin:
echo “yourPin” > /etc/bluetooth/pin
which will overwrite the script there (it’s wrong anyway)
Now start the bluetooth services:
/etc/init.d/bluetooth start
and start the pand by hand:
pand –listen –role NAP –service NAP
Now you should be able to establish a connection from another bluetooth pc to you Linux Box using “yourPin”.

But even if you now have a connection from your client pc to your Linux Server, you would have to configure the network settings by hand, which is not quite handy.

The solution is the dhcpd. Install the dhcp package, go to: /etc/dhcp/ and copy the dhcpd.conf.sample to dhcpd.conf. open the file in you favorite editor and configure it to look as follows:
bluez-hcidump (1.8)
bluez-libs (2.5)
bluez-pan (1.1)
bluez-sdp (1.5)
bluez-utils (2.5)
Next you have to configure your kernel to include all Bluetooth modules you find. Configure them all as modules. (Tested with kernel 2.6.4)

Write the following to /etc/modules.d/bluez:
alias net-pf-31 bluez
alias bt-proto-0 l2cap
alias bt-proto-2 sco
alias bt-proto-3 rfcomm
alias bt-proto-4 bnep
alias tty-ldisc-15 hci_uart
alias char-major-10-250 hci_vhci

Execute “update-modules” to update your modules.conf file.

Now you have to configure the hcid. Edit /etc/bluetooth/hcid.conf:
Replace the line:
lm accept;
with:
lm accept,master;
And uncomment the lines:
#auth enable;
#encrypt enable;
To enable authentification and encryption.
Now it’s time to set a pin:
echo “yourPin” > /etc/bluetooth/pin
which will overwrite the script there (it’s wrong anyway)
Now start the bluetooth services:
/etc/init.d/bluetooth start
and start the pand by hand:
pand –listen –role NAP –service NAP
Now you should be able to establish a connection from another bluetooth pc to you Linux Box using “yourPin”.

But even if you now have a connection from your client pc to your Linux Server, you would have to configure the network settings by hand, which is not quite handy.

The solution is the dhcpd. Install the dhcp package, go to: /etc/dhcp/ and copy the dhcpd.conf.sample to dhcpd.conf. open the file in you favorite editor and configure it to look as follows:

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks...
option domain-name "hackenberger.at";
#option domain-name-servers ns1.example.org, ns2.example.org;
option domain-name-servers 195.34.133.10, 195.34.133.11;

default-lease-time 600;
max-lease-time 7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.

#subnet 10.0.0.0 netmask 255.255.255.0 {
#}

# This is a very basic subnet declaration.

subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.10 10.0.0.20;
#  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
option routers 10.0.0.1;
}

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.

#subnet 10.254.239.32 netmask 255.255.255.224 {
#  range dynamic-bootp 10.254.239.40 10.254.239.60;
#  option broadcast-address 10.254.239.31;
#  option routers rtr-239-32-1.example.org;
#}

# A slightly different configuration for an internal subnet.
#subnet 10.5.5.0 netmask 255.255.255.224 {
#  range 10.5.5.26 10.5.5.30;
#  option domain-name-servers ns1.internal.example.org;
#  option domain-name "internal.example.org";
#  option routers 10.5.5.1;
#  option broadcast-address 10.5.5.31;
#  default-lease-time 600;
#  max-lease-time 7200;
#}

# Hosts which require special configuration options can be listed in
# host statements.   If no address is specified, the address will be
# allocated dynamically (if possible), but the host-specific information
# will still come from the host declaration.

#host passacaglia {
#  hardware ethernet 0:0:c0:5d:bd:95;
#  filename "vmunix.passacaglia";
#  server-name "toccata.fugue.com";
#}

# Fixed IP addresses can also be specified for hosts.   These addresses
# should not also be listed as being available for dynamic assignment.
# Hosts for which fixed IP addresses have been specified can boot using
# BOOTP or DHCP.   Hosts for which no fixed address is specified can only
# be booted with DHCP, unless there is an address range on the subnet
# to which a BOOTP client is connected which has the dynamic-bootp flag
# set.
#host fantasia {
#  hardware ethernet 08:00:07:26:c0:a5;
#  fixed-address fantasia.fugue.com;
#}

# You can declare a class of clients and then do address allocation
# based on that.   The example below shows a case where all clients
# in a certain class get addresses on the 10.17.224/24 subnet, and all
# other clients get addresses on the 10.0.29/24 subnet.

#class "foo" {
#  match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
#}

#shared-network 224-29 {
#  subnet 10.17.224.0 netmask 255.255.255.0 {
#    option routers rtr-224.example.org;
#  }
#  subnet 10.0.29.0 netmask 255.255.255.0 {
#    option routers rtr-29.example.org;
#  }
#  pool {
#    allow members of "foo";
#    range 10.17.224.10 10.17.224.250;
#  }
#  pool {
#    deny members of "foo";
#    range 10.0.29.10 10.0.29.230;
#  }
#}

# This is for DNS server updates:
ddns-update-style interim;

Now you have to connect the client to your pc (to get the netwok interface bnep0. After connecting you gave to bring the interface up:
ifconfig bnep0 up
and assign an ip address to it:
ifconfig bnep0 10.0.0.1
Then start the dhcpd by invoking:
/etc/init.d/dhcp start
Now you just have to enable IP-MASQUERADING (assuming you have all the necessary kernel modules and the iptables package installed):
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo “1” > /proc/sys/net/ipv4/ip_forward

And voila’, after re-requesting the IP-address on your client you can enjoy the net on your client. But be careful not to terminate the connection when reacquireing the IP address)

Leave a Reply

Your email address will not be published. Required fields are marked *