create hostapd with ipv4&6 support

捣鼓了这么久,总算是实现在树莓派3b上开启支持ipv4和ipv6的热点,真是不容易,网上各种傻x桥接,根本跑不起来,看着都气人。

环境

我用的是ubuntu官方的ubuntu18 server,但是能安装dnsmasqhostapd的应该都通用

方法

  1. 安装dnsmasqhostapd

  2. 配置网卡

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    network:
    version: 2
    ethernets:
    eth0:
    dhcp4: true
    match:
    macaddress: b8:27:eb:a6:cc:93
    set-name: eth0
    wlan0:
    dhcp4: no
    dhcp6: no
    optional: true
    addresses: [192.168.0.1/24, "fd00:fd:fd:fd::1/60"]
    nameservers:
    addresses: [1.0.0.1]

    这里我是ubuntu18,所以用的是netplan。之前的版本,请自行百度设置静态地址。如果你知道上下的地址关系,你可以随便改,不然就别改。

  3. 配置hostapd
    修改/etc/hostapd/hostapd.conf

    1
    2
    3
    4
    5
    6
    7
    8
    interface=wlan0
    channel=10
    wpa=2
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=CCMP
    rsn_pairwise=CCMP
    wpa_passphrase=12345678 #热点密码
    ssid=pi #热点名称

    修改/etc/default/hostapd

    1
    DAEMON_CONF="/etc/hostapd/hostapd.conf"
  4. 配置dnsmasq
    修改/etc/dnsmasq.conf

    1
    2
    3
    4
    interface=wlan0
    enable-ra
    dhcp-range=192.168.0.2,192.168.0.255,255.255.255.0,24h
    dhcp-range=fd00:fd:fd:fd::2,fd00:fd:fd:fd::10,ra-names,24h
  5. 配置/etc/sysctl.conf

    1
    2
    net.ipv4.ip_forward=1
    net.ipv6.conf.all.forwarding=1
  6. 重启服务

    1
    2
    sudo service hostapd restart
    sudo service dnsmasq restart

    这时应该可以连上wifi,并且获取ipv4和v6的地址了

  7. 配置v4防火墙

    1
    2
    3
    sudo iptables -t nat -APOSTROUTING -o eth0 -j MASQUERADE
    sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

    这时ipv4应该就可以上网了

  8. 配置v6防火墙

    1
    sudo ip6tables -t nat -A POSTROUTING -s fd00:fd:fd:fd::/64 -o eth0 -j MASQUERADE

    这时,ipv6也可以上网了

开机自启

按照上面的方法,你已经可以上ipv4和ipv6了,但是每次重启都要执行命令。
修改/etc/rc.local

1
2
3
4
iptables -t nat -APOSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
ip6tables -t nat -A POSTROUTING -s fd00:fd:fd:fd::/64 -o eth0 -j MASQUERADE

完事,有问题请Email,或是来这里发issue