如何设置FreeBSD无线接入点

如何设置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 - 用于无线接入点连接的内部无线网卡。
如果您只针对无线局域网,可以省略所有对fxp1和lan_if的引用。在配置文件中,只需从所有文件中删除$ lan_if。相反,对于仅限有线的设置,请删除对$ wifi_if和ath0的所有引用。

网络将被确认如下:

  • 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的功能无线接入点。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