Linux

如何在具有 4 個介面的機器上正確設置路由,以使三個介面位於同一子網中?

  • December 28, 2016

所以我有一台有 4 個介面的 linux 機器:

  1. enp1s0
  2. enp2s0
  3. enp3s0
  4. enp4s0

我要做的是讓 enp1s0 成為 WAN 介面,並通過 DHCP 獲取它的 IP 地址、dns 和網關。

對於其他三個介面,我希望它們具有:

  • 同一子網上的 IP 地址
  • 讓一個 LAN 介面上的所有主機能夠看到另一個 LAN 介面上的所有其他主機
  • 將shorewall作為防火牆執行
  • 使用 DNS 遮罩

這是我到目前為止所得到的:

貓 /etc/網路/介面
# 此文件描述系統上可用的網路介面
# 以及如何啟動它們。有關詳細資訊,請參閱介面 (5)。

源 /etc/network/interfaces.d/*

# 環回網路介面
自動lo
iface lo inet 環回

# 主網路介面
#列為#1
# 這是wan介面
自動 enp1s0
iface enp1s0 inet dhcp

#列為#2
# 這個路由到樓上
自動 enp3s0
iface enp3s0 inet 靜態
地址 192.168.47.254
網路遮罩 255.255.255.0
網路 192.168.47.0 
廣播 192.168.47.255 

#列為#4
自動 enp2s0
iface enp2s0 inet 靜態
地址 192.168.47.253
網路遮罩 255.255.255.0
網路 192.168.47.0 
廣播 192.168.47.255 

#列為#3
自動 enp4s0
iface enp4s0 inet 靜態
地址 192.168.47.252
網路遮罩 255.255.255.0
網路 192.168.47.0 
廣播 192.168.47.255 
貓 /etc/dnsmasq.conf
介面=enp2s0
介面=enp3s0
介面=enp4s0
listen-address=192.168.47.254 # 明確指定要監聽的地址 
bind-interfaces # 綁定到介面以確保我們不會將東西發送到其他地方 
server=8.8.8.8 # 將 DNS 請求轉發到 Google DNS 
domain-needed # 不要轉發短名稱 
bogus-priv # 從不轉發非路由地址空間中的地址。 
dhcp-range=192.168.47.100,192.168.47.250,12h # 分配 192.168.46.100-250 之間的 IP 地址,租用時間為 12 小時

日誌-dhcp
日誌查詢
interface=enp2s0 # 使用介面 wlan0 
interface=enp3s0 # 使用介面 wlan0 
interface=enp4s0 # 使用介面 wlan0 
listen-address=192.168.47.254 # 明確指定要監聽的地址 
bind-interfaces # 綁定到介面以確保我們不會將東西發送到其他地方 
server=8.8.8.8 # 將 DNS 請求轉發到 Google DNS 
domain-needed # 不要轉發短名稱 
bogus-priv # 從不轉發非路由地址空間中的地址。 
dhcp-range=192.168.47.100,192.168.47.250,12h # 分配 192.168.46.100-250 之間的 IP 地址,租用時間為 12 小時

日誌-dhcp
日誌查詢

這是來自其中一台客戶端機器的範例 ip 路由表:

ip -one 地址
1: lo inet 127.0.0.1/8 範圍主機 lo\ valid_lft forever preferred_lft forever
1: lo inet6 ::1/128 範圍主機\valid_lft 永遠首選_lft
2:eth0 inet 192.168.46.5/24 brd 192.168.46.255 範圍全域 eth0\valid_lft 永遠 Preferred_lft
2: eth0 inet6 fe80::82ee:73ff:fe5d:89d1/64 範圍連結\valid_lft forever preferred_lft forever
3: eth1 inet 192.168.47.244/24 brd 192.168.47.255 範圍全域 eth1\ valid_lft 永遠首選_lft 永遠
3: eth1 inet6 fe80::82ee:73ff:fe5d:89d0/64 範圍連結\valid_lft 永遠首選_lft 永遠
路線-n
核心IP路由表
目標網關 Genmask 標誌 Metric Ref Use Iface
0.0.0.0 192.168.46.1 0.0.0.0 UG 0 0 0 eth0
192.168.46.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
192.168.47.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1

到目前為止有效的方法:

  • 不同介面上的機器獲得正確的 IP 地址
  • 機器可以ping通路由器上的所有介面,也可以不通。我認為這可能取決於最近使用 DHCP 的哪台機器
  • 如果我可以從客戶端機器 ping 通,其他的東西也可以工作,例如 ssh
  • 我從來沒有讓兩台客戶端機器互相ping通

經過大量閱讀,我確定我需要靜態路由、每個 LAN 介面的不同子網或橋接。

理想情況下,我想根據介面在shorewall中設置權限,並且仍然為所有LAN介面使用一個子網。

您完全走錯了路,它與 Shorewall(或實際上任何其他防火牆包)沒有任何關係,而是與一般的 IP 網路有關。

如果您想像一個給定的 IP 主機在同一子網中有三個介面,並且從第四個子網到達該子網的數據包,那麼該主機如何知道三個介面中的哪個介面應該接收數據包?它在所有三個中都 ARP 嗎?它是否只是將所有流量發送到出現的第一個流量,從而阻止流量流向其他兩個流量?這就是為什麼如果您嘗試從 shell 配置它,您會收到有關重疊子網的錯誤消息。

所以 - 你有三個合理的選擇,還有幾個子選項。

  1. 轉儲其他兩個介面,只需將單個埠連接到交換機,然後將主機(可能還有同一子網中的 wifi)掛在該交換機上。可以將所有三個內部介面加入到單個綁定或團隊中*,但這基本上需要所有三個物理介面並將它們變成單個邏輯*介面。
  2. 創建 Linux 橋接介面。將 IP、DHCP 和其他配置元素提供給網橋,然後將三個物理介面綁定為網橋的成員。您的防火牆將單個網橋介面視為內部(……即使它連接到三個網段)。再一次 - 從 IP 的角度來看,您在內部子網中 有一個介面,而不是三個。
  3. 將三個介面放在三個不重疊的 IP 子網中並進行相應配置。

引用自:https://serverfault.com/questions/822900