Ubuntu 18.04 網卡配置、NAT 轉發 及 DHCP 服務器配置

本次純屬記錄,希望有所幫助。
目的,模擬一個內網和外網,內網機器訪問外網,並進行 地址轉換。
實驗環境:
已有一個 192.16.10.0/24 網段的局域網,該網絡內擁有一臺路由器,用於給網絡中的設備分配IP地址。實驗時,把該局域網當成外網。以下都以外網稱呼。
欲配置一個 192.168.1.0/24 的網段作爲內網。
有一臺擁有兩網卡的Linux主機,將該Linux主機做成網關,其分別連接兩個網段,完成兩網段間的網絡地址的轉換工作。以下以網關稱呼。
以下操作均在root用戶下進行。

1. 網卡配置和NAT轉發

第一步:配置 網關

網關配置:系統 Ubuntu 18.04,內核版本 5.0.0,網卡1名稱:enp1s0,網卡2名稱:enx00e04c68066f
(網卡2是一個USB轉網卡,可使用ls /proc/sys/net/ipv4/confifconfig查看網卡名稱)

欲把該網關的 網卡 enp1s0 連接外網網段 192.16.10.0/24。網卡 enx00e04c68066f 連接 內網網段 192.168.1.0/24。
其 interface 文件配置如下:
vim /etc/network/interface

# enp1s0 採用 DHCP,等待分配 ip
auto enp1s0 
iface enp1s0 inet dhcp

# enx00e04c68066f 採用 靜態 ip,其 ip 是 192.168.1.2
auto enx00e04c68066f 
iface enx00e04c68066f inet static
address 192.168.1.2
netmask 255.255.255.0
# gateway 192.168.1.2 # 網關
# dns-nameservers 114.114.114.144 # DNS
# dns-nameservers 8.8.8.8

# 本地迴環地址,默認這樣配置即可
auto lo
iface lo inet loopback

說明,enp1s0 連接了外網,採用dhcp獲得地址(由上述所說的路由器分配地址)。enx00e04c68066f 連接內網,採用了靜態網絡配置,把ip地址設定爲 192.168.1.2。
然後使用/etc/init.d/networking restart重啓網絡。爲避免不必要的問題,建議重啓系統。
可使用ifconfig查看是否網絡配置是否生效了。
本人實驗時,enp1s0 分配到ip地址爲192.16.10.8.
在這裏插入圖片描述

第二步,網關 開啓內核轉發

在網關上,要配置內核轉發。
此爲永久生效方案,即重啓後仍有效
vim /etc/sysctl.conf
大約在文件的第28行,將以下內容的註釋去掉(或者新增一個)

net.ipv4.ip_forward=1

使內核轉發立即生效:
sysctl -p

第三步:配置內網中機器

將一臺Linux主機PC1的網卡eth1連接到 enx00e04c68066f 網卡。將其作爲內網機器。
爲其配置靜態ip地址192.16.10.5。
ifconfig eth1 192.16.10.5
或者,像上面一樣,通過修改 interface 文件實現靜態網絡配置。

配置後,一定用使用 ping 等命令測試 PC1 與 網關的內網 ip 是否連通。如ping 192.168.1.2,兩臺機子上都要ping對方機器。

然後加一條路由,告訴內網機器,發送給 192.16.10.0/24 的數據包,交給網關 192.168.1.2 處理。(確保能ping通之後,再加此路由)
route add -net 192.16.10.0/24 gw 192.168.1.2

route add -net 0.0.0.0 gw 192.168.1.2
注:重啓網絡或系統之後路由需重配。
或者在 interface 裏面,加上默認網關(gateway字段),指向 網關的內網 ip 地址。

注:使用route -n可查看當前的路由配置。使用route del -net 192.16.10.0/24 gw 192.168.1.2可刪除上述配置的路由。

如果是Windows系統,在“控制面板” -> “網絡和Internet” -> “網絡和共享中心” -> 左邊“更改適配器設置” -> 雙擊要配置的指定網卡->彈出的界面上,選擇“屬性” -> 在“此連接使用下列項目’中,找到並雙擊“Internet 協議版本4(TCP/IPv4)” -> 選中 “使用下面的IP地址”,並填寫相關參數(DNS服務器參數也可提供) -> 確定後關閉即可。

第四步,配置 網關的 NAT 轉發規則

轉發時,內網發出的數據包,其目的地址是 外網機器的ip,源地址是內網ip,應由 網關 將內網的 ip 地址 轉換成 網關的 外網 ip,然後,再發送出去,故爲源地址轉換,SNAT。

而外網返回回來的數據包,其源地址是外網機器的ip,目的地址是網關的外網 ip,應由 網關將 此 外網的 ip 地址,轉成內網的 ip 地址,然後發送給內網中對應的機器,故爲目的地址轉換,DNAT。

