ポートフォワードの経路で、Uターン NATとかヘアピンNATが使えないルータの場合のあれこれ

先日、以下のように困っていました。

Termuxのapache2+php+mariadbのチューニング前のwordpressの速度とか
::
まぁ、速度的なことより困っていることがあります。それは、ローカルのマシンから、termux上で動作しているwordpressにグローバルIPでアクセスできないことです。この場合、ルータの管理画面にアクセスしちゃうんで、どうしようかなと。こういうのなんていうんでしたっけか? とにかく、今の拠点のルータ(PR-400KI)は、内側ネットワークから外側のグローバルアドレスにアクセスしたものを、変換(最終的にサーバのプライベートアドレスに変換)してくれないのです。

これ、言葉で書くとよくわかりませんが、どんな問題かというと以下のようになります。

こういう表現として、UターンNATとか、ヘアピンNATとか呼ぶようです。これが出来るルータとできないルータがあり、NTTから借りているルータではできませんでした。いろいろ解決方法があるとは思いますが、一番簡単なのは、クライアントPCをVPNで外部のネットワークからアクセスさせる方法です。つくば大学のVPN Gateを使えば簡単に解決できますが、インターネット経路となりいまいちです。プレイベート間の通信なのでリバースプロキシを経由する方法が良さそうです。ポート変換がなければ、hosts を書き換えるか、内部DNSを立ち上げればいいのですが、今回の場合は、スマホサーバで提供しているポートは8080です。80と8080を対応付ける必要があり、hosts だけでは無理なので、リバースプロキシを通して、アクセスしてみることにします。

 ブログの更新は、クライアントPCからしか行わないのでこのPC中に設置してみました。もちろんリバースプロキシを分離して、内部DNSを立ち上げれば、理論上は何台でも違うポートとIPを使って好きなドメインでアクセスできます。そのうち、IoTデバイスとか、スマホサーバでクラスタリングとかロードバランサーとか使い出したら内部DNSやリバースプロキシは欲しくなってくるのですが、それはその時にまた考えることにします。

 ということで、クライアントにリバースプロキシを作って、スマホサーバの8080ポートで提供されているWordPress にアクセスしてみることにします。幸い、クライアントはMacなので nginx とかで簡単に作れます。

Macでリバースプロキシをnginxで作る

経路のイメージはこんな感じでしょうか。まずは、nginx を入れます。

$ brew install nginx

起動と再起動、停止は以下のようにします。

・起動
$ sudo nginx
・再起動
$ sudo nginx -s reload
・停止
$ sudo nginx -s stop

設定を以下のように書き換えます。server_nameや、proxy_passのIPやポートなど読み替えて書き換えてみてください。

/usr/local/etc/nginx/nginx.conf
::
worker_processes 1;
error_log /usr/local/var/log/nginx/error.log;

events {
  worker_connections  1024;
}

http {
  # This should be in the same directory as this conf
  # e.g. /usr/local/etc/nginx
  include       mime.types;
  default_type  application/octet-stream;
  
  # Note this log_format is named 'main', and is used with the access log below
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

  sendfile        on;
  keepalive_timeout  65;

  # Without this I got this error: 'upstream sent too big header
  # while reading response header from upstream'
  proxy_buffer_size   128k;
  proxy_buffers   4 256k;
  proxy_busy_buffers_size   256k;

  server {
      listen 80;
      server_name jh.gpl.jp;
      proxy_set_header    Host    $host;
      proxy_set_header    X-Real-IP    $remote_addr;
      proxy_set_header    X-Forwarded-Host       $host;
      proxy_set_header    X-Forwarded-Server    $http_host;
      proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
      access_log /usr/local/var/log/nginx/reverse-proxy.access.log  main;

      location / {
          proxy_pass         http://192.168.1.38:8080;
      }
  }
}

hosts を書き換えます。

$ cat /etc/hosts
::
127.0.0.1 jh.gpl.jp

nginx を再起動して、ブラウザでドメインに対してアクセスすればOKです。

