Skip to content

使用 UFW 进行网络地址转换

网络地址转换 (NAT) 是一种允许多个设备共享单个公共 IP 地址的技术。 NAT 通常用于家庭和办公网络,允许专用网络上的设备通过单个公共 IP 地址访问互联网。

另一方面,顾名思义,伪装是将您的身份隐藏在面具或其他假定身份后面。就像这样,在计算机网络领域,一种类型的网络地址转换称为伪装,它通过将设备的 IP 地址替换为路由器或网关设备的 IP 地址来隐藏专用网络上设备的身份。

当专用网络上的设备想要与互联网上的设备通信时,它会向专用网络上的网关设备发送数据包,然后网关设备将数据包转发到互联网。但是,数据包的源 IP 地址是设备的私有 IP 地址,在互联网上无效。为了解决这个问题,网关设备将数据包的源IP地址替换为自己的公共IP地址,以便互联网上的设备将数据包视为来自网关设备,而不是来自私有设备。

要通过 ufw 配置 OpenVPN 客户端访问内网电脑,需确保 VPN 服务器能转发客户端流量到内网,并允许相关端口和转发规则。以下是详细步骤:

场景说明

假设环境:

  • OpenVPN 服务器(本机 172.16.0.10)有两块网卡:eth0(内网,网段 172.16.0.0/24)、eth1(公网)。

  • VPN 客户端连接后分配虚拟 IP(如 192.168.50.0/24)。

  • 目标:让 VPN 客户端访问内网 172.16.0.20(内网电脑)的服务(如 web 等)。

配置步骤

1. 开启内核 IP 转发(必做)

VPN 流量转发依赖内核转发功能:

# 临时开启(立即生效)
sysctl -w net.ipv4.ip_forward=1

# 永久开启(重启生效)
vi /etc/sysctl.conf
# 取消注释或添加:
net.ipv4.ip_forward=1

sysctl -p  # 生效配置

2. 配置 OpenVPN 服务器推送内网路由

确保 VPN 客户端知道内网网段,需在 OpenVPN 服务器配置文件(如 server.conf)中添加以下内容(推送内网路由给客户端):

# 推送内网网段到客户端(客户端访问 172.16.0.0/24 时走 VPN 隧道)
push "route 172.16.0.0 255.255.255.0"

重启 OpenVPN 服务:

systemctl restart openvpn-server@server

3. 配置 ufw 允许 OpenVPN 基础流量

# 允许 VPN 服务端口(默认 UDP 1194):
ufw allow 1194/udp

# 允许 VPN 隧道接口(tun0)的流量:
ufw allow in on tun0
ufw allow out on tun0

4. 配置 ufw 转发规则(VPN → 内网)

配置ufw内核转发功能:

vi /etc/ufw/sysctl.conf
# 取消注释或添加:
net/ipv4/ip_forward=1

需允许 VPN 客户端(192.168.50.0/24)的流量转发到内网(172.16.0.0/24),并配置 NAT 回程规则。 编辑 ufw 前置规则文件:

vi /etc/ufw/before.rules

(1)添加 NAT 回程规则(确保内网响应能返回给 VPN 客户端)

在文件开头的 *filter 段之前添加:

*nat
:POSTROUTING ACCEPT [0:0]
# 允许 VPN 客户端(192.168.50.0/24)访问内网(172.16.0.0/24)时,回程流量通过内网网卡(eth0)伪装
-A POSTROUTING -s 192.168.50.0/24 -d 172.16.0.0/24 -o eth0 -j MASQUERADE
COMMIT

此命令向 NAT 表的 POSTROUTING 链添加一条规则,该规则匹配所有通过 eth0 接口的传出数据包,并将其源 IP 地址替换为 eth0 接口的 IP 地址。

  • -A 选项用于向链添加新规则。

  • -s 后跟接口的 IP 地址来匹配源地址。

  • -d 后跟接口的 IP 地址来匹配目标地址。

  • -o 选项用于指定数据包所经过的出接口。

  • -j 选项用于指定规则的目标,在本例中为 MASQUERADE,这意味着数据包的源 IP 地址应该被伪装。

添加此规则后,任何通过 eth0 接口的传出数据包的源 IP 地址都会伪装成 eth0 接口的 IP 地址。

(2)允许 VPN 到内网的转发流量

在 *filter 段中添加(确保在 :ufw-before-forward - [0:0] 之后):

# 允许 VPN 客户端(tun0)访问内网(eth0)
-A ufw-before-forward -i tun0 -o eth0 -s 192.168.50.0/24 -d 172.16.0.0/24 -j ACCEPT
# 允许内网(eth0)响应 VPN 客户端(tun0)的回程流量
-A ufw-before-forward -i eth0 -o tun0 -s 172.16.0.0/24 -d 192.168.50.0/24 -j ACCEPT

5. 允许内网电脑的服务端口(可选)

若内网电脑(如 172.16.0.20)有特定服务(如 WEB 80端口),需允许 VPN 客户端访问:

# 允许 VPN 客户端访问内网 172.16.0.20 的 80端口(HTTP)
ufw allow in on eth0 from 192.168.50.0/24 to 172.16.0.20 port 80/tcp

6. ufw 重新加载配置文件

ufw reload