树莓派论坛

 找回密码
 立即注册

用Raspberry Pi制作无线路由过程的札记3-开机自动启用无线路由功能的相关系统配置

树老大 发表于 2013-5-21 23:22:09 | 显示全部楼层 |阅读模式

安装好无线网卡的驱动和hostap之后,需要进行一些系统配置,以便每次启动操作系统的时候就会自动启动无线路由功能,而无须手工重复相同的配置工作。配置好后,RPi就可以完全脱离显示器,成为一个独立的无线路由使用了。

1、网络接口

现在RPi的网络拓扑结构是:有线ADSL+无线AP。
RPi负责发起ADSL连接请求,IP地址直接从ISP获取,所以只须在操作系统启动时启用有线网络接口即可,无须其他设置。但是Arch Linux ARM默认安装时会给有线网络接口启用DHCPC服务,即DHCP客户端服务。而IP地址的获取已由Moderm来负责,DHCPC便是多余的。再者,启用了它,会导致每次系统启动时报告DHCPC启动错误的信息。所以,干脆把有线网络接口上的DHCPC给关掉:

  1. [root@alarmpi ~]# systemctl disable dhcpcd@eth0
复制代码

而无线网络接口则需要一个静态IP,这些可以通过编写一个配置文件和一个systemd脚本来让系统在每次启动时自动配置。首先建立一个配置文件,用来定义接口及其IP等网络配置信息:

  1. interface=wlan0
  2. address=10.0.0.1
  3. netmask=24
  4. broadcast=10.0.0.255
  5. gateway=10.0.0.1
复制代码

配置文件里定义了网络接口wlan0的IP地址、子网掩码、广播地址及网关。将它保存为/etc/conf.d/wifi,接下来是建立下面的systemd脚本:

  1. [Unit]
  2. Description=Static IP Connectivity (%i)
  3. Wants=network.target
  4. Before=network.target
  5. BindsTo=sys-subsystem-net-devices-%i.device
  6. After=sys-subsystem-net-devices-%i.device

  7. [Service]
  8. Type=oneshot
  9. RemainAfterExit=yes
  10. EnvironmentFile=/etc/conf.d/wifi
  11. ExecStart=/sbin/ip link set dev ${interface} up
  12. ExecStart=/sbin/ip addr add ${address}/${netmask} broadcast ${broadcast} dev ${interface}
  13. ExecStop=/sbin/ip addr flush dev ${interface}
  14. ExecStop=/sbin/ip link set dev ${interface}

  15. [Install]
  16. WantedBy=multi-user.target
复制代码

把上述的内容保存到脚本文件/etc/systemd/system/network@wlan0.service。脚本文件定义了要在所以有网络服务启动前运行,即Before=network.target,这样就可以保证它在设置了指定的静态IP后才开始工作。[Service]段只的EnvironmentFile中就是上面创建的配置文件。而后面几行ExecStart就是执行网络接口配置的命令,而ExecStop则是在系统关闭前执行的,这里是几个关闭网络接口的命令。
其实也可以把配置文件的内容直接写入systemd脚本文件,而分成两个文件是为了便于日后修改相关的网络配置时,不会影响到脚本文件。
创建好这两个文件后,就可以通过

  1. [root@alarmpi ~]# systemctl enable network@wlan0
复制代码

来启用systemd脚本,每次系统启动时都会进行指定的网络设置,这样wlan0每次会被设置相同的静态IP及其他网络参数。

2、DHCP

在客户端通过AP连接到RPi时,需要一个IP才能与AP通信,而且这个IP必须在同一个网段里。如果让客户端自己定义IP的话就容易造成IP冲突,所以最好采用动态IP分配,即要用到DHCP。如果系统里还没有安装DHCP,可以通过pacman来安装:

  1. [root@alarmpi ~]# pacman -S dhcp
复制代码

编辑文件/etc/conf.d/dhcp,在里面的DHCP4_ARGS(IPv6为DHCP6_ARGS)参数里添加需要使用DHCP服务的网络接口:

DHCP4_ARGS="-q wlan0"

然后,编辑文件/etc/dhcpd.conf,加入使用DHCP的子网配置信息:

  1. subnet 10.0.0.0 netmask 255.255.255.0 {
  2.         range 10.0.0.10 10.0.0.100;
  3.         option routers 10.0.0.1;
  4.         option domain-name-servers 8.8.8.8, 8.8.4.4;
  5.         option broadcast-address 10.0.0.255;
  6. }
复制代码

这里设置了DHCP分配的IP范围是10.0.0.10~10.0.0.100,也就是客户端所获得的IP地址就在10.0.0.10~10.0.0.100范围内。option routers设置的是客户端使用的网关。option domain-name-servers设置的是客户端使用的DNS,这里使用了Google的DNS服务器8.8.8.8和8.8.4.4。其实也可以把ISP分配的DNS地址加在这两个地址前面,毕竟它们应该是本地最快的DNS。如果ISP的DNS地址改变了,并且没有及时更新这里的DNS设置,则前两个ISP的DNS解析失败后就会使用Google的DNS,还是可以正常解析域名。
完成DHCP的配置后,就可以通过

  1. [root@alarmpi ~]# systemctl start dhcpd4
复制代码

来启动DHCP服务,要在系统启动时自动启动DHCP服务,还需要执行:

  1. [root@alarmpi ~]# systemctl enable dhcpd4