ちなみに、wp-config.php に以下を追記すると、接続元が192.168.1.26 の時だけWordPress のドメイン名が www.gpl.jp に書き換わります。もちろん、アクセスするクライアントのhosts は書き換える必要があります。

if( $_SERVER['REMOTE_ADDR'] == '192.168.1.26' ){
    define('WP_HOME','http://www.gpl.jp');
    define('WP_SITEURL','http://www.gpl.jp');
}

ということで、macos で簡単にリバースプロキシーを立ち上げて、内部ネットワークの違うポートで提供されているWordPress にアクセスする方法でした。

Lan内部のスマホからもアクセスしたい場合は、内部DNSをDHCPで配布して、リバースプロキシーと対応付けしないとだめですので、完璧を求めるならそれらが必要です。そのうち、作る機会があれば紹介したいなと思います。

備忘録:macosの静的ルートの追加

いつも忘れてしまうので、メモしておくことに。Linuxとは、少し違い永続的な設定方法は専用コマンドがあります。networksetup コマンドです。

・ネットワークデバイス名の一覧

$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
Built-in Serial Port (1)
Ethernet
iPhone USB
Wi-Fi
Bluetooth PAN

・ネットワークデバイスの情報

$ networksetup -getinfo Ethernet
DHCP Configuration
IP address: 192.168.1.26
Subnet mask: 255.255.255.0
Router: 192.168.1.1
Client ID: 
IPv6: Automatic
IPv6 IP address: none
IPv6 Router: none
Ethernet Address: 90:2b:34:d0:02:80

・静的経路の追加と削除

永続的に追加。この例では、124.41.83.243/32 あては、192.168.1.38 へ送ります。

$ sudo networksetup -setadditionalroutes Ethernet 124.41.83.243 255.255.255.255 192.168.1.38

削除。何もパラメータに設定しないと消えます。

$ sudo networksetup -setadditionalroutes Ethernet
There are no additional IPv4 routes on Ethernet.

再起動すると消えますが一時的に設定したい場合

sudo route -n add 124.41.83.243/32 192.168.1.38

削除は

sudo route -n delete 124.41.83.243/32

・確認

$ networksetup -getadditionalroutes Ethernet
124.41.83.243 255.255.255.255 192.168.1.38

または、

$ netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.1.1        UGSc           67        5     en0
124.41.83.243      192.168.1.38       UGHS            0        0     en0
::

神アプリ。PCからiosやandroidスマホ画面を触れる開発者必須のツール

アプリ開発って、複数端末を操らないといけないので結構面倒なんですよね。できれば、PC画面のキーボード、マウスから手を離したくはないのです。いちいち、スマホに目線を移動して画面を見て触らないといけないのが面倒です。

さて、そんな開発者のあなた! 今日のネタは必見ですよ〜。別に開発者じゃなくても便利に使えますのでちょっと紹介しますね。

Wormhole_TakehikoのiPhone__と_Wormhole_と_新しいタブ

はい、この画面macosでスマホを操っている画面です。左側は、iosで、右側がandroidです。PCのマウスやキーボードでスマホを触れてめちゃくちゃ便利ですよ。これを実現するのは以下のアプリです。WormHoleです!

Wormhole_-_Control_phone_from_PC

androidは無料で、android側に入れるアプリは以下です。

Wormhole_-_Bridge_between_Mobile___Desktop_-_Google_Play_のアプリ

Androidは、スマホ側にこのアプリを入れますが、iosは何も必要ありません。スマホとUSBケーブルで接続し、WormholeのPCアプリを起動すると以下のように画面が出ます。

スクリーンショット_2020_08_24_11_44

画面のローテートにも対応していて、横画面にするとPC側も横長で表示されます。

Wormhole

これはTermuxを横表示した画面です。PCキーボードでタイプできます。神ですよね。例えば、設定でダークモードをOn/Offしたければこんな感じでPC画面からスマホを操れます。

Wormhole

iosの場合は、1084円の有料ですがこの価値はあるかと思います。

