[Raspbian]RaspberryPi做自動pppoe撥號路由器
簡述
想把RaspberryPi作為一個家庭伺服器使用,家裡使用的ADSL電信的介面,之前得用一個路由器,然後將RaspberryPi連線到路由器的LAN口,這樣,就得給兩個東東供電……改成一個就更好了,於是就想用執行Raspbian的RaspberryPi把兩者的事情都一起做了。
參考資料
無線熱點配置
硬體條件
首先RPi要插上一個無線網絡卡,我使用的無線網絡卡內部IC是RealTek的RTL8188,這樣,通過RPi的Ethernet介面連線到家裡的ADSL moderm進行PPPoE撥號,從Ethernet轉發到Wifi,以無線熱點的方式與其他wifi裝置共享網路。如果不是用的這款無線網絡卡IC,要先確認下無線網絡卡是否支援Access Point模式。
需要打通的步驟
- 使能無線網絡卡作為Access Point
- 在有wifi裝置(手機,平板……)連線到RPi wifi網路時,自動分配IP地址給這些裝置
- 將Ethernet撥號網路與wifi網路使用網路地址轉發方式整合,這樣wifi網路才會真正連線到internet
必要軟體安裝
sudo apt-get install hostapd udhcpd
hostapd:使能和管理無線網絡卡作為Access Point用;
udhcpd:使無線網絡卡能動態分配IP地址給連線來的wifi裝置。
這裡有一點要特別補充,RTL8188並不被RPi官方的Debian系統所支援,hostapd使用它時要做如下額外的配置:
sudo apt-get install bridge-utils hostapd
wget http://www.daveconroy.com/wp3/wp-content/uploads/2013/07/hostapd.zip
unzip hostapd.zip
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.bak
sudo mv hostapd /usr/sbin/hostapd.edimax
sudo ln -sf /usr/sbin/hostapd.edimax /usr/sbin/hostapd
sudo chown root.root /usr/sbin/hostapd
sudo chmod 755 /usr/sbin/hostapd
其實以上步驟就是對原來的hostapd做了些修改,用於能正常驅動RTL8188,如果沒有進行這一步,後面的hostapd功能經測試使用是不能用的。
配置DHCP
sudo nano /etc/udhcpd.conf
修改其中的一些內容(我將其中的option dns,opt wins的內容都mask掉了):
start 192.168.42.2 # This is the range of IPs that the hostspot will give to client devices.
end 192.168.42.20
interface wlan0 # The device uDHCP listens on.
remaining yes
opt dns 8.8.8.8 4.2.2.2 # The DNS servers client devices will use.
opt subnet 255.255.255.0
opt router 192.168.42.1 # The Pi's IP address on wlan0 which we will set up shortly.
opt lease 864000 # 10 day DHCP lease time in seconds
使能DHCP server
sudo nano /etc/default/udhcpd
註釋掉其中的DHCPD_ENABLED=”no”這一行:
#DHCPD_ENABLED="no"
配置無線網絡卡
wlan0配置為靜態IP
將wlan0的IP地址設定為上面的router地址:
sudo ifconfig wlan0 192.168.42.1
然後還要確保下次boot時也會自動將wlan0的IP地址設定為該值,所以:
sudo nano /etc/network/interfaces
修改interfaces檔案的內容為:
auto lo
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet manual
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
配置HostAPD
sudo nano /etc/hostapd/hostapd.conf
將其檔案內容改為如下:
interface=wlan0
driver=rtl871xdrv
ssid=My_SSID_Name
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=MYPASSWORD
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
然後配置hostapd檔案路徑:
sudo nano /etc/default/hostapd
修改其中的DAEMON_CONF內容為:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
配置NAT(網路地址轉發)
NAT使多個網路裝置能通過一個連線到internet的裝置聯網,Linux支援Netfilter (iptables)的方式進行網路地址轉發。
核心的IP轉向功能啟動與配置
啟動核心的IP轉向功能:
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
為了在boot時自動配置啟用IP轉向功能,編輯/etc/sysctl.conf:
sudo nano /etc/sysctl.conf
在最後新增一句(或找到檔案中的這一句unmask掉):
net.ipv4.ip_forward=1
核心的NAT使能
sudo iptables -t nat -A POSTROUTING -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
為便於下次reboot後不要每次都重新輸入這些命令,將其儲存下來:
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
然後在/etc/network/interfaces檔案中的末尾新增如下一句:
up iptables-restore < /etc/iptables.ipv4.nat
開啟Access Point
sudo service hostapd start
sudo service udhcpd start
執行如下命令,將使之在之後reboot時自動開啟Access Point:
sudo update-rc.d hostapd enable
sudo update-rc.d udhcpd enable
配置結果
此時直接連線我的wlan0作為AP的無線網試了下,沒有連線成功,於是reboot系統,然後就能連線成功了。
在reboot完,log中最後看到了My IP address,顯示了eth0和wlan0的兩個地址,看來配置OK了。
用pad測試可以連線上網!
windows下用putty的SSH連線到eth0 OK!
Raspbian的log
連線上網路的pad
PPPoE撥號
這個在Raspbian下配置還比較簡單的,首先得想辦法將RaspberryPi連上網,因為要下載一些安裝包:
sudo apt-get install pppoe pppoeconf pppstatus
等到安裝完成,此時將RaspberryPi的eth0介面連線到家裡的電信ADSL的介面上,然後輸入命令:
pppoeconf
期間一直選擇Yes項,然後還會讓輸入電信ADSL的賬戶名和密碼,一直進行完就OK了。
然後用:
ifconfig
看下有沒有ppp0的資訊,有的話,一般就撥號成功咯。
重新做NAT
在PPPoE撥號成功後,需要重新設定下網路地址轉發,因為之前的操作是將eth0轉到wlan0了,而現在實際eth0是連線到電信介面的,實際使用的是ppp0,此時可以看到eth0的地址為169.254.xx.xx,表明是無效的IP,因此需要將ppp0轉發到wlan0。我先將/etc/iptables.ipv4.nat刪掉了,然後執行下面的:
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
sudo iptables -A FORWARD -i ppp0 -o wlan0 -m state --state RELATED, ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o ppp0 -j ACCEPT
為便於下次reboot後不要每次都重新輸入這些命令,將其儲存下來:
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
然後我用如下命令重啟raspbian的network:
sudo /etc/init.d/networking restart
結果卡住了,我將其停止,然後重新啟動了下hostapd和udhcpd,接著就可以用pad連線我的wifi了。OK!!!
開機自動PPPoE撥號
上面步驟過後,reboot系統如果發現沒法聯網了,用ifconfig看,沒有ppp0的話,說明是pppoe沒有起來,用pon dsl-provider:
pon dsl-provider//啟動建立的pppoe連線,連線名稱為 dsl-provider
poff (-a) //關閉連線,如使用a引數,表示關閉當前所有連線
plog //檢視pppoe連線的狀態
問題記錄
wlan0沒法設定成靜態IP
這個問題困擾比較久,因為將RPi當成路由器,需要將wlan0配成靜態IP,但是修改/etc/network/interface檔案,都是按照正常的步驟,修改也不會有問題,但是reboot之後,發現wlan0是沒有IP地址的,因此導致後面操作都不會成功。
開始也懷疑是否網絡卡驅動,但是lsusb是可以看到的,而且也可以配成AP被搜尋到,最後考慮到之前還對network相關做過一些其他的設定,想是不是其他配置檔案有影響呢?另外Raspbian是否會有不太穩定的地方呢?於是沒辦法,只好重刷Raspbian系統了,然後配wlan0為靜態IP,OK!!!
wlan0配成靜態IP後,ssh無法接入
將wlan0配成靜態IP,此時eth0是通過網線連線到我路由器的LAN口的,其方式是DHCP的(raspbian預設的),可以上網,然後將我window電腦使用Putty用SSH連線到eth0的地址,發現沒法成功,只要將wlan0的靜態IP方式恢復為系統預設manual方式,然後SSH可以接入了。為什麼不能這樣呢?