簡要解釋,如果數據包源地址是內網 ip ,外網機器 並不能識別這個 內網 ip 在哪裏,因此沒法返回消息,但 外網機器,可以識別該 網關的外網 ip,因而可以發送給網關,再由網關交給內網中實際的機器。因此 發出去之前,將 源 ip 改成 網關的外網 ip,返回時,要將 目的 ip 變爲 內網實際機器的 ip。

在網關上配置如下的 NAT 規則

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o enp1s0 -j MASQUERADE

其指示,來自 192.168.1.0/24 (也可以不指定),並由 enp1s0 發出去 的數據包,應進行 NAT 轉換。該 MASQUERADE 會自動進行 SNAT (似乎也會將返回數據包自動DNAT到內網機器上),有關於這個關鍵字的更多內容,可搜索“iptables -j MASQUERADE”瞭解。

配置完之後,應在內網 機器 PC1 上,ping 192.16.10.2 查看是否能通信,以及,ping 外網其他 ip 地址查看是否能通信。例如,外網路由器的 ip 地址是 192.16.10.254,需ping 192.16.10.254。可在網關或外網機器上,使用wireshark等軟件,抓包查看 發出來數據包的源ip地址 和 返回的數據包的目的ip地址,是否是那臺網關的 外網ip地址。
注:
可使用 iptables -t nat -nL查看配置的規則。
使用iptables -t nat -F 可清空規則。
或使用下面的,指定刪除上述規則。

iptables -t nat -D POSTROUTING -s 192.168.1.0/24 -o enp1s0 -j MASQUERADE

注:此規則,重啓電腦後會失效,需重配。也可採用如iptables-save等命令自動重配,此處請自行搜索。

到了這裏,配置就完了,內網機器要使用瀏覽器上網的話,最好再在其上配置dns地址。

2. 網關 配置 DHCP 服務器(可選)

上述第三步,內網是採用了靜態 ip 的形式進行了配置。也可以在 網關上 配置一個 DHCP 服務器,讓其給內網中的機器,分配內網地址和網關地址,以及dns地址。
此處使用 isc-dhcp-server 進行DHCP分配。
以下操作在 網關 機器上進行。

下載 DHCP 服務器 軟件

apt-get install isc-dhcp-server

配置 DHCP 服務器 設置

配置第一個文件
vim /etc/default/isc-dhcp-server
配置如下,應配置 網關 的 內網網卡作爲 DHCP 服務器監聽的網卡。
有的版本可能沒有v4和v6的區別,只有INTERFACES一條。

INTERFACESv4="enx00e04c68066f"
# 顯然上面是指ipv4,這個是指ipv6
INTERFACESv6="" 

配置第二個文件
vim /etc/dhcp/dhcpd.conf
這個是配置ipv4的dhcp用的。如果需要配置ipv6的,同目錄下,有個dhcpd6.conf是配置ipv6的dhcp用的。
注:建議配置前備份這兩個文件,本人刪除後,重裝軟件等啥操作都試了,還是沒有生成這兩個文件,不得已在其他虛擬機上安裝這個軟件,拷貝了這兩個文件過來。
該文件配置如下:

# option definitions common to all supported networks...
option domain-name "example.org"; # 可以不改,不知道有什麼用
#option domain-name-servers ns1.example.org, ns2.example.org;
option domain-name-servers 202.112.14.21,202.112.14.11; # 這個是DNS,也可填寫如114.114.114.114,一般填兩個

# 下面兩個是使用了默認值,應該和 DHCP 地址租期有關係
default-lease-time 600; # 
max-lease-time 7200;

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.) 
ddns-update-style none; # 這個不知道幹啥,默認吧

# 下面這個就是個人 DHCP 網段配置了,可參照文件裏面的示例寫
# 網段和掩碼
subnet 192.168.1.0 netmask 255.255.255.0 { 

	# DHCP 分配的地址範圍
	range 192.168.1.2 192.168.1.100; 
	
	# 內網 網關的 ip 地址
	option routers 192.168.1.2;  
	
	# 廣播地址
	option broadcast-address 192.168.1.255; 
}

請注意上面的字母還有分號啥的不要寫錯了。

網關 網卡配置

網關 的 內網網卡 enx00e04c68066f, 一般配置成上述 內網 網關 ip,即 192.168.1.2,採用靜態配置。這部分的 interface 和上面是一樣的。配置完後,建議/etc/init.d/networking restart重啓網絡。

啓動 DHCP 服務器

使用 server isc-dhcp-server restart 重啓 DHCP 服務器。如果出錯,這裏並不會報錯。
使用server isc-dhcp-server status 可以看到狀態,如果成功啓動,則應看到如下 active(running)等字眼。如下所示:
在這裏插入圖片描述
如果出錯,這裏會提供一點點報錯信息,請仔細檢查 上述兩個配置中,是否錯誤輸入了什麼東西,例如單詞拼寫錯誤,空格輸入成逗號,沒有輸入分號,網段輸入錯誤,等等。(本人在這裏,因爲拼寫錯誤,檢查了良久)

