我面临的挑战如下。
我需要通过单个 Ubuntu 16.04 路由器授予多个 VLAN 互联网访问权。
VLAN 带有 8021q 标记,通过接口 ens1f1 到达路由器。VLAN 名为 vlan10、vlan20、vlan30 和 vlan40。互联网上行链路连接到 enp0s25。Enp0s25 具有由 ISP 分配的静态公共 IP 地址。连接到 Enp0s25 的上游设备不支持 VLAN。
我请求你们这些睿智而精明的工程师或数据包处理专家向我解释如何在这些 VLAN 和我们称之为互联网的庞大管道之间路由、桥接、NAT 或弹射数据包。与此同时,我将躲到我的橱柜里,喃喃自语错误 418(RFC 2324)。
问候,
凯文
答案1
这个答案假设你
iptables
在“路由器”上使用防火墙,而不是像下面这样更“简单”的东西ufw
,和那你已经正确设置了路由器处理给定接口上的 VLAN。
你要找的是“NAT”。许多路由器默认会执行此操作,但 Linux 系统默认不会执行此操作。
您还需要在系统中启用 IPv4 转发才能使其正常工作。将其添加到 的末尾/etc/sysctl.conf
:
net.ipv4.ip_forward = 1
您可以通过之后的操作来应用该功能sudo sysctl -p
。这将启用转发流量的功能。
由于您的默认 Internet 路由是通向公共 Internet,但您想要设置 NAT,以便其他 VLAN 机器可以通过您的系统访问 Internet,因此您需要进行如下设置iptables
:
iptables -t nat -A POSTROUTING -s ip.add.re.ss/24 ! -d ip.add.re.ss/24 -m comment --comment "Allow vlanXX to go to the Internet, masquerade as the public IP." -j MASQUERADE
这是 NAT 表中的一条规则,用于在流量到达系统后如何路由流量。您需要三条这样的规则,每个 VLAN 的每个子网各一条。请进行相应调整,ip.add.re.ss
以vlanXX
匹配您网络的具体信息。
您还需要在for表中制定一条ACCEPT
规则,通常通过接口来执行此操作,如下所示,将项目更新为 vlan 号码:filter
iptables
FORWARD
XX
iptables -t filter -A FORWARD -o ens1f1.XX -m comment --comment "NAT for vlanXX" -j ACCEPT
iptables -t filter -A FORWARD -i ens1f1.XX -m comment --comment "NAT for vlanXX" -j ACCEPT
完成此操作后,您需要确保保存规则iptables
。理想情况下,如果您没有先安装它,您应该这样做,并在它要求保存规则时回答“是”:
sudo apt-get install iptables-persistent
... 这样就可以在启动时正确设置iptables
规则并保存规则。如果您已经有了iptables-persistent
,那么您需要更新它加载的规则:
sudo su -c 'iptables-save > /etc/iptables/rules.v4'
...现在MASQUERADE
每次启动时 NAT 规则都会生效。