固定NATを生成しようとしてコマンドを実行するとip route add nat 172.31.19.02 via 10.0.2.2
エラーが発生しError: Invalid scope.
、グローバルスコープを指定しても同じエラーが発生します。上記の内容を再現しようとしています。状態非保存NATにiproute2を使用するページ。
私のネットワーク設定は、同じサブネット上の2つの物理インターフェイス(ens5、ens6)とMy Tinc VPN(VPN)用の仮想インターフェイスで構成されています。アドレス10.0.2.2はTincインターフェイスからアクセスできます。目標はからにトラフィックを転送すること172.31.19.02
です10.0.2.2
。
私が知る限りIPアドレスドキュメントページはglobal
「どこでも有効」でなければなりません。これは間違っていますか?
関連部分ip a
:
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether [...]
inet 172.31.19.01/20 brd 172.31.31.255 scope global ens5
valid_lft forever preferred_lft forever
[...]
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether [...]
inet 172.31.19.02/20 brd 172.31.31.255 scope global ens6
valid_lft forever preferred_lft forever
[...]
4: vpn: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 10.0.2.1/24 scope global homeforward
valid_lft forever preferred_lft forever
[...]
私のルーティングテーブル:
$ ip r
default via 172.31.16.1 dev ens5 proto static
10.0.2.0/24 dev homeforward proto kernel scope link src 10.0.2.1
172.31.16.0/20 dev ens6 proto kernel scope link src 172.31.19.02
172.31.16.0/20 dev ens5 proto kernel scope link src 172.31.19.01
$ ip r ls table 1000
default via 172.31.16.1 dev ens5 proto static
172.31.19.01 dev ens5 proto static scope link
$ ip r ls table 1001
default via 172.31.16.1 dev ens6 proto static
172.31.19.02 dev ens6 proto static scope link
答え1
LinuxのルーティングステートレスNAT(別名「IP NAT dumb」)は、次の簡単な理由で機能しなくなりました。マニュアルページ言う:
警告:ルーティングされたNATはLinux 2.6ではサポートされなくなりました。
だからこのような例これ:
[root@masq-gw]# ip route add nat 205.254.211.17 via 192.168.100.17 [root@masq-gw]# ip rule add nat 205.254.211.17 from 192.168.100.17 [root@masq-gw]# ip route flush cache [root@masq-gw]# ip route show table all | grep ^nat nat 205.254.211.17 via 192.168.100.17 table local scope host [root@masq-gw]# ip rule show 0: from all lookup local 32765: from 192.168.100.17 lookup main map-to 205.254.211.17 32766: from all lookup main 32767: from all lookup 253
もう動作しません。
この機能はカーネルに追加されました2.1.15(1996)とカーネル2.6.9から削除されました(2004)(しかし、おそらく以前のいくつかのカーネルかもしれません):
<[email protected]> [IPV4]: Kill remnant of ip_nat_dumb This line in net/ipv4/Makefile was left behind when the rest of the dumb NAT option was taken out. Signed-off-by: Herbert Xu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
これ説明する代替状態の非保存NATで提供されている場合は、次を使用します。tc nat
カーネル2.6.24に再追加されました:
以前は、IPv4ルーティングサブシステムに統合されたステートレスNAT機能がありました。 NATがサブネット間で動作するため、NATルールの数が比較的少ない場合、これは良い解決策です。その理由は、SNATの場合、ルートベースのシステムがルールを介して線形スキャンを実行する必要があるためです。
ルールの数が多い場合、これを実現するにはルーティングサブシステムを大幅に変更する必要があります。
TC
これは基本的な私が作ったDNATの例です。ステートレスNATを実行するためのインターフェイスは次のとおりです。ens5
(同じLANに2つのネットワークカードを持つ設定を使用しないでください。追加設定がないと、次の問題が発生します。ARPフラックスおよびリバースパスフィルタリング。追加のルーティングテーブルがあるので、すでに知っているようですが、この例を簡単に保ちましょう。そのテーブルのローカルアドレスは172.31.19.1と172.31.19.2です。どの入り口172.31.19.2へのトラフィックは、ターゲット10.0.2.2にDNATedされています。出口10.0.2.2 のトラフィックは送信元 172.31.19.2 に SNAT されます。いつものように、プリオキューディスク好みの属性のためではなく単純さのために使用してください。
tc qdisc add dev ens5 ingress
tc filter add dev ens5 ingress protocol ip matchall \
action nat ingress 172.31.19.2/32 10.0.2.2/32
tc qdisc add dev ens5 root handle 1: prio
tc filter add dev ens5 parent 1: protocol ip matchall \
action nat egress 10.0.2.2/32 172.31.19.2/32
netfilterのステートフル接続トレースと予期しない相互作用が発生する可能性があります。
nftables
nftablesを使用して同じことを行うこともできます。nftables wiki。
nft add table ip natdumb
nft add chain ip natdumb prerouting '{ type filter hook prerouting priority -350; policy accept; }'
nft add rule ip natdumb prerouting ip daddr 172.31.19.2 ip daddr set 10.0.2.2
nft add chain ip natdumb postrouting '{ type filter hook postrouting priority 350; policy accept; }'
nft add rule ip natdumb postrouting ip saddr 10.0.2.2 ip saddr set 172.31.19.2
同様に、netfilterのconntrackと対話することができます。 netfilter NATカーネルモジュールがロードされていない場合、または少なくとも現在の名前空間で有効になっている場合(代わりにすべての応答パケットをストリームとして処理している間)、動作させることができるすべてのnotrack
エントリを削除しました。気軽に試してみてください。notrack
NEW
ESTABLISHED
答え2
パスを追加すると、カーネルは同じデータリンク層(L2)接続でルーティングゲートウェイに直接接続できる必要があるため、より低い範囲で新しい範囲に到達できることを確認します。
この答え(https://superuser.com/a/1389304)では、この範囲の概念とそれを設定する理由/タイミングについて迅速かつ明確に説明しています。
これらのパスは、現在存在するサブネットをLinuxカーネルに通知する方法です。
IPアドレスを追加すると、この情報は非表示の現在のサブネットフィールドに保存されず、非表示の現在のサブネットフィールドに保存されます。代わりに、指定されたゲートウェイなしで常に「範囲リンク」パス(「デバイスパス」または「インターフェースパス」とも呼ばれます)に変換され、カーネルがアドレスに直接接続できるかどうかを確認する必要があるたびに単にパスを実行します。テーブルチェック。
通常、これらのルートは IP アドレスを設定すると自動的に追加されます。たとえば、ip addr add 192.168.1.5/24 を実行すると、IP アドレス 192.168.1.5 が割り当てられ、192.168.1.0/24 のサブネットパスが生成されます。したがって、一般的な使用中にこれらのパスを追加する必要はありません。
しかし、盲目的に「すべてのルートを削除」すると、自動的に生成されたルートも削除され、カーネルの「私のサブネット内のこのアドレスは何ですか?」確認はもう機能しません。これが最終的にパスを手動で追加する必要がある理由です。
(ルーティングゲートウェイ(次のホップ)は同じL2接続で直接接続でき、他のゲートウェイの背後にはないため、カーネルはIPパスの追加中にこの確認を実行する必要があります。つまり、ゲートウェイはサブネット上にある必要があります。
パス範囲は、これらの制限を表す一般的なメカニズムです。新しいルートのネクストホップは、より低い範囲の既存のルートを介して到達できる必要があります。つまり、リモートホスト(グローバルスコープ)に到達する前に、ローカルホスト(リンクスコープ)を通過する必要があります。 )
編集する:
しかし、それだけでは十分ではありません。テスト環境で実行しようとしましたが、これまでは成功しませんでした。Error: Invalid scope.
それも何度も起こっています。