Ubuntu

Ubuntu ARP 回復配置

  • February 25, 2019

我想知道什麼/是否有任何配置可以啟用 arp 回复。

我有一台帶有兩個介面的 Ubuntu 機器——一個是連接到非公共 LAN 的乙太網,另一個是連接到公共網際網路的 Wifi。我暫時需要一台電腦在專用 LAN 上訪問 Internet,所以我設置了一個 SNAT,以便將專用 LAN 上的地址映射到 WiFi 網路 LAN。

編輯:我沒有提到我還設置了一個 DNAT 來翻譯地址。

發送 ping 出站到 8.8.8.8 命中,但返回時我的 WiFi 路由器不知道“誰擁有”這個 natted 地址 (192.168.7.33),所以它發送一個 arp 請求。

我跑了sudo arp -v -i wlp1s0 -s 192.168.7.33 84:7b:eb:35:a4:e0,其中硬體地址是與乙太網連結關聯的硬體地址(我還執行了相同的命令,後跟“pub”,但它仍然沒有發送)。它現在在我的 arp 表中……:

Address                  HWtype  HWaddress           Flags Mask        Iface
192.168.7.33             ether   84:7b:eb:35:a4:e0   CM                    wlp1s0

但是,Ubuntu 盒子仍然從不回复 arps -

  19:26:59.542278 IP 192.168.7.33 > google-public-dns-a.google.com: 19:27:51.477054 IP 192.168.7.33 > 8.8.8.8: ICMP echo request, id 3312, seq 2692, length 64
19:27:51.493773 ARP, Request who-has 192.168.7.33 tell 192.168.7.254, length 46

第一條消息是去 google 路上的 ping,第二條是尋找 192.168.7.33 的路由器。

參考這篇文章, 如果請求的 IP 地址與另一個(禁用)介面相關聯,Linux 不會回复 ARP 請求消息,我檢查了核心的 Ip 路由表:

sudo ip route show table local
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 192.168.3.0 dev enp0s31f6  proto kernel  scope link  src 192.168.3.12 
local 192.168.3.12 dev enp0s31f6  proto kernel  scope host  src 192.168.3.12 
broadcast 192.168.3.255 dev enp0s31f6  proto kernel  scope link  src 192.168.3.12 
broadcast 192.168.7.0 dev wlp1s0  proto kernel  scope link  src 192.168.7.117 
local 192.168.7.117 dev wlp1s0  proto kernel  scope host  src 192.168.7.117 
broadcast 192.168.7.255 dev wlp1s0  proto kernel  scope link  src 192.168.7.117 

在這個問題中,使用者設置了到達地址的路由(與我的 NAT 不同),所以我繼續添加路由,但它仍然沒有 ARP:

路線-n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.7.254   0.0.0.0         UG    600    0        0 wlp1s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 wlp1s0
192.168.3.0     0.0.0.0         255.255.255.0   U     0      0        0 enp0s31f6
192.168.7.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp1s0
192.168.7.33    192.168.3.10    255.255.255.255 UGH   0      0        0 enp0s31f6

我可以更改 Ubuntu 上的設置以便我的機器回复 ARP 請求嗎?如果沒有,那麼下一個可以查看我們為什麼沒有響應的地方在哪裡?

編輯 2:這是我設置 NAT 的方式:

sudo iptables -t nat -A POSTROUTING -s 192.168.3.10 -j SNAT --to-source 192.168.7.33
sudo iptables -t nat -A PREROUTING -d 192.168.7.33 -j DNAT --to-dest 192.168.3.10

編輯 3:從 DNAT/SNAT 更改為偽裝是有效的,並且更容易/更具可擴展性。

ARP 回復會自動啟用。/proc可能可以使用or中的一些條目來關閉它們/sys,但我必須搜尋它。

你所擁有的是一個非常標準的 NAT 情況。您還沒有提供最重要的資訊,即如何設置 NAT,但通常是這樣的:

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT 
iptables -P FORWARD DROP
iptables -F FORWARD 
iptables -t nat -F
iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

這將啟用轉發、清除iptables規則、設置預設策略、在FORWARD鏈中設置過濾以便接受從$INTIF$EXTIF的任何數據包,而對於相反方向,它們必須由連接跟踪器 ( nf_conntrack) 跟踪。最後,所有轉發的數據包都是MASQUERADED,這是SNAT介面上存在的地址,因此即使該地址發生變化,您也將始終使用正確的地址。不需要額外的路線。如果需要,您可以按源地址限制轉發。

$INTIF是內部介面(您的 LAN),$EXTIF是外部介面(您的 WLAN)。您可以使用 Ubuntu 使用的任何工具(systemd 等)使其持久化。

這是開箱即用的,不需要擺弄。連接跟踪器將 DNAT 將數據包返回到正確的地址,不需要額外的規則,將它們轉發回 LAN,並在 LAN 介面上發送 ARP,它應該從那裡發送出去。

我懷疑您的設置有些不同,這就是為什麼您最終會在錯誤的位置使用有趣的 ARP。

引用自:https://unix.stackexchange.com/questions/502433