利用 Ubuntu 24.04 构建一台路由器并实现 RFC 5128 特性的支持(一)

写在前面

  最近在折腾 OpenWrt 的时候,产生了一个想法,能不能用同是 LinuxUbuntu 来实现简单的路由功能,从而部分替代 OpenWrt。从某个地方得到了一台 1C1G(1 Core, 1GB RAM)8G 硬盘的 Ubuntu 24.04 超小内存服务器,只能安装 mini 版的 Ubuntu,不管,开始折腾。

网络拓补

  • WAN:通过静态 IPv4 接入某 ISPIPv4 公网)
  • WAN6:通过动态 IPv6 接入某 ISP
  • LAN:现在需要通过 NAT 实现 LAN 部分的网络接入。

一、 准备思路

1.1 环境搭建

  由于使用的 Ubuntu 是最小化安装版的,这个版本很简单,甚至连最简单的 net-tools 等工具都没有,所以得使其调试环境趋于完整一点。

1.2 软件选择

  要使得 LAN 之下的设备能够上网,需要在网关之上部署一个 NAT(Network Address Translation,网络地址转换),使得内网地址能和网关地址产生映射关系,能够通过网关地址进行访问等。这个时候,就要有一软件充当转换器的功能,把映射建立起来。在这个架构中,通常不使用专门的 NAT 软件,而是用 Linux 中的防火墙来行使这部分功能,顺带实现简单的内网防护。

1.2.1 NAT 的实现及优化

  NATRFC 5128 标准下分为九种:

📋 RFC 5128 定义的九种 NAT 行为标准

映射 × 过滤(RFC 4787/5128 术语)传统叫法(RFC 3489)说明
EIM + EIF (Endpoint-Independent Mapping + Endpoint-Independent Filtering)Full-cone NAT (全锥形)同一内端口对任意外部目的都复用同一外映射,且任何外部主机都可回打到该映射端口。(RFC Editor)
EIM + ADF (Endpoint-Independent Mapping + Address-Dependent Filtering)Restricted-cone NAT (受限锥形)复用同一外映射,但仅允许与之通信过的外部 IP 回打。(RFC Editor)
EIM + APDF (Endpoint-Independent Mapping + Address-and-Port-Dependent Filtering)Port-restricted-cone NAT (端口受限锥形)复用同一外映射,但仅允许与之通信过的外部 IP+端口 回打。(RFC Editor)
APM (Address-and-Port-Dependent Mapping) + ADFAPDFSymmetric NAT (对称型)外映射依目的 IP+端口而变(每个目的得到不同外端口);过滤通常更严格(ADF 或 APDF)。(RFC Editor)
ADM (Address-Dependent Mapping)(较少见)+ 任意过滤(旧术语无直接对照)RFC 3489 并未定义“只按目的 IP 变更映射”的锥形类别;在新术语下它属于 “Endpoint-Dependent Mapping” 的一种。(datatracker.ietf.org)

  在 Linux 系统中,常常使用 iptablesnftables 作为防火墙,它们都附带有 NAT 的功能。

1.2.1.1 在 iptables 中实现 Network Address Translation

  在 iptables 中,我们只需要对指定的网路区域做 IP 地址伪装(为此区域的出站流量开启网络地址和端口转换 IPv4NAT4NAPT4)),即可实现将内网地址转换为服务器出口地址,实现 NAT

  对 iptables 执行:

Bash

iptables -t nat -A POSTROUTING -o <WAN Zone> -j MASQUERADE

  即可。此时通过 MASQUERADE 方式实现的 NAT 类型为 Port Restrict-Cone NAT

  而在特殊版本的 iptables 中,执行:

Bash

iptables -t nat -A POSTROUTING -o <WAN Zone> -j FULLCONE

  此时实现的 NAT 类型为 Full-cone NAT

1.2.1.2 在 nftables 中实现 NAT

  什么是 nftables?

nftables is a subsystem of the Linux kernel providing filtering and classification of network packets/datagrams/frames. It has been available since Linux kernel 3.13 released on 19 January 2014.

nftables replaces the legacy iptables component of Netfilter. Among the advantages of nftables over iptables is less code duplication and easier extension to new protocols. Among the disadvantages of nftables is that DPI that was provided by “iptables string match” like SNI filtering is not supported.

  nftablesLinux 内核中的新一代包过滤/网络地址转换(NAT)框架(自内核 3.13 起),用来取代过去分散的 iptablesip6tablesarptablesebtables。在设计的时候,nft 就向着兼容 iptables 的方向设计,也可以用简单的方式将 iptables 规则转化。

  同时,nft 还实现了语法的统一:一套语法同时支持 IPv4/IPv6/以太桥接等(family inet ip 等)。

  基本概念:

  • table(表):按协议族分组的容器,例如 table inet filter
  • chain(链):挂在内核钩子(input / forward / output / prerouting / postrouting)上的规则序列。
  • rule(规则):匹配条件 + 动作(如 accept / drop / masquerade)。
  • set/map:可复用的地址/端口集合或键值映射。

1.2.1.3 MASQUERADE 与 FULLCONE 的区别

  在 Linux iptables / nftables 里,MASQUERADESNAT 的一种特殊写法,Masquerade 通过对 NAT 地址的改写达到通信的作用,此时建立的连接只针对访问的服务器和客户端,从而表现为 Port Restrict NATSymmetric NAT

  FULLCONE 则更加开放,在建立映射的同时等价于开放了通信端口,建立该端口到内网地址的转发,使得所有可访问的外部主机都可以通过这个端口连接到映射的内网主机。

1.2.2 自动端口映射的实现

  无论是 Fullcone 还是 Restrict,端口的开放都需要内网主机主动建立一次连接,若是要实现预先端口映射的话,除了手动 DNAT,可以选择通过 UPnP 来进行。

1.2.3 IPv6 SLAAC 中继(To-do)

1.3 某些踩坑


二、 折腾过程

2.1 软件编译

2.1.1 NFTables With Fullcone 的编译

  由于 Linux 软件源里面提供的 nftables 一般并没有带有 Fullcone NAT 功能,于是考虑选择移植使用 OpenWrt 版的 nftables 来进行。

  项目地址:https://github.com/fullcone-nat-nftables/

2.1.2 MiniUPnPd(To-do)

2.2 nftables 与 MiniUPnPd 的配置(To-do)

2.3 DHCP Server 的搭建


三、 调试优化

3.1 MiniUPnPd 的一点碎碎念

3.2 nftables 踩的一点坑

3.3 协调性的一些问题


后记

暫無評論

發怖評論 編輯評論


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