2

専用のubuntuサーバーにファイアウォール(iptablesに基づく)があります。私はいくつかのLANクライアントを持っています。

LANクライアントの1つで、IPに基づいてアクセスを制限できるソフトウェアを実行しています。私にとって重要なのは、LANIPではなくWANIPを使用してそれを制限できることです。

ファイアウォールを構成して、1つのポートが正常に機能するLANクライアントに転送されるようにしました(解決策はstackoverflowで見つかりました)。これまでのところ問題はありません。

ただし、LANクライアントでは、外部送信者のIPは表示されませんが、転送が原因で、クライアントはパケットがLANサーバーから送信されていることを確認します。

問題は、サーバー上のポートを別のポートを持つ別のLAN IPに転送する方法ですが、LANクライアントがパケットの外部IPを認識できるようにする方法です。

それをより明確にしましょう:

サーバーLANIP:192.168.1.10サーバーポート:8080

転送先:クライアントLAN IP:192.168.1.20クライアントLANポート:8000

iptablesで私は持っています:

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8080 -d 192.168.1.10 -j DNAT --to 192.168.1.20:8000

iptables -A FORWARD -p tcp -d 192.168.1.20 --dport 8000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A POSTROUTING -p tcp --dport 8000 -d 192.168.1.20 -j SNAT --to 192.168.1.10

書かれているように、それは機能しますが、IP 88.77.66.55の誰かがパケットを送信すると、私のLANクライアント(192.168.1.20)は、パケットが私のLANサーバー(192.168.1.10)からのものであり、残念ながら88.77.66.55からのものではないことを認識します。

直せますか…?

4

3 に答える 3

5

最後のルールは MASQUERADE ルールと同じです。

例えば:

iptables -t nat -A ポストルーティング --out-interface eth0 -j マスカレード

MASQUERADE または SNAT を使用すると、ソース IP アドレスが最初のサーバーを通過する際に変更されます。2番目のサーバーはパケットを見て、その応答をそのIPに送り返し、それがクライアントに送り返されます。

ただし、サーバーはリクエストが 192.168.1.10 から送信されたと認識します。

クライアント > ゲートウェイ > iptables-router > サーバー (.10 を参照) > iptables-router > ゲートウェイ > クライアント

MASQUERADE/SNAT を削除すると、サーバーは実際の IP を認識しますが、サーバーが応答を送信すると、パケットはおそらくルーターまたはデータ センターのゲートウェイであるデフォルト ゲートウェイ (デフォルト ルート) に送信されます。クライアントは、知らない IP アドレスから応答を返し、それをどう処理するかわからないため、機能していないように見えます。または、ゲートウェイ/ルーターは、接続が関連付けられていない SYNACK を認識し、パケットをドロップします。

クライアント > ゲートウェイ > iptables-router > サーバー > ゲートウェイ (DROP) または > クライアント (DROP)

サーバーにクライアントの実際の IP を取得させたい場合、それを機能させる一般的な方法が 2 つあります。

  1. サーバーのゲートウェイ (デフォルト ルート) を iptables マシン (つまり、これらの iptables ルールを実行しているマシン) の IP アドレスに設定します。この場合、サーバーはすべての外部トラフィック (つまり、インターネットからのランダムな IP アドレスへの応答) を、応答を待っている iptables マシンの MAC アドレスに送信します。iptables はそれをクライアントに送り返します。Web サーバー マシンはiptables マシンの背後にあり、iptables マシンをルーターとして使用します。

クライアント > ゲートウェイ > iptables-router > サーバー (実際の IP) > iptables-router > ゲートウェイ > クライアント

  1. nginx のような HTTP プロキシを使用します。これは、現在動作しているのと同じように動作し、クライアントには内部 .10 アドレスのみが表示されます。ただし、これはプロキシであるため、クライアントの実際の IP アドレスを含む X-Original-IP-Address: 123.456.789.012 のような HTTP ヘッダーを送信できます。

クライアント > ゲートウェイ > iptables-router > サーバー (X-Original-IP ヘッダーを参照) > iptables-router > ゲートウェイ > クライアント

よろしく、 ニール

于 2013-06-14T20:12:25.113 に答える
2

{
送信元アドレス} - パケット送信者 (何らかのリモート アドレス)
{インターフェース アドレス} - パケット受信者 (ファイアウォール外部アドレス)
{ローカル アドレス} - パケット エンド ポイント受信者のローカル ネットワーク アドレス
{ローカル ゲートウェイ} - ファイアウォール ローカル アドレス
{proto block} - IP プロトコルの制限 (つまり、-p tcp -m tcp --dport xxxx)
1. クライアントにパケット ソースの IP アドレスを表示させたい場合は、次のようにします。

IPTABLES -t nat -A PREROUTING -s {source address} -d {interface address} {proto block} -j DNAT --to-destination {local address}
IPTABLES -A FORWARD -d {local address} -j ACCEPT

作ることを忘れないでください:

echo "1" > /proc/sys/net/ipv4/ip_forward

これにより、パケット転送が有効になります。
この場合、エンド ポイントには元の IP アドレスが表示されますが、デフォルト ゲートウェイに応答しようとします。このアドレスがローカル ネットワーク範囲にない場合は、次を追加します。

route add {source address} gw {local gateway}

これにより、エンドポイントに {local gateway} 経由で {source address} 宛てのパケットを送信する (または返信する) ように指示されます。
2. エンドポイントに元の IP アドレスが表示されないようにし、ルーティング テーブルを変更したくない場合は、次のように追加します。

IPTABLES -t nat -A POSTROUTING -s {source address} -j MASQUERADE

この場合、LAN クライアントには {local gateway} アドレスのみが表示されます。

いずれにせよ、ローカル ネットワークからリモート アドレスに送信されるすべてのパケットを次の方法でマスカレードすることを忘れないでください。

IPTABLES -t nat -A POSTROUTING !-d 192.168.0.0/16 -j MASQUERADE
  1. さらに処理するために送信元アドレスと宛先アドレスを保持したい。この場合、{ローカル ゲートウェイ} はパケット ルーティングの一部にすぎず、{ローカル アドレス} は単なるネクスト ホップである必要があります。これにはポリシー ルーティングを使用します。

まず、252 未満のタグを持つ独自のルーティング テーブルを/etc/iproute2/rt_tables

次に、{source address} のルールをルール セットに直接追加するか、{source address} からのパケットをマークします。どちらの方法でも、そのパケットのカスタム ルーティング テーブルを検索します。

ip rule add from {source address} table custom_table

また

iptables -t mangle -A PREROUTING -s {source address} -j MARK --set-mark 1
ip rule add fwmark 1 table custom_table

次に、これらのパケットの {ローカル アドレス} ネクスト ホップ ゲートウェイを作成します。

ip route add default via {local address} table custom_table

もちろん、POSTROUTINGチェーンはパケットが終了する直前に適用され、必要に応じて送信元アドレスを形成できます。

于 2013-11-13T11:26:31.240 に答える
0

最後のルールを削除するだけです(SNATは実行しないでください)。または、-o eth0条件を追加して、LANクライアントのマスカレードのみを割り当てるSNATを制限します(eth0が外部インターフェイスであると想定)。

iptables -t nat -A POSTROUTING -p tcp -o eth0 --dport 8000 -d 192.168.1.20 -j SNAT --to 192.168.1.10
于 2013-02-14T20:15:31.907 に答える