ルーティング テーブルにアクセスし、アクセスがあった場合に終了するまで監視を続ける VPN クライアントがあります。これは、ラップトップなどのエンドポイントに必要な設定です。
小型 PC を VPN エンドポイントとして使用し、LAN (192.168.0.0/24) 上の他のマシンにルーティングしたいと考えています。
ルーティング テーブルに触れることはできず、すべてのパケットが VPN デバイスを強制的に通過するため、 192.168.0.0 ネットワークへのパケットを POSTROUTE してデバイスに戻すことができるのではないかとtun0
考えていました。iptables
eth1
ただし、これがどのように機能するかはわかりません。なぜなら、いったん終了すると、eth1
宛先ネットワーク上にすでに存在するため、IPtoMAC を解決する必要があるからです。また、パケットがすでに解決されているか、iface に到達するまで解決されないかはわかりません。
何かヒントはありますか?
答え1
詳しい情報が提供されていないため、どのように回答するのが最善かわかりません。
そこで、ルーティング テーブルを変更できないことを意図的に無視して、いくつかの指示を与えることにしました (私の提案を読めばその理由がわかるでしょう)。
VPNクライアントとどこlocal
カーネルのFIB(フォワード情報ベース)にフックすると、FIBの監視、または式ルーティングテーブルを使用したVPNによる監視がルールテーブルとルールテーブルに対してのみ行われるという幸運に恵まれるかもしれませんmain
。ルーティングルールは、次の方法で確認できます。
ip rule show
タグ「lookup」の後ろの文字列(ルールテーブルエントリ)ごとに、FIBから対応するルーティング情報を照会できます。
ip route show table <name>
運が良ければ、要件に一致するルールを作成し、ルール検索テーブルで優先させることができます。たとえば (参考までに、私が作った例です)、main
特定のフローよりも高い優先度を持つ新しいルールを追加してみましょう。
ip rule add from 192.168.1.0/24 to 10.10.212.1/30 iif eth0 oif eth2 lookup 888 pref 12000
ip rule show
0: from all lookup local
12000: from 192.168.1.0/24 to 10.10.212.1/30 iif eth0 oif eth2 lookup 888
32766: from all lookup main
32767: from all lookup default
標準的な Linux (この記事の場合は Ubuntu) システムでは、、および の 3 つのデフォルト ルール テーブルが表示されますがlocal
、通常は、たとえば を呼び出すときにのみテーブルが表示されます。main
default
main
netstat -rn
ここで、ルックアップ テーブル 888 の FIB エントリに新しいルーティング エントリを入力します。
ip route add default via 10.37.129.4 dev eth2 table 888
テーブル 888 のルーティング エントリがどのようになっているかを見てみましょう。
ip route show table 888
default via 10.37.129.4 dev eth2
アイデアは理解できたと思います。では、具体的なルーティングのニーズに関しては、正確に何を達成しようとしているのかが不明です。ルール テーブルを操作するときは、ルーティング キャッシュをフラッシュするようにしてください。
ip route flush cache
iproute2アーキテクチャを使用すると、基本的に任意のFIBエントリをフィルタリングおよび変更できます。ルールエントリは、次のようにfwmarksやu32分類子に基づいて作成することもできます(例はポリシールーティングブック):
tc filter add dev eth1 parent ffff: protocol ip prio 1 u32 \
match ip src 10.1.1.0/24 classid :1
ip rule add fwmark 1 table 1 prio 15000 realms 3/4
ip route add default via 192.168.1.1 table 1 src 192.168.1.254
ip route flush cache
ルール テーブルのエントリがおかしくなった場合に備えて、何年も前に、システムを元のルーティング ルールの状態に戻すための小さな bash スニペットを用意しました。
: ${KEEP:="local main default"}
while read prio rule; do
continue=0
for keep in ${KEEP}; do
if [ "${rule//lookup ${keep}/}" != "${rule}" ]; then
continue=1
fi
done
if [ ${continue} -eq 0 ]; then
ip rule del prio ${prio%%:*} ${rule//all/0/0}
fi
done < <(ip rule show)
驚くべきことに、宇宙が誕生してから10年以上経った今でもiproute2
、古典宇宙を超えた宇宙が存在することを知っている人は少ないようです。"壊れた"ifconfig
またはのようなツールnetstat
。