Wormhole_Store

例えば、awaアプリ(音楽ストリーミングアプリ)を起動するとPC経由からブルートース経由で音が鳴らせます。

Wormhole_TakehikoのiPhone_

PC側のブルートースにはiPhoneがコネクトされています。iosはUSBとブルートース接続が必要のようです。USBの代わりにWiFi経由でも可能ですが、開発時にはxcodeからデバックするために、USBケーブル接続していますし、充電もできるので問題ありません。

Bluetooth

PC側に負荷をかけずに音楽を鳴らせるのでなかなかいい感じです。また、スクリーンショットなんかも簡単にクリップボード経由で撮れるので、スマホでスクショ撮るより全然便利です。スマホでスクショ撮るとその転送が面倒なんで。

非ルート化しなくても、iosもandroidもPC側から触れるツールは自分が知る限りこれしかありません。ということで、神アプリとなっています。

では、またー!

 

WiFiとアンテナを調達!

世間はコロナで、ニュースサイトもコロナのことばっかりですね。東京は不要不急の外出は控えないといけないんで、というか外にはあまり用事ありませんが、ネットの世界で遊んでみましょう!しかも、日曜は雪ですよ。この時期に東京で雪なんて珍しいんじゃないでしょうか。

で、アリエクがセールに突入したんで宅内サーバにする現在発注済みの「ThinkCentre M75q-1 Tiny」に取り付けて実験するWiFiカードとアンテナを調達しておきました。調達にあたり、先輩方のサイトが参考になりました。

PC好きの備忘録:ThinkCentre M75q-1 Tinyを買った
https://hchch.net/thinkcentre-m75q-1-tiny-review/

WiFi カードはいろいろと候補がありますが、このマシンに取り付けられるM.2スロットは 長さが30mm タイプ、2230のKey A+E が付けられるようです。安いのはINTELのがあるんですが、 ちょっとこのマシンに Hackintosh が入れられるか試してみたくて、WiFi もそこそこいけそうなのを選んでいました。Hackintosh に INTEL の WiFi は選択肢としてはナシなので、Boot macOS さんとこで使えそうで長さが短い NGFF(M.2)なものを探しにいきました。

Boot macOS:HACKINTOSHのパーツ選び 【その4:無線編】
https://bootmacos.com/entry/2017/09/10/175816

M.2 タイプの WiFI だと一番無難なものは、BCM94360NG のようですがこれはちとお高い(5000円ちょい)ので、多少パッチやドライバ当ててもいいんで安そうなものを探していました。

結局、型番と流通の両観点からお得でかつ、容易(ドライバやパッチしなくても)なものを探すのに1、2日かかりましたが、以下サイトから

INVENTORY OF SUPPORTED/UNSUPPORTED WIRELESS CARDS #1
https://osxlatitude.com/forums/topic/2120-inventory-of-supportedunsupported-wireless-cards-1-snow-leopard-el-capitan/

DW1820A という型番、チップはBCM94350ZAE(技適:007-AD0109)が良さそうだということになりました。たぶん、OOB(Out of the Boxの略でパッチいらずで箱から出してすぐ使えるもの)と記載がありました。これの詳細は以下にあります。

BROADCOM BCM4350 CARDS UNDER HIGH SIERRA/MOJAVE/CATALINA
https://osxlatitude.com/forums/topic/11322-broadcom-bcm4350-cards-under-high-sierramojavecatalina/

対処法の要約は以下です。

