「ip」コマンドを使用してパスを生成するときにグローバルスコープが無効であるのはなぜですか?

「ip」コマンドを使用してパスを生成するときにグローバルスコープが無効であるのはなぜですか?

固定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エントリを削除しました。気軽に試してみてください。notrackNEWESTABLISHED

おすすめ記事