![如何在 QNAP NAS 中将 LAN IP/端口 NAT 到另一个 LAN IP/端口](https://linux22.com/image/764779/%E5%A6%82%E4%BD%95%E5%9C%A8%20QNAP%20NAS%20%E4%B8%AD%E5%B0%86%20LAN%20IP%2F%E7%AB%AF%E5%8F%A3%20NAT%20%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%20LAN%20IP%2F%E7%AB%AF%E5%8F%A3.png)
首先,我解释一下为什么我需要 NAT 来进行同一 LAN 段内的 IP/端口重定向。好吧,智能手机、平板电脑和笔记本电脑都有使用家庭 NAS 资源的应用程序。其中一些资源安装在同一 NAS 上的容器中,并且与 NAS 的主地址位于同一 LAN 中(桥接模式)。我在另一台计算机(Raspberry Pi)上安装了一个应用程序。只有 NAS 的主地址通过 FQDN 在 Internet 上标识。当然,在路由器上,定义了从 Internet 到 NAS 主地址的流量重定向。但是,如果平板电脑在 LAN 中,内部 DNS(用于 LAN 和 WAN)将返回包含 FQDN 而不是公共地址而是 LAN 地址的请求。在平板电脑上的应用程序中,当我在 LAN 网络中时,我无法设置不同的服务器名称,而当我通过 Internet 连接时,我无法设置另一个名称。因此需要在 LAN 内使用 NAT
IP地址的含义:
192.168.0.7 - main address of NAS
192.168.0.203 - first container in NAS
192.168.0.204 - second container in NAS
192.168.0.25 - address of Raspberry Pi
为了执行适当的 NAT 转换,使用了以下 iptables 条目
-A PREROUTING -d 192.168.0.7/32 -p tcp -m tcp --dport 45083 -j DNAT --to-destination 192.168.0.204:443
-A PREROUTING -d 192.168.0.7/32 -p tcp -m tcp --dport 8083 -j DNAT --to-destination 192.168.0.203:8081
-A PREROUTING -d 192.168.0.7/32 -p tcp -m tcp --dport 8082 -j DNAT --to-destination 192.168.0.25:8082
前两行(关于我们自己在 NAS 内路由)工作正常。第三行执行流量重定向到外部设备,但未执行此操作。我尝试添加各种 FORWARD 和 POSTROUTING 条目,但仍然不起作用。我需要将端口 8082 上地址 192.168.0.7 的所有传入流量重定向到端口 8082 上的地址 192.168.0.25。不幸的是,我无法获得它,“nmap”始终显示端口已“过滤”。有人能帮我解决这个问题吗?以下是 iptables 规则的完整列表。(来自“iptables-save”的输出)
# Generated by iptables-save v1.4.21 on Tue Mar 16 18:53:48 2021
*nat
:PREROUTING ACCEPT [5052:385310]
:INPUT ACCEPT [1601:157443]
:OUTPUT ACCEPT [3890:293400]
:POSTROUTING ACCEPT [7084:494945]
:DOCKER - [0:0]
:SYSDOCKER - [0:0]
:SYSNAT - [0:0]
:VPNNAT - [0:0]
-A PREROUTING -d 192.168.0.7/32 -p tcp -m tcp --dport 45083 -j DNAT --to-destination 192.168.0.204:443
-A PREROUTING -d 192.168.0.7/32 -p tcp -m tcp --dport 8082 -j DNAT --to-destination 192.168.0.25:8082
-A PREROUTING -d 192.168.0.7/32 -p tcp -m tcp --dport 8083 -j DNAT --to-destination 192.168.0.203:8081
-A PREROUTING -m addrtype --dst-type LOCAL -j SYSDOCKER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -m addrtype --dst-type LOCAL -j SYSDOCKER
-A OUTPUT -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -o lxcbr0 -m addrtype --src-type LOCAL -j MASQUERADE
-A POSTROUTING -o docker0 -m addrtype --src-type LOCAL -j MASQUERADE
-A POSTROUTING -m mark ! --mark 0x0/0xffff -j MASQUERADE
-A POSTROUTING -j VPNNAT
-A POSTROUTING -j SYSNAT
-A SYSNAT -s 10.0.5.0/24 ! -o docker0 -j MASQUERADE
-A SYSNAT -s 10.0.3.0/24 ! -o lxcbr0 -j MASQUERADE
COMMIT
# Completed on Tue Mar 16 18:53:48 2021
# Generated by iptables-save v1.4.21 on Tue Mar 16 18:53:48 2021
*mangle
:PREROUTING ACCEPT [115997:59201835]
:INPUT ACCEPT [75522:37213911]
:FORWARD ACCEPT [50460:25389774]
:OUTPUT ACCEPT [66153:9393450]
:POSTROUTING ACCEPT [116882:34812088]
:CHECKHOST - [0:0]
:VPNCHECKHOST - [0:0]
:VPNCUSSETMARK - [0:0]
:VPNDEFSETMARK - [0:0]
:VPNSETMARKENTRANCE - [0:0]
:VPNTCPMSS - [0:0]
-A PREROUTING -m set --match-set VPNSET src -m set ! --match-set HOSTSET dst -j VPNSETMARKENTRANCE
-A INPUT ! -d 169.254.0.0/16 -j CHECKHOST
-A INPUT -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -m set --match-set HOSTSET dst -j MARK --set-xmark 0x10000/0xf0000
-A POSTROUTING -p tcp -m mark ! --mark 0x0/0xffff -m tcp --tcp-flags SYN,RST SYN -j VPNTCPMSS
-A CHECKHOST -m set --match-set NATSET src -j MARK --set-xmark 0x10000/0xf0000
-A CHECKHOST -j VPNCHECKHOST
-A VPNCHECKHOST -m set --match-set VPNSET src -j MARK --set-xmark 0x10000/0xf0000
-A VPNCUSSETMARK -m set --match-set vpndocker0 src -j MARK --set-xmark 0x900/0xff00
-A VPNCUSSETMARK -m set --match-set vpnlxcbr0 src -j MARK --set-xmark 0xa00/0xff00
-A VPNCUSSETMARK -m set --match-set vpnqvs0 src -j MARK --set-xmark 0xb00/0xff00
-A VPNDEFSETMARK -s 10.8.0.0/24 -j MARK --set-xmark 0x80/0xff
-A VPNSETMARKENTRANCE -j VPNCUSSETMARK
-A VPNSETMARKENTRANCE -m mark --mark 0x0/0xffff -j VPNDEFSETMARK
COMMIT
# Completed on Tue Mar 16 18:53:48 2021
# Generated by iptables-save v1.4.21 on Tue Mar 16 18:53:48 2021
*filter
:INPUT ACCEPT [89540:42032714]
:FORWARD ACCEPT [58919:29309422]
:OUTPUT ACCEPT [80104:11601972]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
:SYSDOCKER - [0:0]
:SYSDOCKER-ISOLATION-STAGE-1 - [0:0]
:SYSDOCKER-ISOLATION-STAGE-2 - [0:0]
:SYSDOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o lxcbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o lxcbr0 -j DOCKER
-A FORWARD -i lxcbr0 ! -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -o lxcbr0 -j ACCEPT
-A FORWARD -j SYSDOCKER-USER
-A FORWARD -j SYSDOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j SYSDOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A OUTPUT -m set --match-set BRNOIPSET src,dst -j DROP
-A DOCKER-ISOLATION-STAGE-1 -i lxcbr0 ! -o lxcbr0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o lxcbr0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
-A SYSDOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j SYSDOCKER-ISOLATION-STAGE-2
-A SYSDOCKER-ISOLATION-STAGE-1 -j RETURN
-A SYSDOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A SYSDOCKER-ISOLATION-STAGE-2 -j RETURN
-A SYSDOCKER-USER -j RETURN
COMMIT
# Completed on Tue Mar 16 18:53:48 2021