
Raspberry Piをクライアントデバイスのルーターとアクセスポイントとして設定しましたが、正常に動作します。
Hostapdおよびisc-dhcp-severプログラムと連携して動作しますが、1つの課題があります。 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
行1に示すように、スクリプトを独自のファイルに入れて#!/bin/bash
実行権限を与え、テストして準備ができたら、rc.local
`で呼び出します。
答え2
デフォルトでは、ファイルは/etc/rc.local
(読み取ったファイルの最初の行)として解釈されます。以下でのみ動作するCスタイルループを使用しました。これが根本原因だと思います。sh
#!/bin/sh -e
for
bash
最初の行を/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にコピーします。これが設定エラーを解決するのに役立つと思いました。それでも安いトリック:)