ما در این مقاله سعی داریم تا آموزش استفاده از FreeBSD به عنوان یک Access Point را بدهیم.

لطفاً توجه داشته باشید که برای تکمیل این مقاله از [FreeBSD Handbook] کمک گرفته شده است.

نرم‌افزار‌های مورد نیاز

اگر بخواهیم FreeBSD به عنوان یک Access Point کار کند باید ابزارهای (نرم‌افزارهای) زیر را روی سیستم نصب کنیم:

  • اطمینان حاصل کنیم که سرویس های ‎hostapd و named (bind)‎ روی سیستم نصب باشند.
  • کرنل سیستم را از نو کامپایل کنیم و قابلیت پشتیبانی از pf را به آن اضافه کنیم.
نکته:
شما می توانید از فایروال های دیگر نظیر ipfw و یا ipfilter نیز استفاده کنید اما در این مقاله نحوه تنظیمات فایروال pf آموزش داده خواهد شد.
  • تنظیمات مربوط به NAT روی فایروال
  • نصب بسته isc-dhcp3-server بر روی سیستم
  • پیکربندی سرویس های و راه اندازی آنها

سخت‌افزار مورد نیاز

در اینجا بعد از آشنایی با نرم‌افزارهای مورد نیاز اجازه دهید مقداری هم درباره سخت‌افزارهای مورد نیاز راه اندازی FreeBSD Access Point صحبت کنیم:

  • یک کارت شبکه سیمی که به upstream متصل باشد.
  • یک کارت شبکه بی‌سیم که بتواند به کاربران متقاضی سرویس دهد. (در این مقاله ما کارت شبکه بی  سیم مبتنی بر چیپ Atheros را به جهت پشتیبانی عالی آن در FreeBSD پیشنهاد می کنیم.)
  • یک کارت شبکه سیمی دیگر که به شبکه LAN ما متصل باشد. (این کارت شبکه به این دلیل استفاده می‌شود که سیستم ما در این مقاله هر دو نوع اتصال wireless و wire را پشتیبانی می کند و اگر شما به wire احتیاجی ندارید می توانید از این کارت استفاده نکنید.)

تا به اینجا با نرم‌افزارها و سخت‌افزارهای مورد نیاز جهت راه اندازی FreeBSD Access Point آشنا شده‌ایم.

در ادامه مقاله به چگونگی راه اندازی سرویس های معرفی شده و پیکربندی آن‌ها می پردازیم.

آغاز به کار

در ابتدا اطمینان حاصل کنید که سیستم شما به اینترنت دسترسی دارد و بعد از کسب اطمینان به ترتیب به بررسی وجود سرویس های معرفی شده می  پردازیم و در صورت وجود نداشتن آنها را نصب و پیکربندی می کنیم.

ایتدا بررسی می کنیم ببینیم که named بر روی سیستم ما وجود دارد یا نه:

witch named

در صورتی که named بر روی سیستم وجود نداشت آن را نصب می کنیم:

pkg_add -r bind9
نکته:
شما می توانید این سرویس را توسط پورت‌ها نیز نصب کنید.

در مرحله بعدی بررسی می کنیم ببینیم که hostapd روی سیستم نصب می باشد یا نه:

witch hostapd

برنامه hostapd یک قسمت از سیستم عامل FreeBSD است و در صورت وجود نداشتن می توانید با استفاده از Installer سیستم عامل آن را اضافه کنید.

بعد از اتمام مرحله قبلی نوبت به کامپایل مجدد کرنل سیستم عامل می رسد. برای این منظور ابتدا بررسی می کنیم ببینیم source مربوط به سیستم عامل نصب هست یا نه:

ls –l /usr/src/sys

در صورت نصب نبودن می توانید آن را به استفاده از این مقاله که قبلاً نوشته شده نصب کنید.

بعد از اطمینان از نصب بودن source به ترتیب دستورات زیر را اجرا می‌کنیم:

cd /usr/src/sys/`uname -m`/conf
cp GENERIC CUSTOM

سپس با استفاده از دستورات زیر قابلیت پشتیبانی از pf را در فایل تنظیمات کرنل اضافه می کنیم

echo "device pf
device pflog
device pfsync" >> CUSTOM
نکته:
جهت فعال سازی AltQ برای traffic shaping می توانید تنظیمات زیر را نیز به فایل تنظیمات کرنل اضافه کنید.
options         ALTQ
options         ALTQ_CBQ        # Class Bases Queuing (CBQ)
options         ALTQ_RED        # Random Early Detection (RED)
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler (HFSC)
options         ALTQ_PRIQ       # Priority Queuing (PRIQ)
options         ALTQ_NOPCC      # Required for SMP build

