如何从我的Linux桌面共享互联网给Windows?

我有一台连接到互联网的Linux(Ubuntu 12.04)个人电脑,使用Greenpacket WiMax USB调制解调器。我想通过局域网与另一台运行Windows 7 Home Premium的计算机共享互联网连接。这种情况是否可行?如何实现?反过来是否也可以(将互联网连接到Windows计算机并与Linux共享)?

成功了吗?还需要帮助吗? - Christian
谢谢。你真是太有帮助了。但很抱歉,我现在没时间去做这个。我会尽快留下评论的。 - muntasir2000
4个回答

你需要在Linux主机上设置NAT。当你搜索NAT和iptables时,网络上有很多教程,可能包括你使用的发行版。这里有一个适用于Debian的教程,也适用于其他发行版:http://debianclusters.org/index.php/NAT_with_IPTables。 以下是一些来自德国Ubuntu教程的内容:
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -o eth0 -s 192.168.0.0/16 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
把它们放在某个地方,在启动时执行(/etc/rc.local或者在每一行前面加上"up",然后将整个内容放入/etc/network/interfaces),并将eth0替换为连接到互联网的网络设备,将eth1替换为连接到您的局域网的设备。 如果您不想在Linux主机上设置bind,您可能还需要手动告诉Windows主机一些名称服务器(DNS)。我相信您的局域网中不需要或已经有一个DHCP服务器。

这个问题问的是,相反的情况可行吗(将互联网连接到Windows计算机并与Linux共享)?

以下是如何在Windows上共享互联网连接给Linux。

在Windows上:

  • 确保启用了互联网共享。

    • 进入控制面板,找到网络连接,右键单击互联网适配器并点击“属性”。
    • 点击“高级”。
    • 在那里点击单选按钮以启用互联网共享。
  • 在Windows 7上:

    • 进入控制面板 → “网络和共享中心”。 (您可能需要通过“网络和Internet”进入此页)
    • 点击“更改适配器设置”。
    • 右键单击网络适配器并点击“属性”。如果有要求,输入管理员密码。
    • 点击“共享”标签并启用共享。

在Linux上:

使用root权限(sudo或者su),

  1. 输入以下内容以设置默认网关:

    route add default gw x.x.x.x

    (注意:将 x.x.x.x 替换为 Windows 主机的本地 IP 地址。 您可以在 Windows 命令提示符中键入 ipconfig -all 来查找它。)

  2. 接下来,输入以下内容以设置 DNS:

    echo "nameserver y.y.y.y" > /etc/resolv.conf

    (注意:将 y.y.y.y 替换为 Windows 上的 DNS 服务器地址。 您可以在 Windows 命令提示符中键入 ipconfig -all 来查找它。)

在这种情况下,Windows已经连接到互联网。 完成所有设置后,您现在可以尝试从Linux使用互联网。 Linux和Windows主机应该能够同时使用互联网。

2-1: 他想做相反的事情(从 Linux 箱子分享互联网给 Windows 箱子)。 - Renan
2但他也对进行反向操作感兴趣。以下是我引用他的问题:是否可以实现反向操作(将互联网连接到Windows计算机并与Linux共享)? - rnlsgh
1如果你想从Linux共享互联网给Windows,我认为克里斯汀之前提供的答案基本上是正确的,只需要替换这部分内容:iptables -A FORWARD -o eth0 -s 192.168.0.0/16 -m conntrack --ctstate NEW -j ACCEPT 用这个来代替:iptables -A FORWARD -i eth1 -s 192.168.0.0/16 -m conntrack --ctstate NEW -j ACCEPT (注意:我只是更正了拼写错误:将“-o eth0”替换为“-i eth1”)。此外,在Windows侧,您还需要将网关设置为Linux的IP,并将DNS地址设置为ISP提供的DNS。 - rnlsgh
但如果它不起作用,可能是iptables规则上存在冲突。在这种情况下,在执行那4条命令之前,您可能需要通过输入以下命令来清除所有先前的iptables规则:(1) iptables -F (2) iptables -t nat -F (3) iptables -X (4) iptables -t nat -X - rnlsgh
1在执行完所有8条命令行之后,您需要输入"iptables-save"来保存设置。 - rnlsgh
有时这种方法不起作用。Windows 7主机的互联网正常。但是我已经改变了IP http://www.tomshardware.co.uk/faq/id-1925829/change-default-internet-connection-sharing-address-range.html。Linux可以ping通Windows,但无法ping通8.8.8.8。有什么想法吗? - themadmax

https://oracle-base.com/articles/linux/use-iptables-to-implement-packet-filtering-and-configure-nat上有一个简单的指南。但我发现,在Windows中,Linux PC使用的DNS地址也必须在Windows中提供。

我有一个连接到我的Linux PC的3G USB调制解调器,从那里我有两台Windows PC可以上网。这被称为(内核)数据包转发,当你最终理解它时,它非常简单和快速。

您需要通过在Linux上运行命令“ifconfig”(在终端中)和在Windows上运行命令“ipconfig”(在命令提示符中)来找出您的网络接口名称。在Linux上,接口名称位于最左侧,例如:enp2s0、enp3s0、enp0s18f2u6、lo。现在您可以设置数据包转发:

