NetworkManager连接共享似乎不支持NAT数据包

NetworkManager连接共享似乎不支持NAT数据包

设置后网络共享的简单方法在 Ubuntu 机器上,并通过下游 Arch Linux 机器上的 DHCP 获取 IP 地址,Arch 机器能够ssh连接到 Ubuntu 机器并解析 DNS,但无法与 Internet 通信(ping超时pacman)。从 Arch Linux 机器:

$ ip route show dev net0
default via 10.42.0.1 metric 202
10.42.0.0/24 proto kernel scope link src 10.42.0.15 metric 202
$ ip addr show dev net0
...
inet 10.42.0.15/24 brd 10.42.0.255 scope global net0
...

在 Ubuntu 机器上:

$ ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether e8:11:32:66:e3:4d brd ff:ff:ff:ff:ff:ff
    inet 10.42.0.1/24 brd 10.42.0.255 scope global eth0
    inet6 fe80::ea11:32ff:fe66:e34d/64 scope link 
       valid_lft forever preferred_lft forever
$ ip addr show dev wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 88:53:2e:1b:4b:1c brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.64/24 brd 192.168.1.255 scope global wlan0
    inet6 fe80::8a53:2eff:fe1b:4b1c/64 scope link 
       valid_lft forever preferred_lft forever

难道是Ubuntu上的自动NAT设置失败了?我不确定它是如何工作的,那么我该如何检测呢?

答案1

只有一件事让我困惑:你说 Arch 机器的 DNS 正在工作。如果您的 DNS 服务器是您的 Ubuntu 机器,那就太好了。如果你的 DNS 服务器是外部的,那么我很困惑。我对 Arch 不太熟悉——只安装过一次——但你通常可以检查/etc/resolv.conf一下你的 DNS 服务器是谁。如果它们是内部的,则很可能您的 NAT 或 Ubuntu 机器上的转发无法正常工作。如果它们是外部的——这意味着您成功解析了针对外部主机的 DNS 查询——您的问题可能是 iptables 问题。

从“可能出错的地方”的角度来看,更有可能是转发/NAT。因此:验证 Ubuntu 机器上确实启用了转发:

fireapple# cat /proc/sys/net/ipv4/conf/all/forwarding 
1

如果返回“0”,则可能您的转发未启用。要暂时修复它,只需

fireapple# echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

要使其在重新启动后持续有效,请编辑 /etc/sysctl.conf 并添加(或修改为类似)以下行:

net.ipv4.ip_forward = 1

接下来是一个快速设置 NAT 的脚本。将以下内容插入,例如NAT.sh,确保已完成chmod +x,然后将其放入/usr/local/bin/。请注意,我根据两个主机都有 10.42.0.0/24 地址这一事实,对哪个接口正在执行什么操作进行了假设:

#!/bin/sh
export INTERNET=wlan0  # Assuming eth0 is your Internet-facing address
export INTERNAL=eth0 # Likewise, assuming your WiFi is internal
iptables --flush      # Clean slate
iptables -t nat -A POSTROUTING -o $INTERNAL -j MASQUERADE
iptables -A FORWARD -i $INTERNAL -o $INTERNET -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $INTERNET -o $INTERNAL -j ACCEPT

一旦就位,执行它(例如,sudo /usr/local/bin/NAT.sh);如果一切顺利的话,你应该可以自由地与外界交谈。

相关内容