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/conf
或ifconfig
查看網卡名稱)
欲把該網關的 網卡 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-server
或service 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服務的詳細過程