1. 程式人生 > >筆記本配置成路由器共享網絡

筆記本配置成路由器共享網絡

隊列 china 它的 路由選擇 共享 span man adc 訪問

  之所以用筆記本做路由是因為筆記本有兩個網卡:無線網卡和有線網卡

  本文要解決的問題是,在筆記本連上了無線網的情況下,如何讓旁邊的臺式機也能上網?

  一種方法是將臺式機與運營商提供寬帶的貓或路由器用網線連接,但如果沒有這種條件就不行,比如筆記本連的WIFI是公共場所的。

  另一種方法是讓臺式機與筆記本的網口相連,變筆記本為路由器,從而上網。

我的筆記本與臺式機都是Ubuntu 16.04。

筆記本的ifconfig:

[email protected]:~$ ifconfig
ens4 Link encap:以太網 硬件地址 b0:25:aa:18:37:d1
inet 地址:192.168.56.200

廣播:192.168.56.255 掩碼:255.255.255.0
inet6 地址: fe80::b225:aaff:fe18:37d1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 躍點數:1
接收數據包:136 錯誤:0 丟棄:0 過載:0 幀數:0
發送數據包:195 錯誤:0 丟棄:0 過載:0 載波:0
碰撞:0 發送隊列長度:1000
接收字節:15749 (15.7 KB) 發送字節:20429 (20.4 KB)

lo Link encap:本地環回
inet 地址:127.0.0.1 掩碼:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 躍點數:1
接收數據包:7431 錯誤:0 丟棄:0 過載:0 幀數:0
發送數據包:7431 錯誤:0 丟棄:0 過載:0 載波:0
碰撞:0 發送隊列長度:1000
接收字節:602072 (602.0 KB) 發送字節:602072 (602.0 KB)

wls3
Link encap:以太網 硬件地址 2c:6e:85:c4:1a:ad
inet 地址:192.168.1.105 廣播:192.168.1.255 掩碼:255.255.255.0
inet6 地址: fe80::8602:7c6:b7a0:721c/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 躍點數:1
接收數據包:117939 錯誤:0 丟棄:0 過載:0 幀數:0
發送數據包:56555 錯誤:0 丟棄:0 過載:0 載波:0
碰撞:0 發送隊列長度:1000
接收字節:143118550 (143.1 MB) 發送字節:7030929 (7.0 MB)

標紅的地方是重點。

筆記本的路由表:

[email protected]:~$ netstat -rn
內核 IP 路由表
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 wls3
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ens4
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wls3
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 ens4

筆記本連接的無線網接口名是wls3,它的IP是192.168.1.105,是路由器DHCP自動分配的,通過這個IP可以訪問外網,與外網通訊數據通過的網關是默認網關192.168.1.1。

wls3網絡接口所處的子網IP是192.168.1.0/24。

另外還需註意另外一個網絡接口ens4,它有IP地址192.168.56.200,子網掩碼255.255.255.0。這個接口本來是沒有IP的,但要給它配置上一個靜態IP:

[email protected]:~$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

#set ens4 as static ip
auto ens4
allow-hotplug ens4
iface ens4 inet manual
iface ens4 inet static
address 192.168.56.200
netmask 255.255.255.0
#gateway 192.168.0.1
#network 192.168.0.1

它的IP配置成192.168.56.200。

接下來還要配置下臺式機的IP:

臺式機的ifconfig:

[email protected]:~$ ifconfig
enp1s4 Link encap:以太網 硬件地址 00:1e:8c:c3:c5:88
inet 地址:192.168.56.201 廣播:192.168.56.255 掩碼:255.255.255.0
inet6 地址: fe80::21e:8cff:fec3:c588/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 躍點數:1
接收數據包:5419 錯誤:0 丟棄:0 過載:0 幀數:0
發送數據包:31431 錯誤:0 丟棄:0 過載:0 載波:0
碰撞:0 發送隊列長度:1000
接收字節:475257 (475.2 KB) 發送字節:11842976 (11.8 MB)

lo Link encap:本地環回
inet 地址:127.0.0.1 掩碼:255.0.0.0
inet6 地址: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 躍點數:1
接收數據包:273 錯誤:0 丟棄:0 過載:0 幀數:0
發送數據包:273 錯誤:0 丟棄:0 過載:0 載波:0
碰撞:0 發送隊列長度:1000
接收字節:21772 (21.7 KB) 發送字節:21772 (21.7 KB)

臺式機路由表:

[email protected]:~$ netstat -rn
內核 IP 路由表
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.56.200 0.0.0.0 UG 0 0 0 enp1s4
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 enp1s4
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s4

臺式機只有enp1s4這麽一個網口,它的IP也需被配置成靜態IP,配成192.168.56.201。

需要註意的是,臺式機網口的IP所處的子網IP要與筆記本的有線網卡子網IP相同。都是192.168.56.0/24。用一根網線把這兩個網口相連,即構成了一個局域網。兩個網口可以通過鏈路層協議直接通訊。

除了靜態IP外,還需要為臺式主機添加一條與外網通訊的默認路由,即:

Destination Gateway Genmask Flags MSS Window irtt Iface

0.0.0.0 192.168.56.200 0.0.0.0 UG 0 0 0 enp1s4

將網關地址設置成筆記本有線網口的IP地址192.168.56.200。

我們要關心數據包往返的過程:

臺式機192.168.56.201發往Internet的數據包先通過默認路由表項傳給(筆記本)網關192.168.56.200,再由路由器(筆記本)使用默認路由通過網口wls3轉發到下一個網關192.168.1.1,就這樣一直傳送到目的主機所處網絡和子網,目的主機接收到為止。

