我希望确切地了解必须采取哪些步骤手动在运行基于 Linux 的操作系统的工作站上配置共享互联网连接。
我知道,当使用任何配置为使用 systemd 作为安装了 NetworkManager 服务的 init 系统的 Linux 发行版时,人们能够以自动方式在两个接口之间配置共享互联网连接(使用系统的本机网络设置)或使用 nm-connection-editor 等实用程序)。按理说,如果人们能够在使用自动化方法配置共享互联网连接后观察到对系统所做的更改,那么人们就拥有手动重新创建它所需的知识。考虑到这一点,以下是我为此采取的步骤以及我的发现:
默认情况下,“接收”共享连接的接口被分配 IP 地址 10.42.0.1 和 /24 子网掩码
dnsmasq 提供 DHCP 和 DNS 服务,默认监听 10.42.0.1。
- DHCP 提供 10.42.0.2-10.42.0.254 范围内的 IP 地址,DNS 指向主机接口的主解析器
路由表被修改为包含“接收”共享连接的接口子网的路由。即10.42.0.0/24 dev enp1s0 原型内核范围链接 src 10.42.0.1
更改了一系列与 ipv4/ipv6 相关的 sysctl 内核参数。我在使用以下 bash 之前和之后转储了相关的 sysctl 参数:
mybox ~ # sysctl -a | egrep "ipv4|ipv6" > sysctl_before
[ENABLE SHARED CONNECTION]
mybox ~ # sysctl -a | egrep "ipv4|ipv6" > sysctl_after
然后我比较了这两个文件,得到以下结果:
6c6
< net.ipv4.conf.all.accept_redirects = 1
---
> net.ipv4.conf.all.accept_redirects = 0
20c20
< net.ipv4.conf.all.forwarding = 0
---
> net.ipv4.conf.all.forwarding = 1
52c52
< net.ipv4.conf.default.forwarding = 0
---
> net.ipv4.conf.default.forwarding = 1
84c84
< net.ipv4.conf.enp1s0.forwarding = 0
---
> net.ipv4.conf.enp1s0.forwarding = 1
116c116
< net.ipv4.conf.lo.forwarding = 0
---
> net.ipv4.conf.lo.forwarding = 1
148c148
< net.ipv4.conf.wlp2s0.forwarding = 0
---
> net.ipv4.conf.wlp2s0.forwarding = 1
185c185
< net.ipv4.ip_dynaddr = 0
---
> net.ipv4.ip_dynaddr = 1
187c187
< net.ipv4.ip_forward = 0
---
> net.ipv4.ip_forward = 1
381c381
< net.ipv6.conf.all.forwarding = 0
---
> net.ipv6.conf.all.forwarding = 1
431c431
< net.ipv6.conf.default.forwarding = 0
---
> net.ipv6.conf.default.forwarding = 1
481c481
< net.ipv6.conf.enp1s0.forwarding = 0
---
> net.ipv6.conf.enp1s0.forwarding = 1
531c531
< net.ipv6.conf.lo.forwarding = 0
---
> net.ipv6.conf.lo.forwarding = 1
581c581
< net.ipv6.conf.wlp2s0.forwarding = 0
---
> net.ipv6.conf.wlp2s0.forwarding = 1
我为筛选和纳特iptables 规则集产生以下内容:
筛选
3a4,12
> -A INPUT -i enp1s0 -p udp -m udp --dport 67 -j ACCEPT
> -A INPUT -i enp1s0 -p tcp -m tcp --dport 67 -j ACCEPT
> -A INPUT -i enp1s0 -p udp -m udp --dport 53 -j ACCEPT
> -A INPUT -i enp1s0 -p tcp -m tcp --dport 53 -j ACCEPT
> -A FORWARD -d 10.42.0.0/24 -o enp1s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
> -A FORWARD -s 10.42.0.0/24 -i enp1s0 -j ACCEPT
> -A FORWARD -i enp1s0 -o enp1s0 -j ACCEPT
> -A FORWARD -o enp1s0 -j REJECT --reject-with icmp-port-unreachable
> -A FORWARD -i enp1s0 -j REJECT --reject-with icmp-port-unreachable
网络地址转换
4a5
> -A POSTROUTING -s 10.42.0.0/24 ! -d 10.42.0.0/24 -j MASQUERADE
然而,单凭这些更改似乎不足以产生有效的共享互联网连接,因为手动复制它们并不能为我提供来自我迫切寻求的 8.8.8.8 的出色 ping 响应。
为了清楚起见,我还确保任何使用共享连接的客户端都有一个默认路由,将 10.42.0.1 指定为默认网关。
谁能帮助我理解我所缺少的是什么?
答案1
“共享互联网连接”并没有特别明确的定义。原则上,您只需启用路由(如果尚未启用)并手动在“共享电脑”和“其他电脑”上设置 LAN 连接即可“共享”您的“互联网连接”。你甚至不需要 NAT。
然后还有启动 WLAN 接入点等的变体。
也就是说,这是我在不含 systemd 和 Networkmanages 的 Devuan 系统上使用的脚本,用于对接口进行 NAT,这可能是也可能不是您所说的“共享互联网连接”的意思:
#!/bin/bash
# masquerade $1 (e.g. eth0, ppp0) as $2 (default wlan0)
INTIF="$1"
EXTIF=${2:-wlan0}
echo $INTIF $EXTIF
modprobe nf_conntrack
modprobe nf_conntrack_ipv4
modprobe nf_nat
modprobe iptable_nat
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
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
该脚本中的某些内容并不是绝对必要的,但我发现它们很方便。
如果我需要运行 DHCP 服务器,我会手动启动dhcpd
,并预先设置配置文件。