使用端口转发的 Raspberry Pi 路由器上的 VNC

使用端口转发的 Raspberry Pi 路由器上的 VNC

我已将 Raspberry Pi 配置为客户端设备的路由器和接入点,并且它可以正常工作。

它可以与 hostapd 和 isc-dhcp-sever 程序配合使用,但存在一个挑战:通过 Raspberry Pi 路由器启用 VNC 连接。您可以在下面找到已完成工作的示意图。

intranet <--> [x.x.x.x|eth0] Raspberry Pi 2 [192.168.1.1/24|wlan0] <--> clients

我的想法是在 rc.local 文件中启用端口转发,但由于某种未知原因它没有执行代码。

您可以在下面找到 rc.local 文件的内容:

# enable VCN port forwarding
vncport=5900
for (( counter=0; counter<91; counter++ ))
do
    port=$[10010+counter]
    address=$[10+counter]
    iptables -A PREROUTING -t nat -i eth0 -p tcp --dport "$port" -j DNAT --to 192.168.1."$address":"$vncport"
    iptables -A FORWARD -p tcp -d 192.168.1."$address" --dport "$port" -j ACCEPT
done

# access point code
iptables -A FORWARD -o eth0 -i wlan0 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
exit 0

答案1

您的脚本运行并创建此 iptables 条目:

# iptables -L FORWARD -nv
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.10         tcp dpt:10010
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.11         tcp dpt:10011
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.12         tcp dpt:10012
...
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.98         tcp dpt:10098
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.99         tcp dpt:10099
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.1.100        tcp dpt:10100

# iptables -t nat -L PREROUTING -nv
Chain PREROUTING (policy ACCEPT 11 packets, 1746 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10010 to:192.168.1.10:5900
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10011 to:192.168.1.11:5900
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10012 to:192.168.1.12:5900
...
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10098 to:192.168.1.98:5900
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10099 to:192.168.1.99:5900
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:10100 to:192.168.1.100:5900

将您的脚本放在一个自己的文件中,#!/bin/bash如第 1 行所示,授予它执行权限,测试它,准备好后,从rc.local `调用它

答案2

默认情况下,文件由(该文件的第一行读取)/etc/rc.local解释。您使用了 C 样式循环,它仅适用于.我相信这就是根本原因。sh#!/bin/sh -eforbash

将第一行替换/etc/rc.local#!/bin/bash -e,或者以 sh 兼容的方式重写循环:

counter=0
while [ "$counter" -lt 91 ]
do
    port=$((10010+counter))
    address=$((10+counter))
    iptables -A PREROUTING -t nat -i eth0 -p tcp --dport "$port" -j DNAT --to 192.168.1."$address":"$vncport"
    iptables -A FORWARD -p tcp -d 192.168.1."$address" --dport "$port" -j ACCEPT
    counter=$((1+counter))
done

答案3

大多数Linux使用相同的防火墙,因此在任何环境中都可以正确配置防火墙桌面Linux并在验证后将 iptable 规则复制到 Raspberry Pi。我想这可能有助于解决配置错误。虽然是一个廉价的伎俩:)

相关内容