この問題を解決するには、 iptablesとルーティングルールの両方を設定する必要があります。発生している特定の問題は、発信SSHパケットがイーサネットインターフェイスではなく匿名VPNトンネルインターフェイス経由でルーティングされていることです。これは、VPNソフトウェアがルーティングルールを設定して、未処理のトラフィックをすべてトンネルインターフェース経由で送信するために発生します。ネットワークトラフィックの匿名化に適しています。お使いのコンピューターへのSSH接続を確立するための悪い。
この問題を解決する方法はいくつかありますが、同じ状況で私のために機能した方法を紹介します。これが私たちがする必要があることです:
- 非VPNトラフィックを処理する新しいIPルールテーブルを作成する
- IPルールを追加して、特定のnetfilterマスクでマークされたパケットのVPNなしテーブルを検索します
- トンネルの代わりにイーサネットインターフェイスを使用するように、VPNなしのテーブルのすべてのトラフィックを転送するIPルートを追加します
- iptablesルールを追加して、指定したnetfilterマスクですべてのSSHトラフィックをマークします
注:私は以下を実行しているときにRaspbianで作業していたため、ディストリビューションに合うようにコマンドを少し調整する必要があるかもしれません。
新しいIPルールテーブルの作成
まず、iproute2のテーブル定義ファイルを調べます。既存のルールテーブルの名前または数を使用しないようにしたいと思います。
cat /etc/iproute2/rt_tables
あなたはおそらくこれらの線に沿って何かを見るでしょう:
# reserved values
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
新しいルールテーブルの任意の番号と名前を選択します-上記で使用されていないもの。novpn
この回答の残りの部分では、201番と名前を使用します。
定義を定義ファイルに直接追加するか、任意のテキストエディターで編集します。
echo "201 novpn" >> /etc/iproute2/rt_tables
新しいIPルールを追加して、VPNなしのテーブルを検索します
netfilterマスクを処理する既存のIPルールを確認します。
ip rule show | grep fwmark
grepで何も表示されない場合、問題はありません。一部の行が表示される場合はfwmark
、各行の単語の右側にある16進数を書き留めてください。現在使用されていない番号を選択する必要があります。既存のfwmarkルールがなかったので、65を選択しました。
ip rule add fwmark 65 table novpn
これにより、netfilterマスク65を持つすべてのパケットはnovpn
、パケットのルーティング方法に関する新しいテーブルを検索します。
新しいテーブルのすべてのトラフィックにイーサネットインターフェイスを使用するように指示する
ip route add default via YOUR.GATEWAY.IP.HERE dev eth0 table novpn
ここで注意すべき重要な点はdev eth0
です。これにより、novpn
テーブルを通過するすべてのトラフィックは、VPNが作成する仮想トンネルインターフェイスではなく、ハードウェアイーサネットインターフェイスのみを使用するようになります。
今度は、iprouteキャッシュをフラッシュして、新しいルールとルートがすぐに有効になることを確認する良いタイミングです。
ip route flush cache
指定されたnetfilterマスクですべてのSSHトラフィックをマークするようにファイアウォールルールに指示します
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65
オプションが多すぎて、詳しく説明できません。iptablesのマニュアルページを読んで、ここで何が起こっているのかを理解することを強くお勧めします。
man iptables
簡単に言うと、ファイアウォールのマングルテーブル(特殊なパケット処理用)に出力ルールを追加して、指定されたnetfilterマスク65でソースポート22から発信されたTCPパケットをマークするように指示します。
次は何?
この時点で、SSHをテストする準備ができているはずです。すべてがうまくいけば、「login as」というプロンプトが表示されます。
セキュリティ上の理由から、トンネルインターフェイスからの着信SSH要求をすべてドロップするようにファイアウォールに指示することをお勧めします。
iptables -A INPUT -i tun0 -p tcp -m tcp --dport 22 -j DROP
上記のすべての手順は一時的なものであることに注意してください(ルールテーブルIDの作成を除く)。次回コンピューターを再起動したときにクリアされます。それらを永続的にすることは、私があなたに残した課題です。