1. 程式人生 > >[Raspbian]RaspberryPi做自動pppoe撥號路由器

[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可以接入了。為什麼不能這樣呢?