iptables によるパケットのルーティング

やりたいこと

最終的には、インターネットを経由した自宅内部のパソコンへリモートデスクトップを行いたい。
そこで RDP のデフォルトポート(3389)を、別なポートへ変更する。
パソコン側での待ち受けポートは変えずに、なんとか Raspberry Pi 2 で出来ないものか。

やったこと

Raspberry Pi 2 の iptables で、ポートフォワード。
インターネットからは、ポート番号の変更で各ホストに RDP 出来るようになった。


普通にクライアント側の待ち受けポートを変更すれば済む話でもあったりするけども…。
iptables を使うメリットって、クライアント側での対処を極力減らすことが第一かな。


それと、今後のことなんだけど iptables 機能にログ取得があったような気がするので、リモートデスクトップを使ったらログが出る様にしたい。
最終的には、ログイン → 即時メール送付かなぁ…

環境

機器名 用途 備考
PR-200NE ダイアルアップルータ インターネット接続をマスカレード
Raspberry Pi 2(初号機) サーバー RDP接続のパケットを forward する
Raspberry Pi 2(弐号機) お遊び(兼 開発環境) rdp 入れてアクセスを受ける
PC(Windows8.1 Pro) 普通にパソコン RDP のアクセスを受ける
F-01F クライアント 出先から自宅端末へアクセス

Windows の設定

とりあえず Windows 側で、リモートデスクトップを受け付ける設定にしておく。


Windowsキー + Pause キーで、システムを表示。
→ 左側メニューから [リモートの設定] をクリック。
リモートデスクトップグループから [このコンピューターへのリモート接続を許可する] をクリック。
→ [OK] ボタンをクリック。

以上。

Raspberry Pi 2(弐号機)の設定

リモートデスクトップを受け入れる環境づくり。
Terminal を開いて、以下のコマンドを実行する。

$ sudo apt-get install xrdp

以上。

Raspberry Pi 2(初号機)の設定

まずは ipv4 の転送設定確認。

$ sudo sysctl -a | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_use_pmtu = 0

これが 0 だと IPv4 を転送してくれないので、変更する。

$ sudo sysctl -w net.ipv4.ip_forward=1

ついでに設定ファイルも書き換える。

$ sudo cp -p /etc/sysctl.conf /etc/sysctl.conf.$(date +%Y%m%d)
$ sudo sed -i "s/^#net.ipv4.conf.all.rp_filter=1/net.ipv4.conf.all.rp_filter=1/" /etc/sysctl.conf
$ sudo diff /etc/sysctl.conf /etc/sysctl.conf.$(date +%Y%m%d)


設定する前に、対象の IP アドレスとポート番号を整理しておく。
ついでにシェル変数へ格納しておけば、コマンドは使いまわせそう。

$ Forwarder=(中継サーバのIPアドレスorドメイン名。今回は初号機)
$ Boss=(後ろで待ち構えているホストのIPアドレスorドメイン名。今回は PC のIPアドレス)
$ Boss2=(後ろで待ち構えているホストのIPアドレスorドメイン名。ここは弐号機のIPアドレス)
$ Fport=(中継サーバへのDSTポート番号。デフォルト 3389 以外を指定)
$ Fport2=(中継サーバへのDSTポート番号。デフォルト 3389${Fport} 以外を指定)
$ Bport=(後ろで待ち構えているホストの待ち受けポート。今回は 3389 になる)


現時点の設定情報を見ておく。

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


ぜーんぶ筒抜け…
ま、ダイアルアップルータで不要なパケットは全部遮断してるから、特に問題にはならないんだけど。


ここからようやく iptables の設定を始める。


やることは、一旦 Chain FORWARD を全部閉じて、必要なものだけ穴あけする。
Chain FORWARD だけなので、SSH が落ちるとかいったことは無い。

