Tips en Trucs 2014

Software Wi-Fi Access Point

Een WAP of Wi-Fi Access Point (draadloos toegangspunt) is een apparaat dat Wi-Fi apparaten zoals smartphones, tablets, notebooks, enz. mogelijk maakt om verbinding te maken met een draadloos netwerk. Een nadeel van draadloze Wi-Fi verbindingen is dat ze over grotere afstanden minder snel werken. De nieuwe Wi-Fi componenten worden tegenwoordig vandaag zelfs standaard in Desktop computers gebouwd. Veel mensen gebruiken echter de draadverbinding naar het netwerk, deze is namelijk sneller en veel stabieler. De draadloze mogelijkheden van de desktopcomputer wordt dan helemaal niet gebruikt. Deze nieuwe desktop wi-fi componenten zijn sneller en reiken verder dan de in uw router ingebouwde wi-fi componenten. De niet gebruikte wi-fi componenten in uw desktop kunnen we dus inzetten als tweede Wi-Fi Access Point, waardoor je een betere Wi-Fi dekking krijgt. Daarenboven kan je het tweede Access Point aanbieden aan derden bij een barbecue in de tuin, edm.

Het SoftWAP script dat ik vandaag publiceer is geƫvolueerd uit het SoftAP script dat ik hier vroeger publiceerde. Het is dus een stuk moderner en houdt onder andere rekening met NetWorkManager, bestaande netwerkverbindingen en gebruikt een afzonderlijk netwerk. NetworkManager wordt in moderne distributies gebruikt om de gebruiker het netwerk zelf te laten instellen. De bestaande netwerkverbindingen worden minder agressief behandeld, waardoor andere diensten minder gestoord worden. Zo worden de VMWare diensten niet langer gestoord. Het gebruik van een apart netwerk zorgt ervoor dat je het WiFi Access Point netwerk eenvoudiger kunt afschermen van uw thuisnetwerk.

Voorbereiding

Het script gebruikt enkele apparaat afhankelijke en persoonlijke instellingen. Deze staan vooraan in het script. De apparaat afhankelijke instellingen kan je opvragen met de volgende opdracht:

dany@linux-55yl:~> ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 64:70:02:11:f2:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.65/24 brd 192.168.1.255 scope global enp3s0
       valid_lft forever preferred_lft forever
    inet6 fe80::6670:2ff:fe11:f25f/64 scope link 
       valid_lft forever preferred_lft forever
3: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 4c:72:b9:62:8f:c4 brd ff:ff:ff:ff:ff:ff
4: wlp4s0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
    link/ether f4:b7:e2:bf:ff:91 brd ff:ff:ff:ff:ff:ff
7: vmnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:50:56:c0:00:01 brd ff:ff:ff:ff:ff:ff
    inet 192.168.208.1/24 brd 192.168.208.255 scope global vmnet1
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fec0:1/64 scope link 
       valid_lft forever preferred_lft forever
8: vmnet8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:50:56:c0:00:08 brd ff:ff:ff:ff:ff:ff
    inet 192.168.179.1/24 brd 192.168.179.255 scope global vmnet8
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fec0:8/64 scope link 
       valid_lft forever preferred_lft forever

Daarbij stelt lo de loopback netwerkkaart voor. Deze wordt gebruikt voor interne communicatie. Netwerkkaarten waarvan de namen beginnen met de letters enp hebben in de hardware een ingebouwde locatie aanduiding. Netwerkkaarten waarvan de namen beginnen met de letters eno zijn on-board netwerkkaarten. Netwerkkaarten waarvan de namen beginnen met de letters wlp zijn draadloze Wi-Fi netwerkkaarten. De interfaces die beginnen met de letters vmnet zijn virtulele netwerkkaarten die door VMware gebruikt worden.

Het script

#!/bin/bash
#
# SoftWAP Version 14.07
# 2014 Dany Pinoy <pindanet.be>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

