NAT 後の iproute2 を使用したルーティング

NAT 後の iproute2 を使用したルーティング

私のLANのゲートウェイとして機能するLinuxシステムでは、iproute2を使用してトラフィックをルーティングしようとしました。さらに、ルーティングの前にNATを実行する必要があります。Linuxマシンはインターネット接続を許可するデバイスに接続されており、2つのIPアドレス172.16.61.1172.16.62.100

次の構成のネットワーク カードを 2 枚持っています。

DEVICE=eth3
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=192.168.1.150
USERCTL=no
IPV6INIT=no
PEERDNS=yes  

DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes
GATEWAY=172.16.61.1

そして、iptables経由のIP変換には以下の手順を使用します

/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -j SNAT --to-source 172.16.61.2  

上記の構成を使用すると、192.168.1.150 をゲートウェイとする 192.168.1.0/24 ネットワークに属するすべてのコンピューターがインターネットに接続できるようになります。

iproute2 を使用してゲートウェイを設定しようとすると、次の設定を前提として eth4 からデフォルト ゲートウェイが削除されます。

DEVICE=eth4
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=172.16.61.2
USERCTL=no
IPV6INIT=no
PEERDNS=yes

そして、次の手順を実行しました。

1. In /etc/iproute2/rt_tables I have added the line1 ルート61
2. /sbin/ip route add 172.16.61.0/24 via 172.16.61.1 table route61 proto static
3. /sbin/ip route add default via 172.16.61.1 table route61 proto static
4. /sbin/ip rule add from 172.16.61.0/24 pref 15000 table route61

の出力/sbin/ip route show table route61

172.16.61.0/24 via 172.16.61.1 dev eth4  proto static  
default via 172.16.61.1 dev eth4  proto static   

の出力/sbin/ip rule show

0:      from all lookup local 
15000:  from 172.16.61.0/24 lookup route61 
32766:  from all lookup main 
32767:  from all lookup default

しかし、この場合は機能しません。何が間違っているのでしょうか?

私も試してみました/etc/sysconfig/network-scripts/ifup-routes eth4が、うまくいきませんでした

私が必要としているのは、複数のゲートウェイがあるコンテキストで「テーブルベースのルーティング」を使用する必要があるため、なぜ「テーブルベースのルーティング」が機能しないのかを理解することです。

アップデート

dirktの提案を試すために、デフォルトゲートウェイを削除しました

route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4

そして私は以下を使用しました:

ip rule add from 192.168.1.0/24 pref 15000 table route61

何が起こるかというと

  1. 192.168.1.150をGWとして使用するPC(この投稿のPCオブジェクト)はインターネットに接続できます。
  2. 指示を削除しないとGWに接続できなくなりますip rule add from 192.168.1.0/24 pref 15000 table route61

ポストルーティングでは、192.168.1.0/24 から送信されるパケットは、送信元アドレスとして 172.16.61.2 を想定しないのでしょうか?

route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4ORを使用してデフォルトの GW を使用したり削除したりする場合route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4、次の操作を実行します。

ip route get 216.58.205.78 from 192.168.1.5

私は持っているRTNETLINK answers: Invalid argument

ip route get 216.58.205.78 from 172.16.61.2私が使用する場合216.58.205.78 from 172.16.61.2 via 172.16.61.1 dev eth4

私がそうした後route add -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4

nc -v 216.58.205.78 443

私は持っている

Connection to 216.58.205.78 443 port [tcp/https] succeeded!

デフォルトの GW を削除すると、route del -net 0.0.0.0 gw 172.16.61.1 netmask 0.0.0.0 dev eth4ソース IP を指定した場合にのみ nc が接続されます。

nc -v 216.58.205.78 443 -s 172.16.61.2

答え1

私の理解が正しければ、 があり192.168.1.0/24eth3それを の背後にあるものにルーティングして NAT したいということですが、 の背後にあるものが正確に何であるか、DHCP を実行するかどうか、静的アドレスが必要かどうかはeth4指定されていません。eth4

eth4(通常は、 の背後に DHCP を実行し、アドレスを配布する何らかのルーターが存在します)。

まず、これを実現する通常の方法は、転送を有効にして

iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

$EXTIFは外部インターフェイス ( ) です。eth4MASQUERADESNATあるアドレスと一致するeth4ため、アドレスの再割り当てに対して耐性があります。 また、プロトコルを指定しない場合は、すべてが NAT 化されます。これは通常、望ましい動作です。

2番目に、テーブルベースのルーティングを行う理由はありません(説明していない追加の詳細がない限り)。したがって、テーブルについては忘れてください。また、背後にeth4デフォルトルートのゲートウェイ情報を配布するDHCPがない場合は、次のようにします。

ip route default via 172.16.61.1

eth4すでにアドレスを取得していると仮定すると172.16.61.*/24、これで十分です ( 172.16.61.0/24IP アドレスを設定するとルートも設定されます)。

しかし、ルーターで DHCP が有効になっている場合は、これを DHCP に任せるのが最善です ( BOOTPROTO=dhcpRed Hat の場合は になると思います)。


問題がポリシールーティングである場合: から入ってくるパケットを192.168.1.0/24テーブル内のデフォルトルート経由でルーティングしたいroute61ので、次のようにする必要があります。

ip rule add from 192.168.1.0/24 pref 15000 table route61

そして、そうではありませんfrom 172.16.61.0/24

とはいえ、NATがポリシールーティングとどのように相互作用するかはよく分かりません。仮定する返されるパケットは最初に deNAT され、その後メイン テーブルのルールによって正しくルーティングされますが、私は自分で試したことはありません。

デバッグするには、すでに言及した他の質問で行ったように、両方のインターフェースで実行するip route get X.X.X.X from Y.Y.Y.Yのが役立つ場合があります。tcpdump

最初にテーブルなしで試してみるのも簡単です。それがうまくいけば、他に邪魔になるものがないことがわかるので、テーブルを使って試すことができます。

答え2

新しいルーティング テーブルを使用して、接続されたルートも追加する必要があります。代わりにソース IP を指定する172.16.61.0/24 via 172.16.61.1 dev eth4 proto static必要がありproto scope link、192.168.1.0/24 ルートが欠落しています。ルーティングの決定は出力/ポスト ルーティング NAT の前に実行されるため、ip rule add from元のソース IP を使用する必要があります。 画像

# Configure tables
echo '2 table61' >> /etc/iproute2/rt_tables 
echo '3 table62' >> /etc/iproute2/rt_tables 

# routing decision is performed before output / post routing nat
ip rule add from 192.168.1.5 lookup table62
ip rule add from 192.168.1.0/24 lookup table61

ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table61
ip route add 172.16.61.0/24 dev eth4 proto kernel scope link src 172.16.61.2 table table61
ip route add default via 172.16.61.1 table table61

ip route add 192.168.1.0/24 dev eth3 proto kernel scope link src 192.168.1.150 table table62
ip route add 172.16.62.0/24 dev eth4 proto kernel scope link src 172.16.62.100 table table62
ip route add default via 172.16.62.254 table table62

また、私の頭の中であなたの質問が混同されている可能性があります。すぐにうまくいかない場合は、質問に次の内容を追加していただけますか?

ip a
ip r show table table61
ip r show table table62
ip rule show
iptables -L -n -v
iptables -t nat -L -n -v

関連情報