【openwrt-21.02】Openwrt NAT配置举例
Openwrt NAT配置举例
DNAT
Port forwarding for IPv4 (DNAT)
此规则的目标是将端口 2222 上的所有 WAN 端 SSH 访问重定向到 单个 LAN 端工作站的 SSH (22) 端口。
config redirect
option target DNAT
option src wan
option dest lan
option proto tcp
option src_dport 2222
option dest_ip 192.168.10.20
option dest_port 22
option enabled 1
规则测试
要从 WAN 端工作站 (STA1) 进行测试,请在端口 2222 上通过 SSH 连接到 LAN 端网络上不存在的 IPv4 地址:
ssh -p 2222 192.168.10.13 hostname; cat /proc/version
启用该规则后,STA2 将回复其主机名和内核版本。 禁用规则后,连接将被拒绝。
添加规则如下
iptables -t nat -A zone_wan_prerouting -p tcp -m tcp --dport 2222 -m comment --comment "!fw3: @redirect[0]" -j DNAT --to-destination 192.168.10.20:22
...
iptables -t nat -A zone_lan_prerouting -p tcp -s 192.168.10.0/255.255.255.0 -d 192.168.3.185/255.255.255.255 -m tcp --dport 2222 -m comment --comment "!fw3: @redirect[0] (reflection)" -j DNAT --to-destination 192.168.10.20:22
第一条规则匹配在 TCP 端口 2222 上进入 WAN 端的数据包,并跳转到过滤器以将目标转换为 . 第二条规则匹配从 LAN 端传入 WAN 端的数据包(如果在 TCP 端口 2222 上)。 DNAT 目标使用与第一条规则相同的参数在 conntrack 表中查找“反射”。DNAT
192.168.10.20:22
--to-destination
连接跟踪表记录
ipv4 2 tcp 6 117 TIME_WAIT src=192.168.3.171 dst=192.168.10.13 sport=51390 dport=2222 packets=21 bytes=4837 src=192.168.10.20 dst=192.168.3.171 sport=22 dport=51390 packets=23 bytes=4063 [ASSURED] mark=0 use=2
此记录显示 WAN 端 src=STA1 和 dst=192.168.10.13:2222 以及反向 LAN 端 src=STA2:22 src=STA1。
DNAT to translate a LAN-side address on the WAN-side
此重定向规则将导致路由器将 WAN 端源 1.2.3.4 转换为 LAN 端 STA2,并将 ICMP 回显路由到该 STA2。 该规则是自反的,因为 STA2 将在 WAN 端转换为 1.2.3.4。
config redirect
option src wan
option src_dip 1.2.3.4
option proto icmp
option dest lan
option dest_ip 192.168.10.20
option target DNAT
option name DNAT-ICMP-WAN-LAN
option enabled 1
LAN-side public server
所有重定向都需要某种形式的 NAT 和连接跟踪。为 防火墙后面的公共服务器,则 DNAT 目标用于转换 WAN 端的公网 IP 地址到 LAN 端服务器的私有地址。
config redirect
option target DNAT
option src wan
option src_dport 25
option proto tcp
option family ipv4
option dest lan
option dest_ip 192.168.10.20
option dest_port 2525
option name DNAT-MAIL-SERVER
option enabled 1
在此示例中,STA2 正在运行一个电子邮件服务器(例如 postfix),该服务器在端口 2525 上侦听传入电子邮件。
此重定向规则规定:来自端口 25 上的 WAN 的任何传入流量,重定向到 STA1 端口 2525。要验证 dump 上的内容,请观察传入流量的动态连接。 其中可能有相当多的 conntrack 记录,因此我们只搜索使用端口 2525 的记录:
...
ipv4 2 tcp 6 7436 ESTABLISHED src=192.168.3.171 dst=192.168.3.11 sport=41370 dport=25 packets=4 bytes=229 src=192.168.10.20 dst=192.168.3.171 sport=2525 dport=41370 packets=3 bytes=164 [ASSURED] mark=0 use=2
...
连接从 STA1 端口 25 到 DUT,并转换为 STA2 在端口 2525 上,响应目标为 STA1。相关流量与 OpenWrt 防火墙允许遍历区域的 DNAT conntrack 状态匹配,因此不需要额外的宽松规则。
Source NAT (SNAT)
此规则的目标是将源 IP 地址从真实 station 转换为 端口 8080 上的虚构版本。
config redirect
option target SNAT
option src lan
option dest wan
option proto tcp
option src_ip 192.168.10.20
option src_dip 192.168.10.13
option dest_port 8080
option enabled 1
要测试:
-
使用 netcat 侦听 STA1,即 WAN 端站:
nc -l 8080
-
使用 Netcat 在 STA2 上进行连接,即 LAN 端工作站:
nc -v 192.168.3.171 8080
在 LAN 端工作站上键入内容,并在 WAN 端工作站上看到它的回声。 使用 WAN 侧工作站检查连接并查看线路:netstat -ntap
tcp 0 0 192.168.3.171:8080 192.168.10.13:47970 ESTABLISHED 16746/nc
WAN 端工作站在端口 8080 上显示连接到它的 SNAT 地址!
单独使用时,源 NAT 用于限制计算机对 Internet 的访问,同时允许它通过转发看似 一些本地服务,例如 NTP,连接到 Internet。 DNAT 对 Internet 隐藏本地网络,而 SNAT 对本地网络隐藏 Internet。
MASQUERADE
这是最常用和最有用的 NAT 函数。 它将 LAN 端的本地专用网络转换为 WAN 端的单个公共地址/端口数,然后反之。 它是每个 IPv4 路由器的默认防火墙配置。 因此,这是一个非常简单的 fw4 配置。LAN 端使用专用网络。 路由器将私有地址转换为路由器 address:port,netfilter conntrack 模块管理连接。伪装会设置在 WAN 端
config zone
option name 'wan'
list network 'wan'
....
option masq '1'
路由器通常会从上游 DHCP 服务器获取其 WAN IP 地址,并成为 LAN 站的 DHCP 服务器(通常是 DNS 服务器)。网络配置文件定义私有网络,dhcp 配置文件定义 OpenWrt 路由器如何分配 LAN 端 IPv4 地址。
启用 MASQUERADE 后,WAN 和 LAN 之间的所有转发流量都会被转换。从本质上讲,MASQUERADE 防火墙规则几乎不会出错。
cat /proc/net/nf_conntrack 检查当前的 MASQUERADE 连接。以下连接跟踪从 STA1 到 STA2 的 SSH (22) 访问。
ipv4 2 tcp 6 4615 ESTABLISHED src=192.168.3.171 dst=192.168.10.20 sport=60446 dport=22 packets=27 bytes=1812 src=192.168.10.20 dst=192.168.3.171 sport=22 dport=60446 packets=21 bytes=2544 [ASSURED] mark=0 use=2
Transparent proxy rule (external)
以下规则通过侦听端口 3128 的 192.168.1.100 上的外部代理重定向所有 LAN 端 HTTP 流量。 它假定 lan 地址为 192.168.1.1 - 这是伪装向代理的重定向流量所必需的。
config redirect
option src lan
option proto tcp
option src_ip !192.168.1.100
option src_dport 80
option dest_ip 192.168.1.100
option dest_port 3128
option target DNAT
config redirect
option dest lan
option proto tcp
option src_dip 192.168.1.1
option dest_ip 192.168.1.100
option dest_port 3128
option target SNAT
NAT
在 WAN 区域上启用伪装又名 NAT。
uci set firewall.@zone[1].masq="1"
uci commit firewall
service firewall restart
IPv6 NAT
在 WAN 区域启用 IPv6 伪装,又名 NAT66
uci set firewall.@zone[1].masq6="1"
uci commit firewall
service firewall restart
通告ULA 前缀的 IPv6 默认路由。
uci set dhcp.lan.ra_default="1"
uci commit dhcp
service odhcpd restart
在上游接口上禁用 IPv6 源过滤器。
uci set network.wan6.sourcefilter="0"
uci commit network
service network restart
Selective NAT
为特定源子网有选择地启用伪装。
uci -q delete firewall.nat
uci set firewall.nat="nat"
uci set firewall.nat.family="ipv4"
uci set firewall.nat.proto="all"
uci set firewall.nat.src="wan"
uci set firewall.nat.src_ip="192.168.2.0/24"
uci set firewall.nat.target="MASQUERADE"
uci commit firewall
service firewall restart
IPv6 selective NAT
有选择地为特定源子网启用 IPv6 伪装。
uci -q delete firewall.nat6
uci set firewall.nat6="nat"
uci set firewall.nat6.family="ipv6"
uci set firewall.nat6.proto="all"
uci set firewall.nat6.src="wan"
uci set firewall.nat6.src_ip="fd00:2::/64"
uci set firewall.nat6.target="MASQUERADE"
uci commit firewall
service firewall restart
IPv6 to IPv4 NAT with Jool
使用 Jool 为仅 IPv6 网络启用 IPv6 到 IPv4 NAT,又名 NAT64。 使用 DNS64 解析域名。
opkg update
opkg install jool-tools-netfilter
. /usr/share/libubox/jshn.sh
json_init
json_add_string "instance" "default"
json_add_string "framework" "netfilter"
json_add_object "global"
json_add_string "pool6" "64:ff9b::/96"
json_close_object
json_dump > /etc/jool/jool-nat64.conf.json
uci set jool.general.enabled="1"
uci set jool.nat64.enabled="1"
uci commit jool
service jool restart
IPv6 to IPv4 NAT with Tayga
使用 Tayga 为仅 IPv6 网络启用 IPv6 到 IPv4 NAT,又名 NAT64。 使用 DNS64 解析域名。
opkg update
opkg install tayga
uci del_list firewall.lan.network="nat64"
uci add_list firewall.lan.network="nat64"
uci commit firewall
service firewall restart
uci -q delete network.nat64
uci set network.nat64="interface"
uci set network.nat64.proto="tayga"
uci set network.nat64.prefix="64:ff9b::/96"
uci set network.nat64.ipv6_addr="fd00:ffff::1"
uci set network.nat64.dynamic_pool="192.168.255.0/24"
uci set network.nat64.ipv4_addr="192.168.255.1"
uci commit network
service network restart
TTL
修改出口流量的 TTL。
cat << "EOF" > /etc/nftables.d/ttl.sh
WAN_TTL="65"
. /lib/functions/network.sh
network_flush_cache
network_find_wan WAN_IF
network_get_device WAN_DEV "${WAN_IF}"
nft add rule inet fw4 mangle_postrouting \
oifname "${WAN_DEV}" ip ttl set "${WAN_TTL}"
EOF
uci -q delete firewall.ttl
uci set firewall.ttl="include"
uci set firewall.ttl.path="/etc/nftables.d/ttl.sh"
uci commit firewall
service firewall restart
IPv6 hop limit
修改出口流量的 IPv6 跃点限制。
cat << "EOF" > /etc/nftables.d/hlim.sh
WAN_HLIM="65"
. /lib/functions/network.sh
network_flush_cache
network_find_wan6 WAN_IF
network_get_device WAN_DEV "${WAN_IF}"
nft add rule inet fw4 mangle_postrouting \
oifname "${WAN_DEV}" ip6 hoplimit set "${WAN_HLIM}"
EOF
uci -q delete firewall.hlim
uci set firewall.hlim="include"
uci set firewall.hlim.path="/etc/nftables.d/hlim.sh"
uci commit firewall
service firewall restart
参考链接
[OpenWrt Wiki] NAT exampleshttps://openwrt.org/docs/guide-user/firewall/fw3_configurations/fw3_nat#npt