ما در این مقاله سعی داریم تا آموزش استفاده از FreeBSD به عنوان یک Access Point را بدهیم.
لطفاً توجه داشته باشید که برای تکمیل این مقاله از [FreeBSD Handbook] کمک گرفته شده است.
نرمافزارهای مورد نیاز
اگر بخواهیم FreeBSD به عنوان یک Access Point کار کند باید ابزارهای (نرمافزارهای) زیر را روی سیستم نصب کنیم:
- اطمینان حاصل کنیم که سرویس های hostapd و named (bind) روی سیستم نصب باشند.
- کرنل سیستم را از نو کامپایل کنیم و قابلیت پشتیبانی از 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
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
پیشنهاد میشود این تنظیمات اعمال شود به این دلیل که بعدها بسیار کاربردی خواهد بود!
بعد از انجام تنظیمات فوق کرنل را با دستورات زیر کامپایل می کنیم.
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 سرویس دهد.
پس با توجه به گفته بالا تنظیمات شبکه ای ما در این مقاله به صورت زیر میباشد:
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
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
تبریک!