-、通过hostapd、dhcp和iptables创建wifi热点

        我早在三年前,就注意android了。不过最近才买了台天宇w719,而之前我一直在用MTK平台手机。

        买手机之前一个星期内,我通过互联网,非常详细的有了解了一遍android。我打算将它打造成一种超级装备:因为我用的系统是fedora17系统,笔记本自带的网卡支持AP,所以我打算通过ssh达成手机与笔记本的互访。

        补注:

        在往下进行时,请确定自己的网卡支持AP,检查方法:

             iwlist

        有 AP 一项则表示支持AP。

        在linux系统上安装ssh是非常方便的。比如,我用的rpm系的,那么:
            //前者是ssh客户端,用于连接手机;后者是ssh服务端,用于手机连接笔记本
            yum install openssh-clients;yum install openssh-server
        至于手机,可以用quickssh建立ssh服务端。
        当手机到手后,扯淡的事来了!系统是android-4.0.4,在互联网上找不到可用的wpa_supplicant文件(ad-hoc补丁,原生android系统不支持ad-hoc热点)。仅仅这个阻碍,一下子就把我的设想完全推翻了!
        不过,我不气馁。
        通过搜索,了解到通过hostapd可以模拟AP((无线)访问接入点)。互联网上介绍这方面的文章比较多,针对ubuntu系统的为多。而且,内容大多各不相同;内容相同的地方,多在于hostapd.conf的配置。重点难点、易糊涂的地方在dhcpd.conf的配置和iptables的配置。下文中,我会对这两方面作比较详细的说明。文章末尾也会留下几个我所参考到的几篇文章的地址。
        1,先说hostapd.conf的配置。
        安装:
            yum install hostapd
        配置:
            fedora17中,该文件位置在/etc/hostapd/hostapd.conf

            用vim编辑,文件的内容如下:


# This will give you a minimal, insecure wireless network.
#
# DO NOT BE SATISFIED WITH THAT!!!
#
# A complete, well commented example configuration file is
# available here:
#
# /usr/share/doc/hostapd-0.7.3/hostapd.conf
#
# For more information, look here:
#
# http://wireless.kernel.org/en/users/Documentation/hostapd
#

ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel

# Some usable default settings...
# 指定MAC地址过滤规则,0表示除非在禁止列表否则允许,1表示除非在允许列表否则禁止
accept_mac_file = 指定允许MAC列表文件位置,且一行一个
deny_mac_file = 指定禁止MAC列表文件位置,且一行一个
auth_algs=1
ignore_broadcast_ssid=0

# Uncomment these for base WPA & WPA2 support with a pre-shared key
# 密码的安全类型
wpa=3
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

# DO NOT FORGET TO SET A WPA PASSPHRASE!!
# 写自己的wifi密码
wpa_passphrase=****

# Most modern wireless drivers in the kernel need driver=nl80211
driver=nl80211

# Customize these for your local configuration...
#ssid处写热点的名称
interface=wlan0
hw_mode=g
channel=6
ssid=xxx
country_code=US

        配置好后,执行:
             sudo hostapd -B /etc/hostapd/hostapd.conf
        以刚才编辑的指定配置文件启动hostapd服务,启动无线热点。到这里,手机wifi应该能搜得到笔记本发射出的无线信号了。而且执行ifconfig,显示会有mon.wlan0虚拟网卡。但此时,可能手机一直显示正在获取ip地址。原因是,笔记本端没有给手机端分配ip地址。以下方法,可以解决这个问题。

        2,dhcpd.conf的配置。
        安装:
        yum install dhcp
        配置:
            fedora17中,该文件位置在 /etc/dhcp/dhcpd.conf
            用vim编辑,文件的内容如下:

#ddns-update-style interim;
#ignore client-updates;