پیشنهاد می‌شود این تنظیمات اعمال شود به این دلیل که بعدها بسیار کاربردی خواهد بود!

نکته:
نحوه تنظیمات pf و altq به تفصیل در این مقاله توضیح داده شده است.

بعد از انجام تنظیمات فوق کرنل را با دستورات زیر کامپایل می  کنیم.

cd /usr/src
make buildkernel KERNCONF=CUSTOM
make installkernel KERNCONF=CUSTOM

بعد از اتمام کار باری اینکه سیستم با کرنل جدید بارگذاری شود احتیاج به reboot کردن سیستم است:

shutdown -r now

حال سیستم از لحاظ نرم‌افزاری آماده است و در مرحله بعدی باید به پیکربندی سرویس ها بپردازیم.

در ابتدا یک نگاه کلی به شبکه و ابزارهای آن و همچنین معرفی کارت های شبکه می پردازیم.

لطفا توجه داشته باشید ما سیستم را با استفاده از تعاریف زیر پیکربندی کرده‌ایم ممکن این در سیستم شما کمی متفاوت باشد.

  • fxp0 یا ext_if معرف کارت شبکه ای که به مودم WAN یا هر شبکه خارجی دیگری وصل است.
  • fxp1 یا lan_if معرف کارت شبکه ای که به شبکه LAN خودمان وصل است و به کاربران سیمی سرویس می دهد.
  • ath0 یا wifi_if معرف کارت شبکه بی سیمی که می خواهد به کاربران wireless سرویس دهد.
نکته:
اگر شما می خواهید فقط به کاربران wireless سرویس دهی کنید می توانید تمام خطوط مربوط به تنظیمات wire را که شامل $lan_if می‌شود را از فایل‌های تنظیمات حذف کنید و بر عکس.

پس با توجه به گفته بالا تنظیمات شبکه ای ما در این مقاله به صورت زیر می‌باشد:

fxp0 - ext_if - DHCP configured from upstream (e.g. let cable modem provide an IP) 
fxp1 - lan_if - static IP, 192.168.0.1; wired subnet will be 192.168.0.0/24; clients on LAN configured via DHCP 
ath0 - wifi_if - static IP, 192.168.1.1; wireless subnet will be 192.168.1.0/24; clients on WLAN configured via DHCP 

تنظیم کارت های شبکه سیستم

لطفاً توجه داشته باشید که تمام تنظیمات با توجه به توضیحات بالا انجام می شود.

ابتدا کارت fxp0 را با استفاده از دستور زیر تنظیم می کنیم

dhclient fxp0

سپس به تنظیم fxp1 می پردازیم

ifconfig fxp1 inet 192.168.0.1 netmask 255.255.255.0

سپس ابتدا اطمینان حاصل می کنیم که آیا کارت شبکه بی سیم ما بارگذاری شده است یا نه و در صورت منفی بودن پاسخ آن را بارگذاری می کنیم

for d in {if_ath,ath_rate,ath_hal}; do kldload $d; done
نکته:
در صورتی که از کارت بی سیمی به جز سری Atheros based استفاده می کنید می توانید از دستور زیر جهت بارگذاری کارت خود استفده کنید.
for d in {wlan_wep_load,wlan_tkip_load,wlan_ccmp_load,wlan_xauth_load,wlan_acl_load}; do kldload $d; done

بعد از بارگذاری کارت بی سیم سیستم با استفاده از دستور زیر آن را تنظیم می کنیم:

ifconfig ath0 inet 192.168.1.1 netmask 255.255.255.0 ssid YOURSSID mediaopt hostap

تنظیمات NAT و هر rule فایروال

ابتدا با استفاده از دستور زیر به سیستم اجازه می دهیم که نقش یک مسیریاب یا دروازه ‎)router/gateway)‎ را بازی کند

sysctl -w net.inet.ip.forwarding=1

و سپس فایروال سیستم را که pf باشد را فعال می کنیم

pfctl -e

