VPN越しにHTTPやSSH通信だけ通らなかった話とMTU設定

この記事を作った動機 なんか、キャリアネットワークをデザリングを経由して使って、さらにVPN接続を介した通信のうち、HTTPとSSHだけが繋がらないということがあった。 それで対策としてMTUを小さく設定することをしたのでそのことを記録するだけ。 ちなみになぜMTUが大きすぎるとだめなのかわかっていないが、多分大きすぎるサイズのパケットはなんとなくどこかで落とされている気がする。 VPNや多段NAT構成だとルーティングされているうちに、ヘッダが積み重なって、ネットワークのパケットのサイズが大きくなりすぎたりするのかもしれない。 ネットワークの構成 サーバーやLAN内のルータ マンションのNAT キャリアネットワーク スマホ(デザリング) PCとか 状況 A -> キャリアネットワークのときで、直接マンションのNATを超えたとき B -> キャリアネットワークのときで、VPSなどの固定IPを持ったサーバーを経由したとき C -> 光回線などの固定回線で、直接マンションのNATを超えたときと、VPSなどの固定IPを持ったサーバーを経由したときの両方について含まれる 状況別の表 A B C Ping ✅ OK ✅ OK ✅ OK SMB(ファイル共有) ✅ OK 確かめていない ✅ OK DNS ✅ OK ✅ OK ✅ OK SSH ❌ Failed ✅ OK ✅ OK HTTP(HTTPS) ❌ Failed ❌ Failed ✅ OK MTU設定方法(要管理者権限) デフォルトで設定されているMTUのサイズ 1500 今回うまくいったMTUのサイズ 1000 一時的な設定(とりあえずすぐ設定したいとき) ip コマンドを使う sudo ip link set dev [ネットワークアダプタ名] mtu [設定したいMTUサイズ] ip コマンドを使う例 # 例 # ip a # ... # 4: vpn_vpnhome: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000 # link/ether 5e:76:29:d3:1b:85 brd ff:ff:ff:ff:ff:ff # inet 192.168.1.203/24 scope global vpn_vpnhome # valid_lft forever preferred_lft forever # sudo ip link set dev vpn_vpnhome mtu 1000 # ip a # ... # 4: vpn_vpnhome: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1000 qdisc fq_codel state UNKNOWN group default qlen 1000 # link/ether 5e:76:29:d3:1b:85 brd ff:ff:ff:ff:ff:ff # inet 192.168.1.203/24 scope global vpn_vpnhome # valid_lft forever preferred_lft forever 永続化設定(networkmanagerを使っているとき) sudo nmcli connection modify [ネットワークアダプタ名] 802-3-ethernet.mtu [設定したいMTUサイズ] # vpn_vpnhome の MTU サイズを 1000 に変更 # sudo nmcli connection modify vpn_vpnhome 802-3-ethernet.mtu 1000 追記 2025年8月1日 なんか何となくブックマークをあさっていたら、TU,MSS の計算と最適化の便利な手段をまとめるというサイトにたどり着いた。それで、さらにリンクをたどって、Visual packet size calculator — Daniil Baturinというところに行くと、こんな記述が目に止まった。 ...

July 21, 2025

Android アプリでネットワーク接続に対応するの続き 1

この記事を作った動機 Android アプリでネットワーク接続に対応する の続きの記事です。前の記事でやっていたことに関して、進展があったので、とりあえず忘れないうちに記録しようというわけです。 まあ、理解より先に動くことを試していたので、間違ったこととかも書いていること大いにあり得ます。これはあくまで自分の理解を深めるために記事として書いてしまおうという感じです。ご注意ください。(それは他の記事でも言えることですが。。。) コード 専用クラス(ViewModel)にて ... class smbOperation1 : ViewModel(){ private val userLiveData = MutableLiveData<String>() val user: LiveData<String> get() = userLiveData init { // trigger user load. } fun doAction() { viewModelScope.launch { val test = withContext (Dispatchers.IO) { testSMB() } userLiveData.value = test } } ... } アクティビティ内にて ... class shareFolderListActivity1 : AppCompatActivity() { // https://github.com/hierynomus/smbj private val smb by viewModels<smbOperation1>() override fun onCreate(savedInstanceState: Bundle?) { ... val debugTestStart = findViewById<Button>(R.id.debugTestStart) val debugText = findViewById<TextView>(R.id.resultAndDebugConsole) smb.user.observe (this){ message: String -> debugLog(message) debugText.setText(message) } debugTestStart.setOnClickListener{ smb.doAction() } } ... } わかったこと(現時点での理解) LiveData というのを使う方仕組みの方が新しいっぽい AsyncTask クラスとは異なる、kotlin 側で用意されたスレッド管理の仕組みを使う方が簡単そう LiveData UI と ViewModel クラス間におけるデータの橋渡し的なやり取りを行う。UIスレッド側で監視される変数的なものである。ViewModel クラスのインスタンスのうち、 LiveData に変更があり次第オブザーバー内に登録された処理が実行され、UIが更新される。 ...

June 21, 2025

Android アプリでネットワーク接続に対応する

この記事を作った動機 単に、ネットワークを使うだけで、パーミッション周りの設定と、UIスレッドと分離されたスレッドによる、非同期処理が必要なので、忘れる前に記録しておこうという話。 権限の設定(AndroidManifest.xml) android.permission.INTERNET の権限を追加 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> ... </manifest> 権限を許可したいときに確認すべきところ Manifest.permission | API reference | Android Developers https://developer.android.com/reference/android/Manifest.permission (2025年6月14日) 非同期処理(とりあえず動くというだけ kotlin) 本当のところは、AsyncTask は廃止なので java.util.concurrent を使うべきらしい。 参照すべきドキュメント AsyncTask | API reference | Android Developers https://developer.android.com/reference/android/os/AsyncTask (2025年6月14日) 専用にクラスを定義する package com.example.smbfileviewer import android.os.AsyncTask import android.util.Log import com.hierynomus.smbj.SMBClient import com.hierynomus.smbj.auth.AuthenticationContext import com.hierynomus.smbj.session.Session import com.hierynomus.smbj.share.DiskShare import com.hierynomus.smbj.share.Share class smbOperation(val handler: (message:String) -> Unit) : AsyncTask<Void,Void,Unit>(){ override fun doInBackground(vararg params: Void?): Unit { handler(testSMB()) } fun testSMB(): String{ val client = SMBClient() // 何かネットワークを使う処理をする // 今回は SMB ファイルサーバのライブラリを試すという前提で。 return "do something" } } 作ったクラスをボタンを押されたときとかに呼び出す // 何かのアクティビティクラスの onCreate 内などのUIの処理にて class shareFolderListActivity1 : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { val debugTestStart = findViewById<Button>(R.id.debugTestStart) debugTestStart.setOnClickListener{ val instance = smbOperation({ message -> debugLog(message) }) instance.execute() } } } 次の記事 Android アプリでネットワーク接続に対応するの続き 1 参考にしたサイトとか java - How can I fix ‘android.os.NetworkOnMainThreadException’? - Stack Overflow https://stackoverflow.com/questions/6343166/how-can-i-fix-android-os-networkonmainthreadexception (2025年6月14日) java - Permission for sockets - android manifest - Stack Overflow https://stackoverflow.com/questions/56582336/permission-for-sockets-android-manifest (2025年6月14日) Manifest.permission | API reference | Android Developers https://developer.android.com/reference/android/Manifest.permission (2025年6月14日) AsyncTask | API reference | Android Developers https://developer.android.com/reference/android/os/AsyncTask (2025年6月14日)

June 14, 2025