首先,您需要在Linux PC上启用数据包转发(请参考我从oracle-base.com链接的指南)。 接下来,您可以按照oracle-base.com指南中所述运行以下命令(但请稍等,继续阅读): sudo iptables -I FORWARD -i my_lan_interface -o my_modem_interface -j ACCEPT sudo iptables -I FORWARD -i my_modem_interface -o my_lan_interface -j ACCEPT sudo iptables -t nat -I POSTROUTING -o my_modem_interface -j MASQUERADE 但是,我在网上找到了一种更可靠的方法: sudo iptables -t nat -A POSTROUTING -o my_modem_interface -j MASQUERADE --random sudo iptables -A FORWARD -i my_lan_interface -o my_modem_interface -j ACCEPT sudo iptables -A FORWARD -i my_modem_interface -o my_lan_interface -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -j DROP 以下是刚才命令的解释("更可靠"示例),按照相同的顺序: 第一个命令:在my_modem_interface上启用伪装,以便对外传出数据包进行源地址重写。--random标志用于实现对称NAT。 现在我们将配置转发规则。默认情况下,iptables将无条件地转发所有流量。在这里,我们更喜欢限制来自互联网的入站流量,并允许所有传出流量: 第二个命令:允许来自my_lan_interface到my_modem_interface的流量。 第三个命令:允许返回的流量从my_modem_interface到my_lan_interface。 第四个命令:丢弃所有不应转发的其他流量。 当您重新启动Linux PC时,您将需要重新输入这些命令 - 我有一个在每次启动时运行它们的脚本。您可以使用适当的"service"调用使这些更改永久生效(再次参考上面给出的oracle-base.com指南),但我建议在每次启动时运行它们(在脚本中),因为您可能想要尝试和更改事物,并撤消保存的更改是另一个挑战。如果出现问题,或者您想要更改事物,或者您只是不想在当前会话(或根本)中使用此功能,则只需重新启动计算机,它们就会消失 - 但您必须自己禁用数据包转发(在重启之前在/etc/sysctl.conf中写入"net.ipv4.ip_forward = 0")以完全禁用此技术。 现在,您需要在Linux PC和其他计算机之间创建一个网络连接(以太网连接)。例如: A)在连接到互联网的Linux PC上(我使用Fedora),使用网络连接管理器创建一个以太网连接,选择适当的接口(网络卡名称,在我的情况下是enp3s0),将此Linux PC连接到我的LAN。确保选择正确的防火墙区域,否则您的LAN将无法获得互联网。因此,由于这是您的内部LAN接口,请将防火墙区域设置为"trusted",但是调制解调器连接接口应设置为"public"。接下来,在IPv4设置选项卡中,设置必须使用IPv4进行连接(可以忽略IPv6),并选择手动地址设置。现在添加地址192.168.2.100 - 这将是LAN上此Linux PC的地址。子网掩码将自动设置(255.255.255.0,因为这是一个"C类"(私有)地址)。应用您的设置并连接。 B)在第二台PC上(使用Linux或Windows,并通过以太网电缆连接到上述 简而言之: 我的调制解调器地址是192.168.1.100,DNS为192.168.1.1。 Linux PC在局域网上的地址是192.168.2.100,启用了iptables重定向流量的数据包转发,如上所述,防火墙区域设置为“可信任”。 Windows PC 1的地址是192.168.2.101,DNS设置为192.168.1.1,网络配置文件设置为公共。(默认网关设置为Linux PC:192.168.2.100)。 Windows PC 2的地址是192.168.2.102,DNS设置为192.168.1.1,网络配置文件设置为公共。(默认网关设置为Linux PC:192.168.2.100)。 (所有计算机通过简单的以太网交换机连接在一起,使用普通的以太网电缆(也称为“补丁电缆”或“补丁线缆”),不需要交叉线,因为“现代”网络卡会自动进行交叉连接,所以可以使用交叉线或非交叉线,甚至可以混合在一个连接中使用。) 这里还有一个指南:https://medium.com/@TarunChinmai/sharing-internet-connection-from-a-linux-machine-over-ethernet-a5cbbd775a4f,该指南使用了谷歌的DNS地址。你可以去看一下。

要将Linux电脑连接到Windows电脑(以获取互联网),您需要一个工作的局域网(以太网)连接 - 就像我在这里的第一篇帖子中所说的那样。因此,基本上,您需要自己分配静态私有IPv4地址,两台机器都需要。您可能还需要将连接设置为“私有”或“可信任”。一旦两台计算机连接好了,转到“网络和共享中心”->“更改适配器设置”,选择与您的互联网连接对应的网络接口。右键单击属性,查找与共享连接相关的选项卡。在那里,您应该能够选择要与其他计算机共享的局域网(以太网)连接。 您可能需要在“内部”局域网计算机上指定DNS,就像我在这个主题的第一篇帖子中所说的那样。因此,您需要在Windows的命令提示符中运行ipconfig来查找您正在使用的DNS,或者使用Google的DNS 8.8.8.8和/或8.8.4.4。