OrangePi R1を使ってみる

特定のポートだけを通過するルータ



こちらに ufwを使ったルータの作り方が紹介されています。
大変分かりやすい解説で、誰でもR1を使ったルータを作ることができます。
この解説を元に、特定のポートだけをフォワードするルータを作りましたが、1点だけはまりましたので記録として残しておきます。

こ ちらにiptablesのsyntaxが公開されています。
特定のポートを指定するには、「tcp filter Table Match Operations」で[-p tcp --dport XXXX]を指定すれば良いことが分かりました。
そこで、[/etc/ufw/before.rules] の記載内容を以下のように一部変更しました

【変更前】
-A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE
【変更後】
-A POSTROUTING -s 10.0.0.0/24 -o eth1 -p tcp --dport 9876 -j MASQUERADE

この変更を行った後に、ufwをdisable/enableしても、変更が反映されません。
$ sudo vi /etc/ufw/before.rules

#-A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/24 -o eth1 -p tcp --dport 9876 -j MASQUERADE

$ sudo ufw disable && sudo ufw enable

いろいろ悩みましたが、natテーブルの初期化を行えば、変更が反映されることが分かりました。
iptableの初期化では変更が反映されません。
$ sudo vi /etc/ufw/before.rules

#-A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/24 -o eth1 -p tcp --dport 9876 -j MASQUERADE

$ sudo iptables --flush -----> これでは変更が反映されない
$ sudo iptables -t nat -F ----> 重要
$ sudo ufw disable && sudo ufw enable

これでtcp/9876の通信だけがフォワードされます。
ポート番号=9875とポート番号=9876で待ち受けるサーバープロセスを起動して確認してみました。
orangepi@orangepizero:~/socket$ ./client 1 9876
PORT=9876
ip address : 10.0.0.2
サーバーマシンのIPは?:192.168.10.10
Connecting...dstSocket=3
192.168.10.10 に接続しました
Send=[data from raspberry 00000]→Recv=[DATA FROM RASPBERRY 00000]
loop=1 difftime=5.000000[sec] 0.083333[min] retry=0


orangepi@orangepizero:~/socket$ ./client 1 9875
PORT=9875
ip address : 10.0.0.2
サーバーマシンのIPは?:192.168.10.10
Connecting...接続できませんでした retry=1 difftime=63.000000
Connecting...接続できませんでした retry=2 difftime=63.000000
Connecting...接続できませんでした retry=3 difftime=63.000000
Connecting...接続できませんでした retry=4 difftime=63.000000
Connecting...接続できませんでした retry=5 difftime=64.000000
Connecting...接続できませんでした retry=6 difftime=63.000000
Connecting...接続できませんでした retry=7 difftime=63.000000
Connecting...接続できませんでした retry=8 difftime=63.000000
Connecting...接続できませんでした retry=9 difftime=63.000000
Connecting...接続できませんでした retry=10 difftime=63.000000
Connecting...接続できませんでした retry=11 difftime=63.000000
dstSocket=-1
192.168.10.10 に接続できませんでした
orangepi@orangepizero:~/socket$

10.0.0.2/9876は192.168.10.10に通りますが、10.0.0.2/9875は192.168.10.10に通りません。
通過できるポートを増やすには、以下のように行を追加するだけです。

【変更前】
-A POSTROUTING -s 10.0.0.0/24 -o eth1 -p tcp --dport 9876 -j MASQUERADE
【変更後】
-A POSTROUTING -s 10.0.0.0/24 -o eth1 -p tcp --dport 9876 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/24 -o eth1 -p tcp --dport 9877 -j MASQUERADE