复制代码
3、iptables

经过了上述的配置后,即使客户端能够连接上AP,但依然无法访问Internet。要让无线客户端共享RPi的ADSL有线网络,除了提供相关的接入设施外,RPi还要负责数据交换,即能将内网的数据发送到指定的外网位置,也要将响应数据发送到相应的内网位置。完成这项工作的就是iptables。iptables作为Linux内核的一部分,提供了数据包过滤及转发的功能。iptables因为其灵活的数据包处理能力而成为Linux系统中的防火墙工具。而这里用到的是iptables的SNAT(源地址转发)功能。要使用SNAT,先要打开内核IP转发功能:

  1. [root@alarmpi ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
复制代码

然后向iptables的nat表中添加转发规则。ADSL对应的网络接口是ppp0,要将数据包转发到ppp0去,故需要向iptables的nat表添加一条转发规则:

  1. [root@alarmpi ~]# iptables -t nat -A POSTROUTING -O ppp0 -j MASQUERADE
复制代码

由于ADSL使用的是动态IP,所以使用-j MASQUERADE目标来获取ppp0当前分配到的IP。
现在就可以使用已经连接到RPi的无线客户端访问外网了。不过,iptables的规则只要系统启动后设置才有效,重新启动后就会被清除,所以要想每次启动都自动开启这个转发规则就得将iptables的规则保存下来。可以使用iptables-save来保存:

  1. [root@alarmpi ~]# iptables-save > /etc/iptables/iptables.rules
复制代码

之所将iptables的规则保存在/etc/iptables/iptables.rules文件中,是因为系统中已经有一个iptables的systemd脚本。如果启用了它,会在每次系统启动的时候执行iptables-restore来恢复/etc/iptables/iptables.rules文件中保存的规则到iptables中去,这样就可以实现系统启动自动加载所需要的iptables规则了。别忘了还要启用iptables的systemd脚本:

  1. [root@alarmpi ~]# systemctl enable iptables
复制代码
4、系统时间

RPi内部没有时钟,所以每次启动RPi时,系统时间都是从1970年1月1日0时0分0秒开始。外加一个时钟感觉没有必要,因为可以用网络对时来取代。实现网络对的就是openntpd服务。通过systemd即可启用它:

  1. [root@alarmpi ~]# systemctl enable openntpd
复制代码

但总发现一个问题就是,openntpd似乎与adsl一起启动。这样就会导致如果openntpd启动的时候ADSL还没有连接上,系统就不会立即获取正确的时间,而导致启动之后的一段时间内都会停留在原始时间里。造成这个问题的原因在于openntpd的启动是在网络初始化之后,而不是在ADSL之后。而现在的情况是没有连上ADSL之前openntpd都无法连接到Internet授时服务器,也就是不能给系统设置正确的时间。为了避免这个问题,可以通过修改openntpd的systemd脚本中的启动依赖关系来实现。修改openntpd的systemd脚本文件/usr/lib/systemd/system/openntpd.service,将其中的After=network.target改成After=adsl.service即可。
时间正确后还需要设置一下时区。使用systemd脚本的方法很简单,只须执行:

  1. [root@alarmpi ~]# timedatectl set-timezone Asia/Shanghai
复制代码

即可。
虽然时间对于无线路由功能的影响不大,但会对系统中的其他模块的工作造成一定的影响,如文件系统、数据包处理等。所以推荐完成这一步的配置,以便RPi能运行在正确的时间上。

5、PPTP VPN

至此用RPi制作的无线路由就可以投入使用了。不过在使用过程中,还是发现了一些问题:客户端无法连接PPTP协议的VPN服务器。google一下,发现是需要加载ip_nat_pptp模块:

  1. [root@alarmpi ~]# modprobe ip_nat_pptp
复制代码

但这样需要在每次连接VPN前都加载一次,太麻烦了!简单点,用上一篇文章的加载无线网卡驱动模块的方法。在/etc/modules-load.d目录中创建一个文件nf_nat_pptp.conf,在里打上:

  1. ip_nat_pptp
复制代码

后保存即可。

6、系统语言

虽然系统语言配置与路由的使用无关,只是因为系统是新装,所以也把它作为系统配置的一部分罢了。通过

  1. [root@alarmpi ~]# locale -a
复制代码

列表当前系统已经启用的语言。但此时会看到几条信息:

  1. locale: Cannot set LC_CTYPE to default locale: No such file or directory
  2. locale: Cannot set LC_MESSAGES to default locale: No such file or directory
  3. locale: Cannot set LC_COLLATE to default locale: No such file or directory
复制代码

这是因为系统还没有启用相应的语言,而且在启动一些和语言相关的程序或服务时,也会收到类似的locale没有设置的错误信息。
要解决这个问题,需要先编辑/etc/locale.gen文件,将要使用语言项目前面的#去掉,保存文件,执行:

  1. [root@alarmpi ~]# locale-gen
复制代码

系统就开始生成需要的语言。最后通过下面的命令来设置系统全局的locale(假设这里设置系统的locale为zh_CN.utf8):

  1. [root@alarmpi ~]# localectl set-locale LANG="zh_CN.utf8"
复制代码

执行上述的命令后,你所设置的语言就会添加到/etc/rc.conf文件中。下次启动系统时就会自动启用相应的语言了。



文章来自: http://gutspot.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版 | Archiver | 树莓派论坛 ( 粤ICP备15075382号-1 )