それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Rejected request from RFC1918 IP to public server addressに対応する。

OpenWrt で自分自身のグローバルIP(PPPoE)へHTTPすると、RFC1918

例えば次のように、グローバルIPへ内部から接続すると

curl -v  http://{$my-global-ip}

RFC1918のエラーになる。

Rejected request from RFC1918 IP to public server address

これは、OpenWrtの管理画面UIであるLuciから出ている。

Luciのuhttpd が 0.0.0.0/0 をリッスンしていて、PPPoEのIPで応答するため、上記のエラー(Reject RFC1918) が発生する。

対応

対応は「何をしたいか」によって分かれる。

Luciを見たい、見せたいのであれば、対応策1を使う。

Luciを応答させずに、別のApache/nginxなどWEBサーバーを応答させたいときは、対応策2を使う。

私が、この事象に遭遇したのは次の理由による。

443ポート(https)を転送するけど、80(http)はDNAT(リダイレクト)を未記入で使っていた。

最近は80を使うことが減ったのでポート転送を書いてなかった。

しかし、HTTP->HTTPSのリダイレクトを行うには、いったん80で応答しなくてはいけなかった。

対応策1

rfc1918_filter をオフにする。

/etc/config/uhttpd:  option rfc1918_filter '1'

対応策2

ファイアウォールでリダイレクトを書く。

/etc/config/firewall

config redirect
  option target 'DNAT'
  option name 'wan-http-to-local'
  option family 'ipv4'
  list proto 'tcp'
  option src 'wan'
  option src_dport '80'
  option dest_ip '192.168.1.xxx'
  option dest_port '80'

ファイアウォールの転送は、uhttpd応答より前段階である。FWが転送してuhttpdにパケットが届く前に処理されるように設定している。

参考資料

https://forum.openwrt.org/t/hosting-website-rejected-request-from-rfc1918-ip-to-public-server-address/158971