我想知道什么/是否有任何配置可以启用 arp 回复。
我有一台带有两个接口的 Ubuntu 机器 - 一个是连接到非公共 LAN 的以太网,另一个是连接到公共互联网的 Wifi。我暂时需要一台计算机在专用 LAN 上访问互联网,因此我设置了 SNAT,以便将专用 LAN 上的地址映射到 WiFi 网络 LAN。
编辑:我没有提到我还设置了 DNAT 来将地址翻译回来。
向 8.8.8.8 发送 ping 出站命中,但返回时我的 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 更改为伪装是有效的,并且更容易/更具可扩展性。
答案1
ARP 回复会自动启用。也许可以使用/proc
或中的一些条目来关闭它们/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。