而從目的主機返回的數據包,也是通過使用相同的路由策略,一直將數據包轉發到192.168.1.1所在路由器的某個網口,然後根據此路由器內部的選路策略,它決定從網關192.168.1.1轉發到(筆記本)網關192.168.1.105(要註意此時筆記本是一臺路由器,它的每個網絡接口都可以稱為用來轉發數據包的網關)。然後筆記本搜索它自己的路由表,決定將此數據包通過網關ens4(192.168.56.200)轉發到處於同一子網的目的主機192.168.56.201。

上面提到臺式機兩項任務:配置靜態IP,添加默認路由。可以一步完成:

[email protected]:~$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

#set enp1s4 static ip address
auto enp1s4
iface enp1s4 inet static
address 192.168.56.201
gateway 192.168.56.200
netmask 255.255.255.0
dns-nameservers 114.114.114.114 114.114.115.115
#network 192.168.26.0
#broadcast 192.168.26.255

可以看到裏面還配置了DNS服務器地址,因為靜態IP不會自動獲取對應的DNS服務器。筆記本不用為ens4接口(靜態IP)配置DNS服務器,因為筆記本上網是通過wls3接口(DHCP),自動獲取DNS服務器。

最後,開啟筆記本linux的數據包轉發功能,變成路由器:

  將文件/etc/sysctl.conf裏面的net.ipv4.ip_forward=1的註釋去除,然後重啟。

  linux默認是不開啟數據轉發的,net.ipv4.ip_forward項默認為0。將它置1才表示開啟,搖身一變路由器。

通過上面的介紹,看似這樣就可實現臺式機與Internet通訊,但實際上還忘記了一個很重要的問題:網關192.168.1.1所在的路由器的路由選擇問題。

  我稱這個路由器為A,假如外網主機給臺式機返回一個數據包,這個包先被A所接收,然後A憑什麽決定將此數據包(目的IP為192.168.56.201)通過接口192.168.1.1轉發給筆記本的192.168.1.105?雖然這種轉發路徑是我期望的,但A不知道這麽做,因為它的路由表裏面並沒有這種轉發條件:將目的地址為192.168.56.201的數據包從接口192.168.1.1轉發出去 或者 將目的IP所在子網為192.168.56.0/24的數據包從接口192.168.1.1轉發出去。於是它將使用路由表的默認表項進行轉發,在網絡中迷路,如果沒有默認表項則丟棄。如果路由器A和筆記本都使用動態選路協議,那筆記本可以將自己所處的網絡信息(192.168.56.0/24)告訴給A,自動讓A實現正確的選路。但它們兩的路由表都是靜態的,沒那麽高級。

  要解決這個問題,需要手動去為路由器A添加一條路由表項,但實際當中一般是不可行的。即使可行也有可能引起其他的選路問題。

  解決這個問題的一種有效方法是NAT。

  192.168.1.1所在路由器(路由器A)雖然不知道如何轉發目的IP為192.168.56.201的數據報,但是它知道如何轉發目的IP所在子網為192.168.1.0/24的數據報:就是通過網關192.168.1.1轉發出去的。

  因此我們可以在作為路由器的筆記本上使用NAT技術,將臺式機的IP(192.168.56.201)轉換成處於192.168.1.0/24網段的某個IP地址,進而與外網通訊。這樣,臺式機與外網的通訊對於A來說就像筆記本(192.168.1.105)與外網通訊一樣簡單,臺式機的IP對於A來說就像是處於192.168.1.0/24內的一臺機器。

  在筆記本上實現這種NAT,只需要root下執行下面這條命令:

  # iptables -t nat -A POSTROUTING -s 192.168.56.201 -j MASQUERADE

  執行後立即生效,重啟後會被清除。

對這條命令的解釋:

  -t nat : 對NAT映射表的操作

  -A POSTROUTING : 路由後進行轉換

  -s 192.168.56.201 : 指定要轉換的源主機IP

  -j MASQUERADE : 動態偽裝轉換後的IP地址而不是靜態寫死

iptables參考資料:http://blog.chinaunix.net/uid-26495963-id-3279216.html

SNAT和DNAT的實現

由於我們現在IP地址十分緊俏,已經分配完了,這就導致我們必須要進行地址轉換,來節約我們僅剩的一點IP資源。那麽通過iptables如何實現NAT的地址轉換呢? 1.SNAT基於原地址的轉換 基於原地址的轉換一般用在我們的許多內網用戶通過一個外網的口上網的時候,這時我們將我們內網的地址轉換為一個外網的IP,我們就可以實現連接其他外網IP的功能 所以我們在iptables中就要定義到底如何轉換: 定義的樣式: 比如我們現在要將所有192.168.10.0網段的IP在經過的時候全都轉換成172.16.100.1這個假設出來的外網地址: iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1 這樣,只要是來自本地網絡的試圖通過網卡訪問網絡的,都會被統統轉換成172.16.100.1這個IP. 那麽,如果172.16.100.1不是固定的怎麽辦? 我們都知道當我們使用聯通或者電信上網的時候,一般它都會在每次你開機的時候隨機生成一個外網的IP,意思就是外網地址是動態變換的。這時我們就要將外網地址換成 MASQUERADE(動態偽裝):它可以實現自動尋找到外網地址,而自動將其改為正確的外網地址。所以,我們就需要這樣設置: iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE 這裏要註意:地址偽裝並不適用於所有的地方。

筆記本配置成路由器共享網絡