以下是我的记录
两台Ubuntu,名为AB
- A机有两张网卡,其中一个网卡可上网,另一个空着
- B机有一张网卡
现在AB直连,假设 eth0
是A连接到互联网的接口,而 eth1
是要连接到服务器B的接口。
将两台服务器通过网线直接连接起来以共享网络连接。
这个过程通常称为"桥接"网络连接。
为了让服务器B可以通过服务器A上网,需要在服务器A上设置网络共享。
以下是A机器的操作:
-
确定两个网络接口的名称。通常可以通过运行 ip addr 命令来找出。假设 eth0 是连接到互联网的接口,而 eth1 是要连接到服务器B的接口。
-
设置IP转发。编辑
/etc/sysctl.conf
文件,确保包含以下行没被注释:net.ipv4.ip_forward=1
然后执行
sudo sysctl -p
以应用这个更改 -
设置NAT(网络地址转换)规则以共享互联网连接。可以使用
iptables
设置NAT,务必注意更换网卡sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
-
配置服务器B,将服务器A设置为默认网关。还需要在服务器B上设置静态IP或者在服务器A上运行DHCP服务器来动态分配IP。
以下是B机器的操作:
B机设置为静态IP, 直接给 192.168.1.2
就行,掩码255.255.255.0
,网关 192.168.1.1
DNS服务器为 192.168.1.1
8.8.8.8
8.8.4.4
补一个A机器的操作,将A机与B机直连的那个口IP也搞为静态IP
直接给 192.168.1.1
就行,掩码255.255.255.0
,网关 192.168.1.1
此时可以尝试从A机ssh连接到B机,如果能通,或者端口拒绝,说明俩机的静态IP配置好了,如果这一步没OK,则从新搞IP,直到这一步OK,当然,直接ping,ping通也行
注意每一步似乎都要重新开关一下网络连接(我用的是图像化操作)
net.ipv4.ip_forward=1 有啥用
在 Linux 系统中,net.ipv4.ip_forward=1 设置是用来启用 IP 转发功能的。默认情况下,大多数 Linux 系统都是将这项功能关闭的,因为大多数系统被配置成单一的工作站,不需要转发和路由功能。
当设置 net.ipv4.ip_forward=1 时,告诉系统内核允许在网络接口之间转发数据包。这样,系统就可以充当路由器的角色,管理和转发进入的数据包到正确的目的地。
当前场景,服务器 A 有两个网络接口,其中一个连接到互联网,另一个将与服务器 B 直接相连。要使服务器 A 能够转发从服务器 B 来的数据包到互联网,以及反过来,需要在服务器 A 上启用 IP 转发功能。
要激活这个设置,需要编辑 /etc/sysctl.conf 文件并设置 net.ipv4.ip_forward 为 1。然后通过执行 sudo sysctl -p 命令(或者重启系统)来应用这个更改。
这是实现局域网内的设备(如服务器 B)通过另一台设备(服务器 A)连接到外部网络(如互联网)的关键步骤。
防火墙规则解释
shell
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
以上这些 iptables 命令配置了服务器 A 的防火墙规则,以便它可以转发来自服务器 B 的流量,并允许这些流量通过服务器 A 的互联网连接出去。下面是每条命令的解释:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE:
这条命令添加了一个 NAT (网络地址转换) 规则到 iptables 的 POSTROUTING 链。这个命令的作用是:
-
-t nat 指定了 nat 表,这是负责地址转换的 iptables 表。
-
-A POSTROUTING 指定了要将规则追加(Append)到 POSTROUTING 链。POSTROUTING 链用于处理即将离开主机的数据包。
-
-o eth0 指定了规则仅适用于从接口 eth0 离开的数据包,eth0 是连接到互联网的接口。
-
-j MASQUERADE 表明使用 MASQUERADE 动作。这个动作会隐藏服务器 B 的私有 IP 地址,将所有从服务器 B 发出的数据包的源 IP 地址变更为服务器 A 接口 eth0 的 IP 地址。这样,外部网络只看到来自服务器 A 的请求,而不是服务器 B。
sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT:
这条命令设置了转发规则,用来允许从互联网(通过 eth0)返回的与已经建立的连接相关的数据包或者已经建立的连接的数据包通过服务器 A 到达服务器 B。
-
-A FORWARD 将规则添加到 FORWARD 链,这个链用于处理经过主机但不是最终目标的数据包。
-
-i eth0 -o eth1 指定了规则匹配从 eth0 进入并且预计从 eth1 离开的数据包。
-
-m state 表示使用 state 匹配模块来检查数据包的连接状态。
-
--state RELATED,ESTABLISHED 表示只匹配那些处于已建立(ESTABLISHED)或者与已建立连接相关(RELATED)的数据包。
-
-j ACCEPT 表示允许这些数据包通过。
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT:
这条命令允许从服务器 B (eth1) 发出的所有流量通过服务器 A 到互联网 (eth0)。
- -A FORWARD 同样是将规则添加到 FORWARD 链。
- -i eth1 -o eth0 指定了规则匹配从 eth1 进入并且预计从 eth0 离开的数据包。
- -j ACCEPT 表明允许这些数据包通过。
这些规则配置了服务器 A 作为一个路由器,允许服务器 B 的出站和入站流量通过服务器 A 的互联网连接。