Linux nat/iptables はピアリンクチェーンを構成します。

Linux nat/iptables はピアリンクチェーンを構成します。

4台のLinux(CentOS)マシンを使って実験的な設定をしました。

https://i.stack.imgur.com/HLs9f.png

4つのシステムすべてが内部接続に異なるネットワークを使用し、互いに直接接続をpingできます。しかし、PC4だけがインターネットに接続できます。

PC1がPC4を介してインターネットにアクセスできるようにiptablesルールを設定しようとしていますが、どうすればよいかわかりません。

PC2、PC3、PC4の発信インターフェイスにNATを追加してみました。

iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

しかし、これはうまくいきません。いくつかのアイデアをいただけますか?このような設定でPC1に10.0.0.1ネットワークにアクセスさせるにはどうすればよいですか?

ベストアンサー1

まず、各PCは次のPCを内部パイプのゲートウェイとして使用する必要があります。

PC1# ip route add default via 1.1.1.2 # PC2's address where it can join PC1
PC2# ip route add default via 2.1.1.2 # PC3's address where it can join PC2
PC3# ip route add default via 3.1.1.2 # PC4's address where it can join PC3

そして、これがデフォルトパスなので、すべてのPCが次のPCに接続できることを意味します。したがって、すべてのPCが理論的にrp_filter¹有効になっていない場合は、次のPCとインターネットにパケットを送信できます。ただし、戻りパスはありません。

これを行うには、各PCが直接接続されていないすべての古いPCにアクセスできる必要があります。

PC1には移行がないので問題ありません。 PC2はPC1に直接接続されているため、まだ問題はありません。 PC3の場合は、PC2を介してPC1にルーティングする必要があります。

PC3# ip route add 1.1.1.1/? via 2.1.1.1 # PC1's network via PC2
# Fill the '?' according to PC1's network mask. it should include 1.1.1.2.

これで、PC3とPC1が互いにpingを送信できるようになりました。そうでない場合は、PC2で転送が有効になっていることを確認してください(両方のインターフェイスに対してsysctl -w net.ipv4.eth?.forwarding = 1)。このオプションは役に立たないので、PC1を除くすべてのPCにこのオプションが設定されていることを確認してください。

PC4 には PC3 を経由して PC2 と PC1 へのパスが必要です。

PC4# ip route add 1.1.1.1/? via 3.1.1.1 # PC1's network via PC3
PC4# ip route add 2.1.1.1/? via 3.1.1.1 # PC2's network via PC3

これで、すべてのPCがお互いにpingを送信できるようになります。そうでない場合は、設定をもう一度確認して転送が有効になっていることを確認してください。

今、インターネット接続がうまくいくでしょう。 PC4からインターネットにアクセスするためにNATが必要な場合は、ルーティングテーブルを変更せずにPC4でNATを設定します。

1はrp_filter一般的に便利なオプションですが、テストをより複雑にします。つまり、パケットを受け入れる前に、逆方向パスが正しいことを確認します。 ip 1.1.1.1 のパケットが eth0 で受信されると、1.1.1.1 が eth0 経由でルーティングされていることを確認します。それ以外の場合はパケットを拒否します。したがって、rp_filter部分的に設定された設定は許可されませんが、一度設定が完了すると有効になり、rp_filter正常に動作します。rp_filter一部のLinuxディストリビューションでは、セキュリティ対策としてデフォルトで有効になっています。

おすすめ記事