$ sudo iptables -P FORWARD DROP
$ sudo iptables -t nat -A PREROUTING -m tcp -p tcp --dst ${Forwarder} --dport ${Fport} -j DNAT --to-destination ${Boss}:${Bport}
$ sudo iptables -t nat -A PREROUTING -m tcp -p tcp --dst ${Forwarder} --dport ${Fport2} -j DNAT --to-destination ${Boss2}:${Bport}
$ sudo iptables -t nat -A POSTROUTING -m tcp -p tcp --dst ${Boss} --dport ${Bport} -j SNAT --to-source ${Forwarder}
$ sudo iptables -t nat -A POSTROUTING -m tcp -p tcp --dst ${Boss2} --dport ${Bport} -j SNAT --to-source ${Forwarder}
$ sudo iptables -A FORWARD -m tcp -p tcp --dst ${Boss} --dport ${Bport} -j ACCEPT
$ sudo iptables -A FORWARD -m tcp -p tcp --dst ${Boss2} --dport ${Bport} -j ACCEPT
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


… INPUT と OUTPUT は、今回の目的に沿わないので手を付けない。


で、再起動するとすべて消えるので、対処。
参考にしたサイト様では、シェルスクリプトにして毎回設定していたりもするけど…


Debian 的な解決方法を採る。
なので iptables-persistent というアプリをインストールする。

$ sudo apt-get install iptables-persistent


すると、設定画面が表示される。
IPv4 設定の保存先。


IPv6 設定の保存先。


既存設定があると、自動で保存してくれるみたい。
せっかくなので、保存内容を見る。

$ cat /etc/iptables/rules.v4


下記コマンドの出力結果と同じ内容なら、問題なし。

$ sudo iptables-save


ちなみに、以下のコマンドで設定内容を再保存できる。

$ sudo service iptables-persistent save


もし、エラーが出たら su - してやってみると、なぜかうまくいくかも。
少なくとも僕は、それでうまくいった…
(sudo って何だっけ?)

オプション 機能 備考
start iptables の起動
restart 再起動
reload 設定再読込
force-reload 強制再読込
save 設定内容の保存
flush

家庭内ネットワークで確認

とりあえず、コンピュータ側のリモートデスクトップを受け付ける設定は、ここまでで終わったはず。
なので Wi-Fi を ON にしたスマホリモートデスクトップアプリをインストールして、アクセスする。
僕は無料 RDP ソフト Microsoft Remote Desktop を使っている。
名前の通り、Microsoft が提供しているもので、下手なアドウェアとかは仕込まれてないだろうという判断から。


RDP するのに必要な設定を入れて、タップ。


  • Connection name は、自分が判別できるアクセス先の名前(任意)。
  • PC name は、この場合 ${Forwarder}:${Fport} になる。
  • User name に、アクセス先端末のログインユーザ名
  • Password に、そのパスワード。


※ 他は特殊なネットワーク環境の場合なので、該当する場合のみ適宜入力。


ここでアクセスできるなら、インターネットからアクセス出来るようになるまでもう少し。

ダイアルアップルータの設定

僕の環境では NTT PR-200NE なのだけれど、ごちゃごちゃしていてちょっと画像にして載せるには躊躇するので、要点だけ。

  1. PR-200NE にログイン。
  2. [詳細設定] から [静的IPマスカレード設定] をクリック。
  3. 空いてるエントリ番号の [編集] をクリック。
  4. 変換対象プロトコルTCP を選択。
  5. 変換対象ポートは ${Fport} の設定内容を入力。
  6. 宛先アドレスは ${Forwarder} の設定内容を入力。
  7. [設定] ボタンをクリック。
  8. [前のページへ戻る] をクリック。
  9. 設定したエントリ番号にチェックを入れて [設定] ボタンをクリック
  10. 最後に [保存] ボタンをクリック
  11. ログアウト


途中で設定を有効にする設定(チェックボックス)を入れ忘れたり、設定を反映する設定(最後の保存ボタンクリック)を忘れたりするとアウト。



Dynamic DNS に登録しているので、そちらの名前から Wi-Fi を OFF にしたスマホリモートデスクトップを実行。
無事、繋がることを確認して安堵。