如何设置FreeBSD无线接入点
本文将指导您如何使用FreeBSD系统作为无线接入点。 这是为了补充FreeBSD手册而不是替换它。
将FreeBSD作为无线接入点,包括以下步骤:
- 确保您的安装包括hostapd和命名 (BIND)
- 重新编译你的内核以支持pf
- pf不是唯一这样做的方法,但我强烈希望pf到ipfw / ipfilter,并写了使用方法
- 配置NAT(和任何防火墙规则)
- 安装isc-dhcp3-server
- 配置守护程序并启动它们
硬件要求/注意事项:
- 一个网卡连接到上游。 这是外部网络接口(ext_if)。 在这个How-To中将会是fxp0。 你可能有所不同
- 一个无线网卡提供无线服务。 我喜欢基于Atheros的卡,无论FreeBSD支持的卡,你是很好,虽然(wifi_if)。 在这个How-To它将是ath0。 你可能有所不同
- 可选地,用于有线LAN访问的附加有线网卡(int_if)(通过交叉电缆或网络交换机/集线器)。 不需要,但我的系统提供无线和有线局域网接入。 在这个How-To中将会是fxp1。 你们可能有所不同
可下载的示例配置文件位于http://tun0.net/ascii/config/freebsd_access_point/ 。
入门
在我们继续之前,最好连接您希望将访问点连接到Internet的FreeBSD系统。 连接到互联网(或您拥有的任何上游连接)超出了本文档的范围。 FreeBSD手册中有关于网络通信的整个章节。
为了简单起见,请以root身份执行本网站提供的所有命令。 他们中的大多数将要求root权限。 要成为root,请键入su
,输入root密码并按Enter键。
检查你是否有BIND
BIND通常与FreeBSD一起发布,但是为了确保系统上存在BIND,请执行以下命令:
which named
如果这告诉你命名未找到 ,那么你将不得不安装BIND。
sudo pkg_add -r bind9
检查你是否拥有hostapd
使用哪个命令检查hostapd:
which hostapd
hostapd程序是FreeBSD基础系统的一部分。 如果不存在,您可能有一个最小的系统。 您可以使用FreeBSD安装程序添加更多的分发集,或者从源更新系统,并以此方式获取。
检查是否有内核源
您将需要构建一个自定义内核,因为基本内核不提供OpenBSD包过滤器(pf)。 这是一个简单而且相对较快的过程,稍后再讨论。
ls -l /usr/src/sys
如果以上告诉你没有这样的文件或目录或没有输出数据,那么你将需要获取内核源码。 这在FreeBSD手册的同步源部分有很好的解释。
重新编译你的内核
FreeBSD手册中详细记录了重新编译内核和包括PF支持的过程。 我将总结以下过程。
转到内核配置目录并根据GENERIC(默认,库存)内核启动自己的内核配置。
cd /usr/src/sys/`uname -m`/conf
cp GENERIC CUSTOM
只要你知道你在做什么,你可以编辑你以前的想法。 有关任何内核选项的说明,
可以参考/ usr / src / sys / conf / NOTES
文件。 只需确保为PF支持添加以下行。 您可以使用vi,您最喜欢的文本编辑器,或只是将其回显到文件中。
echo "device pf
device pflog
device pfsync" >> CUSTOM
或者,如果您希望利用PF的流量整形功能(ALTQ),我建议将以下行添加到自定义内核配置中:
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
最后,重新启动,以便您可以使用新的内核。
shutdown -r now
无线接入点网络概述
我们将建立如下系统:
- fxp0 - ext_if - 连接到有线/ DSL调制解调器,WAN等的外部卡
- fxp1 - lan_if - 提供有线LAN接入的内部卡。
- ath0 - wifi_if - 用于无线接入点连接的内部无线网卡。
网络将被确认如下:
- fxp0 - ext_if - 从上游配置的DHCP(例如让电缆调制解调器提供IP)
- fxp1 - lan_if - 静态IP,192.168.0.1; 有线子网将为192.168.0.0/24; 通过DHCP配置的LAN上的客户端
- ath0 - wifi_if - 静态IP,192.168.1.1; 无线子网将为192.168.1.0/24; WLAN上的客户端通过DHCP配置
配置接口
获取ext_if(外部接口)的IP
dhclient fxp0
在lan_if上设置IP
ifconfig fxp1 inet 192.168.0.1 netmask 255.255.255.0
确保为无线接口加载驱动程序。 对于基于Atheros的卡,您将需要以下单行单行命令:
for d in {if_ath,ath_rate,ath_hal}; do kldload $d; done
对于任何无线卡,包括Atheros卡,请确保我们已经装载了所有正确的无线模块。 以下是一条长行,但它是一条单行命令:
for d in {wlan_wep_load,wlan_tkip_load,wlan_ccmp_load,wlan_xauth_load,wlan_acl_load}; do kldload $d; done
使用单行单行命令将IP设置为wifi_if(ath0):
ifconfig ath0 inet 192.168.1.1 netmask 255.255.255.0 ssid YOURSSID mediaopt hostap
配置NAT(和任何防火墙规则)
首先,让系统设置为路由器/网关,并启用PF。 以root身份执行以下命令。
sysctl -w net.inet.ip.forwarding=1
pfctl -e
为NAT创建一个pf.conf和一些基本的防火墙规则。 使用vi或您喜爱的编辑器,并将以下内容添加到/etc/pf.conf文件中。
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 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, \ 169.254.0.0/16, 172.16.0.0/12, 192.0.2.0/24, 192.168.0.0/16, \ 224.0.0.0/3, 255.255.255.255 } #------------------------------------------------------------------------ # 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
使用以下命令加载上述配置:
pfctl -Fa -f /etc/pf.conf
安装和配置ISC DHCP服务器
要为LAN / WLAN上的客户端动态分配IP地址,您需要使用ISC DHCP服务器。
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: # (1) allocation of endings 100-199 by DHCP is # inteded for clients that are not specified # later in this file. # (2) 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; #}
配置主机
编辑/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
通过rc.conf使我们的设置永久化
我们不想手动配置我们的界面或每次手动启动我们的守护程序,所以我们将它全部放到/etc/rc.conf中
:
### 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
我们不想一直手动加载内核模块,所以我们将它们放到/boot/loader.conf中
:
wlan_wep_load="YES" wlan_tkip_load="YES" wlan_ccmp_load="YES" wlan_xauth_load="YES" wlan_acl_load="YES"
启动守护程序
您可以轻松地重新启动:shutdown -r now但是,如果您是真正的Unix狂热分子,并且不喜欢重新启动,则可以执行以下操作:
/etc/rc.d/pflog start
/etc/rc.d/named start
/etc/rc.d/dhcpd start
/etc/rc.d/hostapd start
完成了!
恭喜! 在这一点上,假设您遵循指示并且没有错误,您应该使用连接到上游链路的WPA和有线LAN的功能无线接入点。