设置后网络共享的简单方法在 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
);如果一切顺利的话,你应该可以自由地与外界交谈。