حال برای اینکه تنظیمات مربوط به NAT و rule های فایروال را انجام دهیم ابتدا یک فایل pf.conf را در مسیر /etc می سازیم و تنظیمات زیر را در آن کپی می کنیم.

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
# This configuration is set for use on a machine that is a router with
# three (3) network cards:
# ext_if - connects to the upstream link (cable/dsl modem, WAN, etc.)
# wifi_if - wireless card for internal network
#           (if none present, remove all references to it in this file)
# lan_if  - wired card for internal network
#           (if none present, remove all references to it in this file)
#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#------------------------------------------------------------------------
# macros
#------------------------------------------------------------------------
logopt = "log"
# interfaces
ext_if  = "fxp0"
wifi_if = "ath0"
lan_if  = "fxp1"
# publically accesible services (transport layer neutral)
pubserv = "{ 22, 443 }"
# internally accessible services (transport layer neutral)
lanserv = "{ 22, 53, 67, 80, 443 }"
# samba ports (transport layer neutral)
samba_ports = "{ 137, 138, 139 }"
# externally permitted inbound icmp types
icmp_types = "echoreq"
# internal network
lan_net = "{ 192.168.0.0/24, 192.168.1.0/24 }"
# hosts granted acces to samba (cifs/smb) shares
smb_net = "{ 192.168.0.0/27, 192.168.1.0/27, 192.168.0.90, 192.168.1.90 }"
# block these networks
table  { 0.0.0.0/8, 10.0.0.0/8, 20.20.20.0/24, 127.0.0.0/8, \
       ۱۶۹٫۲۵۴٫۰٫۰/۱۶, ۱۷۲٫۱۶٫۰٫۰/۱۲,  ۱۹۲٫۰٫۲٫۰/۲۴, ۱۹۲٫۱۶۸٫۰٫۰/۱۶, \
       ۲۲۴٫۰٫۰٫۰/۳,    ۲۵۵٫۲۵۵٫۲۵۵٫۲۵۵ }
#------------------------------------------------------------------------
# options
#------------------------------------------------------------------------
# config
set block-policy return
set loginterface $ext_if
set skip on lo0
# scrub
#scrub all reassemble tcp no-df
#scrub in all fragment reassemble
scrub out all random-id
#------------------------------------------------------------------------
# redirection (and nat, too!)
#------------------------------------------------------------------------
# network address translation
nat on $ext_if from $lan_net to any -> ($ext_if)
#------------------------------------------------------------------------
# firewall policy
#------------------------------------------------------------------------
# restrictive default rules
block all
block return-rst  in  $logopt on $ext_if proto tcp all
block return-icmp in  $logopt on $ext_if proto udp all
block             in  $logopt on $ext_if proto icmp all
block             out $logopt on $ext_if all
# trust localhost
pass in  quick on lo0 all
pass out quick on lo0 all
# anti spoofing
block drop in  $logopt quick on $ext_if from  to any
block drop out $logopt quick on $ext_if from any to 
antispoof for { $lan_if, $wifi_if, $ext_if }
# anti fake return-scans
block  return-rst  out on $ext_if proto tcp all 
block  return-rst  in  on $ext_if proto tcp all 
block  return-icmp out on $ext_if proto udp all
block  return-icmp in  on $ext_if proto udp all 
# toy with script kiddies scanning us
block in $logopt quick proto tcp flags FUP/WEUAPRSF 
block in $logopt quick proto tcp flags WEUAPRSF/WEUAPRSF 
block in $logopt quick proto tcp flags SRAFU/WEUAPRSF 
block in $logopt quick proto tcp flags /WEUAPRSF 
block in $logopt quick proto tcp flags SR/SR 
block in $logopt quick proto tcp flags SF/SF 
# open firewall fully
# warning: insecure. 'nuff said.
#pass in  quick all
#pass out quick all
# allow permitted icmp
pass in inet proto icmp all icmp-type $icmp_types keep state
# allow permitted services
pass in on $ext_if            inet proto tcp       from any      to any port $pubserv flags S/SA keep state
pass in on {$lan_if $wifi_if} inet proto {tcp udp} from $lan_net to any port $lanserv            keep state
pass in on {$lan_if $wifi_if} inet proto {tcp udp} from $smb_net to any port $samba_ports        keep state
# permit access between LAN hosts
pass in  from $lan_net to $lan_net keep state
pass out from $lan_net to $lan_net keep state
# permit full outbound access 
# warning: potentially insecure. you may wish to lock down outbound access.
pass out from any to any keep state

بعد از ذخیره تنظیمات باید آنها را با استفاده از دستور زیر در pf بارگذاری کنیم

pfctl -Fa -f /etc/pf.conf

نصب و پیکربندی ISC DHCP server

ابتدا با استفاده از دستور زیر سرور را نصب می کنیم:

pkg_add -r isc-dhcp3-server

بعد از نصب سرور فایل تنظیمات را که در مسیر /usr/local/etc/dhcpd.conf می باشد را به صورت زیر ویرایش می کنیم