# sunnet后面的地址可以根据自己的情况写成 192.168.0.0之类的
subnet 10.10.0.0 netmask 255.255.255.0
{

# --- default gateway设置客户端的相关选项
#允许dhcpd服务分配的ip区间,也就说,比如我设置的可以连接15台设备。这是hostapd模拟AP的优势所在
range 10.10.0.2 10.10.0.16;
option routers 10.10.0.1;#路由
#option subnet-mask 255.255.255.0;

# option nis-domain "domain.org";
# option domain-name "domain.org";
option domain-name-servers 8.8.8.8,208.67.222.222;#域名服务器
option broadcast-address 10.10.0.255;#广播地址

#option time-offset -18000; # Eastern Standard Time
# option ntp-servers 10.10.0.0;
# option netbios-name-servers 10.10.0.0;
# --- Selects point-to-point node (default is hybrid). Don't change this unless
# -- you understand Netbios very well
# option netbios-node-type 2;

default-lease-time 600;
max-lease-time 7200;

# we want the nameserver to appear at a fixed address
# host ns {
# next-server marvin.redhat.com;
# hardware ethernet 94:39:e5:34:b2:95;
# fixed-address 207.175.42.254;
# }
}

        配置好后,执行:
            sudo ifconfig wlan0 10.10.0.1/16 netmask 255.255.255.0
        以设置虚拟网卡的子网区间和子网掩码。
之后执行:
            sudo service dhcpd start
        以启动dhcpd服务,用于动态给各接入设备分配ip地址。

        至此,便解决了 手机一直显示正在获取ip地址 的问题。但新的问题来的,设配虽然能接入虚拟网卡,却上不了网。其原因在于,从设备来的数据没有通过真实网卡传递到互联网中。自然,互联网中的数据也无法送入设配。以下方法可以解决这个问题:nat和端口转发。

        3, iptables的配置。
            fedora17自带了,iptables(防火墙软件)。它可以实现nat和端口转发。
        配置:
fedora17中,该文件位置在 /etc/sysconfig/iptables

        在这里要先弄清楚,哪个网卡是虚拟网卡的适配器。

        执行ifconfig:


lo: flags=73<UP,LOOPBACK,RUNNING> mtu 16436
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 726 bytes 58044 (56.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 726 bytes 58044 (56.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

mon.wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
unspec 94-39-E5-34-B2-95-00-00-00-00-00-00-00-00-00-00 txqueuelen 1000 (UNSPEC)
RX packets 115719 bytes 29273395 (27.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

p7p1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::226a:8aff:fe60:78af prefixlen 64 scopeid 0x20<link>
ether 20:6a:8a:60:78:af txqueuelen 1000 (Ethernet)
RX packets 585598 bytes 464520457 (443.0 MiB)
RX errors 0 dropped 1 overruns 0 frame 0
TX packets 176682 bytes 16436547 (15.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 1 collisions 0

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1492
inet 117.9.210.54 netmask 255.255.255.255 destination 117.9.208.1
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 584705 bytes 449004909 (428.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 175927 bytes 12520569 (11.9 MiB)
TX errors 0 dropped 5 overruns 0 carrier 0 collisions 0

wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.10.0.1 netmask 255.255.0.0 broadcast 10.10.255.255
inet6 fe80::9639:e5ff:fe34:b295 prefixlen 64 scopeid 0x20<link>
ether 94:39:e5:34:b2:95 txqueuelen 1000 (Ethernet)
RX packets 129595 bytes 8819481 (8.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 278844 bytes 410783345 (391.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0


        但我没弄懂。感觉不是wlan0。。。有空用排除法试试。目前,笔记本的wifi功能可正常使用。。。


        执行:
            sudo iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -o wlan0 -j MASQUERADE
            sudo iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -o p7p1 -j MASQUERADE
            sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
            sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
            sudo iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j SNAT --to-source 117.14.57.165
            sudo iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -o ppp0 -j MASQUERADE
        以激活nat功能。

            用vim编辑,文件的内容如下:
# Generated by iptables-save v1.4.14 on Wed Jan 2 09:54:48 2013
*nat
:PREROUTING ACCEPT [632:42667]
:INPUT ACCEPT [8:953]
:OUTPUT ACCEPT [852:53269]
:POSTROUTING ACCEPT [8:480]
-A POSTROUTING -s 10.10.0.0/16 -o wlan0 -j MASQUERADE
-A POSTROUTING -s 10.10.0.0/16 -o p7p1 -j MASQUERADE
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -o ppp0 -j MASQUERADE
-A POSTROUTING -s 10.10.0.0/24 -o eth0 -j SNAT --to-source 117.14.57.165
-A POSTROUTING -s 10.10.0.0/16 -o ppp0 -j MASQUERADE
COMMIT
# Completed on Wed Jan 2 09:54:48 2013
# Generated by iptables-save v1.4.14 on Wed Jan 2 09:54:48 2013
*filter
:INPUT ACCEPT [592:356647]
:FORWARD ACCEPT [725:232604]
:OUTPUT ACCEPT [704:73587]
COMMIT
# Completed on Wed Jan 2 09:54:48 2013

        执行:
            sudo service iptables restart

        重启防火墙,以使新的配置立即生效。

补充:对于fedora18,可以先把iptables配置文件放在/etc/sysconfig/,然后执行sudo /usr/libexec/iptables/iptables.init start。这条语句会自动调用/etc/sysconfig/iptables配置文件。fedora17应该也可以的。


        将 /etc/sysctl.conf 中的 net.ipv4.ip_forward 的值设置为1
        执行:
            sysctl -p
        让上一条配置立即生效(然后如果手机依然上不了网,就考虑 sudo service iptables restart 重启防火墙)

        至此,手机应该可以上网了。
        我还没来得及验证以上叙述过程的严谨性和正确性。所以如有问题,请留言提出。我会一起和你想办法解决问题的。

        4,补充。
        我觉得开机自动联网,并且开启wifi热点最方便了。到本文下一部分的 用ConnectBot 以ssh方式访问linux系统,并且如同在真实linux系统的字符模式下操作系统 你就知道这个特性是多么重要了。如何达到目的呢?我搜了到一个解决方案。--那就是,在rc.local文件里加入想要自启动的命令(注意, 这里务必写命令的绝对(完全)路径,否则可能将无法自启动)。
        rc.local位置在:
            /etc/rc.d/rc.local
        编辑rc.local;
        只需将:
            /sbin/hostapd -B /etc/hostapd/hostapd.conf
            /sbin/ifconfig wlan0 10.10.0.1/16 netmask 255.255.255.0
            /sbin/service dhcpd start

        加入rc.local里就可以了。经实验,在系统即将进入桌面时,wifi热点就已经启动了。

       
        保存设置,这样规则才会被存入/etc/sysconfig/iptables中:

        /etc/rc.d/init.d/iptables save

              

二、通过ssh达成linux系统与android设备的互访


        到此,如果你只是为让手机连上网。那么下面的内容,就不必看了。
        下面说linux系统与android设备的互访。
1,android设备访问linux系统。
        前一部分已经说过,linux系统需要安装openssh-server。而手机上需要安装ssh客户端。这里,我选择用ConnectBot。

        登录界面如图:


        比如登录我的系统,我填写的是:root@117.8.24.56。

        补注:需要注意的一点的是,@后的IP地址可以有两种写法:一是wifi主机的外网IP,二是wifi主机虚拟AP的路由地址。用后者要方便的多,如果你的外网IP是动态的话,其优势就显现出来了。下面在介绍SMB协议时,也可以这么写IP,将不再赘述。

        linux系统所能操作的,android设备通过ConnectBot大多能完成。只是由于手机屏幕太小而且缺少方向键等按键,显得很麻烦、效率不高、操作不顺手。好像,ConnectBot还有其它功能和特性,或可弥补前述种种不适。我还没有过深发掘,我用到的目前主要是reboot或者shutdown now。而因为种种原因导致我不得不应该重启linux系统时,本文前一部分wifi自启动的优势就非常明显的显示出来了。尤其是在北方的冬天或者早晨的床上~~

        2,linux系统通过ssh方式连接android设备。
        因为android系统基于linux,所以该系统本身就保留了很大一部分linux的特性。比如,linux强大的命令行工具。android系统原生支持ssh的。我们用第三方软件,方便地实现它。
        我用的是QuickSSHd,网上可以找到已付费版本。先在手机端上安装QuickSSHd。
        QuickSSHd的配置和登录界面,如图:



        设置好密码,点上面的结束完成设置,开启sshd服务。另外, 默认登录的用户名是root。在linux端输入ssh root@10.10.0.2 ,密码就是刚才设置好的密码。

        经过以上两个步骤,linux系统与android设备之间就完成了互访、互操作。但是,随着我的深入研究,发现这并不完美。不完美处,体现在:虽然ssh可以通过scp命令互传文件,但是我没成功。重要的是,命令行模式操作对于小小手机而言简直就是灾难。于是我想是否有其他更简约的方法,代替ssh。
        终于找到了,可以通过SMB协议实现android设备向linux上传或从linux下载文件。

三、通过SMB协议实现android设备向linux上传或从linux下载文件


        1,linux端需要安装 samba-client samba-common system-config-samba。

            yum install samba-client samba-common system-config-samba
        在root下执行:
            system-config-samba
        打开的是,samba的图形配置界面。
        1) 点击首选项->服务器设置->安全性->验证模式 选用户->加密密码 选是。
        2) 点击首选项->samba用户->添加用户,添加你的linux系统用户名,如test;windows用户是情况而定。密码自己设置,不一定要和系统密码一样。
        3) 点击加号,创建samba共享->选择->设置共享名->点击访问选项卡->点击为这些用户提供访问->勾选test。

        配置好后,执行:
            sudo systemctl start smb.service

        打开防火墙,在可信的服务里勾选 Samba 和 Samba 客户端。

        关闭selinux。

       vim /etc/selinux/config

    把SELINUX=enforcing  改成SELINUX=disable

            如果有必要让SMB服务自启动的话,就把 /bin/systemctl start smb.service 加入rc.local文件里(最好对多添加的内容,做个注释,不然后积累多了可能自己就忘记某项命令的用途了)。

            注:关于samba的配置,网上很多资料,很多比我说的步骤多。我的说法有所疏漏,如果你遇到了samba方面的问题,不妨告诉我。我们一起解决问题。

            2,android设备访问通过SMB协议共享的数据。
            刚开始我用的是AndSMB,随后发现这款软件不怎么好用:不能后台下载;不能在线查阅(文本、图片、音乐、视频);有个有点,有明显的上传按钮。
            尝试了好几款软件后,觉得 ES文件浏览器 友好易用、功能上支持除SMB协议外的其他协议、可作为一般的文件浏览器使用。
            3,在linux系统端图形化管理android设备上的文件。

            启动andriod4.0.4自带的文件浏览器里的 无线管理-> 启动服务 功能。根据提示操作即可。

            各软件市场也有相同功能的软件。


        我参考到的文章链接:

        hostapd基本配置

        手机通过usb自动连接linux电脑上网,传输数据。*需要root* (安卓4升级)

        Ubuntu 12.04 – setting up my Wifi Hotspot(需自己翻墙)

        带有无线网卡的linux主机做wifi热点

        给你的android开启SSH服务

        巧妙设置Android来方便管理Linux和Windows

         Linux下玩小米手机:上网、文件传输技巧      

         架设samba,通过wifi向android移动设备分享文件


需要转载的,请自觉加上原始链接地址。

Logo

更多推荐