WANIF="enp3s0"      # Naam netwerkkaart naar het internet, het huidige IP en Broadcast adres worden in de volgende tweer regels opgezocht
WANIP=`/sbin/ip -f inet -oneline addr show $WANIF | cut -d " " -f7`
WANBRD=`/sbin/ip -f inet -oneline addr show $WANIF | cut -d " " -f9`
LANIF="wlp4s0"           # Netwerkverbinding naar het LAN (WiFi)
LANIP="192.168.0.1"      # Het IP adres van het toekomstige Wi-Fi Access Point, mag niet in het bereik liggen van uw intern netwerk, in het voorbeeld 192.168.1.x
LANBRD="192.168.0.255"   # Het broadcast adres van uw Wi-Fi Access Point (255 als laatste cijfer)
LANSUBNET="192.168.0.0"  # Het Wi-Fi subnet (nul als laatste cijfer)
LANRANGE="192.168.0.100 192.168.0.200"   # De IP adressen voorbehouden voor de apparaten die met het Access Point verbonden worden
MODE="g"	# WiFi mode a, b, g
CHANNEL="6"	# Te gebruiken WiFi kanaal, door dit aan te passen worden andere Wi-Fi netwerken minder gestoort en omgekeerd
ESSID="PindaSoftAP"   # De naam van het Access Point
KEY="snt+4567"        # Het wachtwoord om een verbinding met het Access Point op te bouwen
NTPSERVER=`dig be.pool.ntp.org | grep ^be.pool.ntp.org | head -1 | awk '{print $5}'`
WAIT="1"     # Sommige opdrachten zetten acties in gang die wat tijd vragen, hier wordt 1 seconde gewacht, maak dit indien nodig groter

# Controleer of het script met rootrechten is gestart, m.a.w. start het script met sudo sh SoftWAP.sh
if [[ $EUID -ne 0 ]]; then
  echo "Dit script heeft rootrechten nodig." 1>&2
  exit 1
fi

# Controleer de aanwezigheid van de WiFi netwerkverbinding
ip a show dev $LANIF
if [ $? != 0 ]; then
  echo "De WiFi verbinding $LANIF is niet actief of ontbreekt."
  exit 1
fi

# Controleer de aanwezigheid van de WAN netwerkverbinding
ip a show dev $WANIF
if [ $? != 0 ]; then
  echo "De internet verbinding $WANIF is niet actief of ontbreekt."
  exit 1
fi

# Indien nodig hostapd installeren
if [ ! -e /usr/sbin/hostapd ]; then
  zypper --non-interactive install hostapd
fi

# Indien nodig dhcp-server installeren
if [ ! -e /usr/sbin/dhcpd ]; then
  zypper --non-interactive install dhcp-server
fi

# Originele hostapd configuratie veilig stellen
if [ ! -e /etc/hostapd.conf.ori ]; then
  cp /etc/hostapd.conf /etc/hostapd.conf.ori
fi

# Schakel de eventuele actieve NetworkManager uit
NETWORKMANAGERACTIF=`nmcli -t -f RUNNING nm`
if [ $NETWORKMANAGERACTIF == "running" ]; then
  GATEWAY=`ip route | grep default | awk '{print $3}'`
  nmcli nm wifi | grep enabled
  WIFIACTIF=$?
  if [ $WIFIACTIF != 0 ]; then
    nmcli nm wifi on
    echo "WiFi geactiveerd."
    sleep $WAIT		# Wacht tot WiFi geïnitialiseerd is
  fi
  systemctl stop NetworkManager.service
  echo "Networkmanager uitgeschakeld."
  # Herstel de netwerkverbinding zonder NetworkManager
  ip link set dev $WANIF up
  sleep $WAIT
  ip addr add $WANIP broadcast $WANBRD dev $WANIF
  ip route add default via $GATEWAY
fi

