私のLANのゲートウェイとして機能するLinuxシステムでは、iproute2を使用してトラフィックをルーティングしようとしました。さらに、ルーティングの前にNATを実行する必要があります。Linuxマシンはインターネット接続を許可するデバイスに接続されており、2つのIPアドレス172.16.61.1
と172.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 line
1 ルート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
何が起こるかというと
- 192.168.1.150をGWとして使用するPC(この投稿のPCオブジェクト)はインターネットに接続できます。
- 指示を削除しないと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 eth4
ORを使用してデフォルトの 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/24
、eth3
それを の背後にあるものにルーティングして NAT したいということですが、 の背後にあるものが正確に何であるか、DHCP を実行するかどうか、静的アドレスが必要かどうかはeth4
指定されていません。eth4
eth4
(通常は、 の背後に DHCP を実行し、アドレスを配布する何らかのルーターが存在します)。
まず、これを実現する通常の方法は、転送を有効にして
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
$EXTIF
は外部インターフェイス ( ) です。eth4
はMASQUERADE
にSNAT
あるアドレスと一致するeth4
ため、アドレスの再割り当てに対して耐性があります。 また、プロトコルを指定しない場合は、すべてが NAT 化されます。これは通常、望ましい動作です。
2番目に、テーブルベースのルーティングを行う理由はありません(説明していない追加の詳細がない限り)。したがって、テーブルについては忘れてください。また、背後にeth4
デフォルトルートのゲートウェイ情報を配布するDHCPがない場合は、次のようにします。
ip route default via 172.16.61.1
eth4
すでにアドレスを取得していると仮定すると172.16.61.*/24
、これで十分です ( 172.16.61.0/24
IP アドレスを設定するとルートも設定されます)。
しかし、ルーターで DHCP が有効になっている場合は、これを DHCP に任せるのが最善です ( BOOTPROTO=dhcp
Red 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