如果成功啓動 輸入netstat -aunp | grep dhcpd,應看到(單個或多個) dhcpd,如果失敗了,則沒有結果。或者是ps -ajx | grep dhcpd(至少會顯示 grep 這條,但這個顯然不是dhcpd的進程)。

可使用 ifconfig 隨時查看網卡狀態。

提醒,網關上記得加 iptables 的 NAT 規則。

內網 主機網絡配置

這些操作在 內網中Linux機器 PC1 上進行
需將 interface 文件中網卡 eth1 改成 DHCP 獲取。
vim /etc/network/interface

# eth1 採用 DHCP,等待分配 ip
auto eth1 
iface eth1 inet dhcp

# 本地迴環地址,默認這樣配置即可
auto lo
iface lo inet loopback

然後,/etc/init.d/networking restart重啓網絡,或者重啓電腦。
因爲 DHCP 服務器填有 網關地址,故這裏可以不用配置路由。

使用 ifconfig 查看是否分配到了ip地址。

如果是Windows系統,在“控制面板” -> “網絡和Internet” -> “網絡和共享中心” -> 左邊“更改適配器設置” -> 雙擊要配置的指定網卡->彈出的界面上,選擇“屬性” -> 在“此連接使用下列項目’中,找到並雙擊“Internet 協議版本4(TCP/IPv4)” -> 請選中 “自動獲得IP地址” -> 確定後關閉即可。

如果 ip 地址獲取失敗,建議重啓網卡或電腦試試。

關閉 DHCP服務器

如果不需要了DHCP服務器,除了卸載軟件,或者殺死相關進程,也可使用

systemctl disable isc-dhcp-server
systemctl stop isc-dhcp-server

停掉 DHCP 服務。這時候,使用systemctl status isc-dhcp-serverservice isc-dhcp-server status看到將顯示inactive(dead)(可能需要按Q鍵退出該模式回到終端)。這樣開機之後,也不會啓動該服務。

顯然,重新啓用該服務的命令如下,啓動後,一定要用service isc-dhcp-server status等命令查看是否啓動成功。

systemctl enable isc-dhcp-server
systemctl restart isc-dhcp-server # 或者 service isc-dhcp-server restart

3. 訪問 內網(可選)

在搭建好 內網 網關 之後,內網 中 主機,可以訪問外網中主機,例如 在 192.168.1.5 的主機上,可以 ping 通 192.16.10.71 的主機。但反過來ping並不行。

內網訪問外網原理簡述。
內網中主機 192.168.1.5 ,雖然可能不知道192.16.10.254的主機在哪裏,但根據路由表或默認網關,會自動發送給 內網的網關 192.168.1.2,這個網關 由於 同時連接了 內網(192.168.1.2)和外網(192.16.10.8),其根據自己的路由表或默認網關,就會發送到外網中相應的主機上,這個時候,因爲做了NAT設置,因而數據包的源地址192.168.1.5,被修改成192.16.10.8,等返回時,返回包的目的地址是192.16.10.8,然後網關再自動NAT,將目的地址改成192.168.1.5,然後 內網中主機就收到返回包,就表現爲ping通了。

而外網不能訪問內網,是因爲 外網 主機(比如 192.16.10.71)不知道 內網主機(192.168.1.5)在哪裏,然後它發給自己的默認網關,比如外網的路由器(192.16.10.254),但是這個路由器也不知道內網主機在哪裏,因此就沒辦法通信。

所以,想要從 外網的主機 訪問到 內網的主機,一個比較簡單的方法原理,就是指定 發往 192.168.1.5 的包,發給 那個同時連接了兩個網段的網關即可。
因爲,在需要訪問內網的那個外網主機(192.16.10.71)上或者是外網網段的路由器上,添加一條路由即可。例如:

route add -net 192.168.1.0/24 gw 192.16.10.8 # linux 下寫法
# route add 192.168.1.0/24 192.16.10.8 # windows 下寫法,需管理員權限運行 cmd

其指示,發往 192.168.1.0/24 的數據包,發給 192.16.10.8 處理。
注:因爲這個內網網段是ip協議裏的私有網段,如果是公有網段,那可能影響 主機上網。
另注:抓包發現這個數據包裏的ip地址並沒有被NAT,不太懂(例如,我在192.16.10.71的主機上,ping 192.168.1.5時,返回的數據包並沒有被 NAT)。
這樣,在 外網主機上,訪問 內網主機時,直接填寫內網主機的IP地址即可。
注:此方法,重啓後會失效。

也有其他方式的訪問內網實現,例如端口代理之類的。

4. 參考鏈接

ubuntu16.04配置網卡
Linux網絡的SNAT和DNAT
IPtables中SNAT、DNAT和MASQUERADE的含義
ubuntu16.04上安裝配置DHCP服務的詳細過程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章