# Initialiseer de Wi-Fi verbinding
ip link set dev $LANIF up
ip addr add $LANIP/24 broadcast $LANBRD dev $LANIF

# Originele dhcpd configuratie veilig stellen
if [ ! -e /etc/sysconfig/dhcpd.ori ]; then
  cp /etc/sysconfig/dhcpd /etc/sysconfig/dhcpd.ori
fi
# Originele dhcpd configuratie veilig stellen
if [ ! -e /etc/dhcpd.conf.ori ]; then
  cp /etc/dhcpd.conf /etc/dhcpd.conf.ori
fi
# dhcpd configuratie aanpassen
sed -i "s|^\(DHCPD_INTERFACE=\).*$|\1\"$LANIF\"|" /etc/sysconfig/dhcpd
yast2 firewall services add zone=INT service=service:dhcp-server
echo 'option domain-name "pinda.local";' > /etc/dhcpd.conf
echo "option ntp-servers $NTPSERVER;" >> /etc/dhcpd.conf
echo 'ldap-dhcp-server-cn "pindadhcp";' >> /etc/dhcpd.conf
echo "ddns-update-style none;" >> /etc/dhcpd.conf
echo "subnet $LANSUBNET netmask 255.255.255.0 {" >> /etc/dhcpd.conf
echo "  range $LANRANGE;" >> /etc/dhcpd.conf
echo "  default-lease-time 14400;" >> /etc/dhcpd.conf
echo "  max-lease-time 172800;" >> /etc/dhcpd.conf
echo "  option domain-name-servers $LANIP, 8.8.8.8;" >> /etc/dhcpd.conf
echo "  option routers $LANIP;" >> /etc/dhcpd.conf
echo "}" >> /etc/dhcpd.conf
systemctl start dhcpd.service

# Originele SuSEfirewall2 configuratie veilig stellen
if [ ! -e /etc/sysconfig/SuSEfirewall2.ori ]; then
  cp /etc/sysconfig/SuSEfirewall2 /etc/sysconfig/SuSEfirewall2.ori
fi
# De firewall instellen om het Wi-Fi verkeer naar de WAN verbinding (internet) door te sturen
sed -i "s|^\(FW_ROUTE=\).*$|\1\"yes\"|" /etc/sysconfig/SuSEfirewall2
sed -i "s|^\(FW_DEV_INT=\).*$|\1\"$LANIF\"|" /etc/sysconfig/SuSEfirewall2
sed -i "s|^\(FW_MASQUERADE=\).*$|\1\"yes\"|" /etc/sysconfig/SuSEfirewall2
systemctl restart SuSEfirewall2.service

# De Access Point software instellen
cat > /etc/hostapd.conf <<:end
interface=$LANIF
driver=nl80211
channel=$CHANNEL
ssid=$ESSID
hw_mode=$MODE
auth_algs=1
wmm_enabled=1
ieee80211n=1
ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40]
wpa=2
wpa_passphrase=$KEY
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP
:end
systemctl start hostapd.service

echo -e "\033[1;32;40mHet WiFi Access Point $ESSID is in de lucht.\033[0;37;40m." # Groen op zwart
echo -e '\033[1;32;40mDruk Return om het Access Point af te sluiten\033[0;37;40m.'
read Keypress
# SoftAP stoppen
systemctl stop hostapd.service
systemctl stop dhcpd.service
ip addr del $LANIP/24 dev $LANIF
ip link set dev $LANIF down
if [ $NETWORKMANAGERACTIF == "running" ]; then
  ip addr del $WANIP dev $WANIF
  ip link set dev $WANIF down
  systemctl start NetworkManager.service
  echo "Networkmanager geactiveerd."
  if [ $WIFIACTIF != 0 ]; then
    nmcli nm wifi off
    echo "WiFi uitgeschakeld."
  fi
fi

cp /etc/sysconfig/SuSEfirewall2.ori /etc/sysconfig/SuSEfirewall2
systemctl restart SuSEfirewall2.service