⑴ブートフラグに、brcmfx-country = XX  (XXはターゲット値、たとえば、US、FR、#aなど)をつける。
⑵ASPMを無効にするDSDTパッチをあてる
>該当PCIのターゲットデバイスを指定
>具体的な値は以下

Key = compatible | Value = pci14e4,4353 | Type = STRING
Key = pci-aspm-default | Value = 0 | Type = NUMBER
Key = AAPL,slot-name | Value = WLAN | Type = STRING (optional)
Key = device_type | Value = Airport Extreme | Type = STRING (optional)
Key = name | Value = Airport | Type = STRING (optional)
Key = model | Value = Dell DW1820 (BCM4350) 802.11ac wireless | Type = STRING (optional)

⑶あとは、BrcmFirmwareRepo + BrcmPatchRAM2 のkextsを入れればBT4.1で AirDrop と Handoffが使える

という感じのようです。ちゅうか、OOBじゃないやん(笑)一応、用語の解説。 ASPM は、接続するデバイスが使用中でない時に PCIe リンク用に電力状態を低く設定することです。

RedHat:3.7. ACTIVE-STATE POWER MANAGEMENT
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/power_management_guide/aspm

Handoffとは、iOS とかの対応アプリで作業途中から引き継げる機能で、以下参照。

Apple:Handoff を使ってほかのデバイスで作業を続ける
https://support.apple.com/ja-jp/HT209455

 

これらは、DELLやLENOVOのパーツ型番があるようで、汎用品は、Amazonでも流通していますが 急ぎではないので、1000円代で買えるアリエクでポチっておきました。このDW1820A の表記があるのはDELLの汎用品でしょうか。

DW1820A BCM94350ZAE 802 11ac BT4 1 867Mbps wifi Adapter DW1820 BCM94352Z M 2 better NGFF than BCM94350 WiFi Wireless Card E8G2 Computer Cables Connectors AliExpress

送料入れて、1350円くらいですかね。アンテナも同時にゲット。すばらしぃ安さ!今セールなんですよね。てか、年中セールやってますが(笑)

2x6Dbi 2 4GHz 5GHz Dual Band M 2 IPEX MHF4 U fl Extension Cable to WiFi RP SMA Pigtail Antenna Set for Wireless Router Aerial Network Cards AliExpress

これは、MHF4コネクタの30cm ケーブルのようです。2本目のアンテナはどっから出すかはまぁ来てから考えることにします。合計で2000円以下のカスタマイズですが、サーバ運用する前にあれこれ遊ぶ予定です。

 

最後に、最近フォートナイトっていうゲームにハマっています。これ、最終的には壁(建築物)をうまく制御できないと勝ちにくいので、コントローラーが必須です。良くても2、3位くらいでぬっころされるんで、DUALSHOCK 4 のパチモンをゲットしました。

Controller For PS4 Pro PC iPhone Android Mobile Phone Wireless Bluetooth Gamepad For SONY Playstation 4 Dualshock Console Gamepads AliExpress

無料でできて、かつ mac でもプレイできるんでハマっているんですが、勝てないんでムキになるんですよね。
「ThinkCentre M75q-1 Tiny」だとどのくらい遊べるか、ちょっと気になっています。岡ちゃんねるさんとこでは、1980×1080の画質中で、Windows だと 60FPS 出るそうです。

mac の画面輝度調整MonitorControlが便利すぎる!

日本で Hackintosh 関連の情報が一番豊富なサイトである Boot macOS さんのところを見ていたら、こんな情報が!

Boot macOS:APPLEキーボードの☀︎キーで明るさ調整する

ずっと、キーボードの画面明るさ調整のキーが使いたいなって思っていました。

0

早速入れてみました。この時の最新、MonitorControl.1.7.1では 10.14.6 の自分の環境では動作しなかったので、v1.3.0を使っています。

MonitorControl v1.3.0
https://github.com/the0neyouseek/MonitorControl/releases/tag/v1.3.0

これ、最高ですね。アプリを入れて、設定して起動するとメニューにこんな感じで出てきます。4

各種設定をして、F1とF2 キーを押すと個別に輝度調整が可能です! すばらしぃ!

Desktop

3画面あるんで、モニターの輝度が微妙に調整したかったんですよね。これはめちゃ便利です。

5

v1.3.0 の設定画面はこんな感じになっています。

6

ボリュームは画面から出していないので、明るさ調整だけにしています。

7

Change 〜 for all screens にチェックを入れると全部の画面を一度に調整できます。

ということで、Boot macOS さんのとこは面白い情報がありますのでちょくちょく遊びに行ってみることにします!

Intelチップ、2022年までしばらくさようなら!

2019年は、intel より AMD が市場を奪った記念する年になりました。

ということで、ついに昨年末に mac の構成を変更しました。Intelの10nm 以下になるまで待とうと思っていましたが、一向に出てこないので Ryzen に乗り換えです。AMD Ryzen 5 3600 と手頃なところで妥協しました。次のintel が出るまでこれでお茶を濁す作戦です。6core12スレッドです。

Unixbench

Benchmark Run: 金  3 13 2020 01:07:28 - 01:43:32
12 CPUs in system; running 12 parallel copies of tests

Dhrystone 2 using register variables 354578447.1 lps (10.0 s, 8 samples)
Double-Precision Whetstone 98121.9 MWIPS (9.6 s, 8 samples)
Execl Throughput 4513.4 lps (29.9 s, 3 samples)
File Copy 1024 bufsize 2000 maxblocks 550866.4 KBps (30.0 s, 3 samples)
File Copy 256 bufsize 500 maxblocks 101816.4 KBps (30.0 s, 3 samples)
File Copy 4096 bufsize 8000 maxblocks 2218869.7 KBps (30.0 s, 3 samples)
Pipe Throughput 1890682.4 lps (10.0 s, 8 samples)
Pipe-based Context Switching 496272.6 lps (10.0 s, 8 samples)
Process Creation 12207.8 lps (30.0 s, 3 samples)
Shell Scripts (1 concurrent) 9017.9 lpm (60.0 s, 3 samples)
Shell Scripts (8 concurrent) 2370.1 lpm (60.2 s, 3 samples)
System Call Overhead 1296027.8 lps (10.0 s, 8 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 354578447.1 30383.8
Double-Precision Whetstone 55.0 98121.9 17840.3
Execl Throughput 43.0 4513.4 1049.6
File Copy 1024 bufsize 2000 maxblocks 3960.0 550866.4 1391.1
File Copy 256 bufsize 500 maxblocks 1655.0 101816.4 615.2
File Copy 4096 bufsize 8000 maxblocks 5800.0 2218869.7 3825.6
Pipe Throughput 12440.0 1890682.4 1519.8
Pipe-based Context Switching 4000.0 496272.6 1240.7
Process Creation 126.0 12207.8 968.9
Shell Scripts (1 concurrent) 42.4 9017.9 2126.9
Shell Scripts (8 concurrent) 6.0 2370.1 3950.1
System Call Overhead 15000.0 1296027.8 864.0
========
System Benchmarks Index Score 2323.1

思ったより、UnixBench はスコアが出ないようですね。i-7 3770のときに計測したスコア(3440.0)のほうがよかったですね。

Geekbench は以下の通り。

Geekbench 4.4.2 

Single-Core Score:5309
Multi-Core Score:27849

まぁ、Core i7 8700Kくらいですかね。

Geekbench 5.1.0

Single-Core Score:1151
Multi-Core Score:6433

動作全般は軽いですので、intel の 10nm 以下、立体構造になるやつ? が出るまでこれを使っていこうと思います。

交換品は、約5万(49,643円)

CPU:24,999円 AMD Ryzen 5 3600 (3.6GHz 6コア / 12スレッド 35MB 65W)

マザー:8,244円 ASRock  B450M Pro4

メモリ:16,400円 32GB (Patriot Viper Steel 16GBキット- PVS416G320C6K)

当初は、Core i9 9900Kにしようと思っていたのでそれより3.5万くらいは安くあがった感じです。2022年まであと2年使えればOKかな。

感想ですがRyzen hackintosh は、バニラな状態なんですがいろいろと動作ソフトウェアを選ぶ(32bitが未サポート)ので安定なら intel が間違えないです。

似たような価格帯なら、i5 9600K を選んでおいたほうがよかったかなと少し後悔していますが、こればかりは使ってみないとわからないので。

Intelの7nmプロセスは、本当に2021年〜に出るのかな?