###
### GLOBAL SETTINGS
###
ddns-update-style none;
always-broadcast on;
default-lease-time 7200;
max-lease-time 7200;
authoritative;
option domain-name-servers 192.168.1.1;
option domain-name "localnet.localdomain";
option netbios-name-servers 192.168.1.1;
###
### WIRED LOCAL AREA NETWORK
###
subnet 192.168.0.0 netmask 255.255.255.0 {
        #
        # NOTES:
        # (۱) allocation of endings 100-199 by DHCP is 
        # inteded for clients that are not specified
        # later in this file.
        # (۲) allocation is done in increments of 10
        # and this is done intentionally.
        #
        range 192.168.0.100 192.168.0.199;
        option broadcast-address 192.168.0.255;
        option subnet-mask 255.255.255.0;
        option routers 192.168.0.1;
}
###
### WIRELESS NETWORK 
###
subnet 192.168.1.0 netmask 255.255.255.0 {
        # NOTE: See: wired->range.notes
        range 192.168.1.100 192.168.1.199;
        option broadcast-address 192.168.1.255;
        option subnet-mask 255.255.255.0;
        option routers 192.168.1.1;
}
###
### ASSIGN SPECIFIC IP ADDRESSES TO SPECIFIC HOSTS BASED ON MAC ADDRESS
### (optional)
###
## host foo
#host foo {
#        hardware ethernet XX:XX:XX:XX:XX:XX;
#        fixed-address 192.168.0.XYZ;
#}
## host bar
#host bar {
#        hardware ethernet XX:XX:XX:XX:XX:XX;
#        fixed-address 192.168.1.XYZ;
#}

پیکربندی hostapd

فایل تنظیمات سرویس را که در مسیر /etc/hostapd.conf هست را به صورت زیر ویرایش می کنیم:

interface=ath0
driver=bsd
logger_syslog=-1
logger_syslog_level=0
logger_stdout=-1
logger_stdout_level=0
debug=3
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
#### IEEE 802.11 related config ####
ssid=YOURSSID
macaddr_acl=0
auth_algs=1
#### IEEE 802.1X related config ####
ieee8021x=0
#### WPA/IEEE 802.11i config #####
wpa=1
wpa_passphrase=ENTER_YOUR_PASSPHRASE_HERE
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP TKIP 

بعد از اعمال این تنظیمات تقریباً کار تمام است اما برای اینکه مجبور نباشیم تنظیمات مربوط به کارت های شبکه را بعد از هر بار reboot سیستم مجدد انجام دهیم به ترتیب کارهای زیر را انجام می دهیم:

ابتدا تنظیمات زیر را به فایل rc.conf در مسیر /etc اضافه می کنیم

### GENERAL SETTINGS
gateway_enable="YES"
hostname="wifiap"
### CONFIGURATION FOR EXTERNAL INTERFACE (UPSTREAM LINK)
### example: link to cable/dsl modem
ifconfig_fxp0="DHCP"
### CONFIGURATION FOR INTERNAL WIRED NETWORK
ifconfig_fxp1="inet 192.168.0.1 netmask 255.255.255.0"
### CONFIGURATION FOR INTERNAL WIRELESS NETWORK
ifconfig_ath0="inet 192.168.1.1 netmask 255.255.255.0 ssid YOURSSID mediaopt hostap"
### CONFIGURATION FOR PACKET FILTER
### requires kernel recompile, see:
### http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-pf.html
pf_enable="YES"                 # Set to YES to enable packet filter (pf)
pf_rules="/etc/pf.conf"         # rules definition file for pf
pf_program="/sbin/pfctl"        # where the pfctl program lives
pf_flags=""                     # additional flags for pfctl
pflog_enable="YES"              # Set to YES to enable packet filter logging
pflog_logfile="/var/log/pflog"  # where pflogd should store the logfile
### DAEMONS FOR LAN
hostapd_enable="YES"            # wireless services (clients use wpa_supplicant)
named_enable="YES"              # dns for clients
dhcpd_enable="YES"              # dhcp configure clients
sshd_enable="YES"               # so we can remotely access this box 

سپس تنظیمات مربوط به مازول راه انداز کارت بی سیم را به فایل loader.conf در مسیر /boot اضافه می کنیم.

wlan_wep_load="YES"
wlan_tkip_load="YES"
wlan_ccmp_load="YES"
wlan_xauth_load="YES"
wlan_acl_load="YES"

توجه: ممکن است بسته به سخت‌افزاری که شما استفاده می کنید نام ها در فایل‌های تنظیمات متفاوت باشد.

کار تمام است و بعد از reboot سیستم شما یک FreeBSD Access Point دارید.

shutdown -r now

تبریک!