web-dev-qa-db-ja.com

iptablesを使用して別のIP:PORTに転送するようにハードコードされた特定のIPからIPへのトラフィックを構成する方法

残念ながら、特定のIPとポートを指すようにデバイスをハードコーディングしたクライアントがいます。トラフィックをIPからロードバランサーにリダイレクトし、HTTP POSTをそのリクエストを処理できるサーバーのプールに送信します。他のすべてのIPからの既存のトラフィックが影響を受けないようにしたい。

Iptablesがこれを達成する最良の方法であると私は信じており、このコマンドは機能するはずです。

/ sbin/iptables -t nat -A PREROUTING -s $ CUSTIP -j DNAT -p tcp --dport 8080 -d $ CURR_SERVER_IP --to-destination $ NEW_SERVER_IP:8080

残念ながら、期待どおりに機能していません。 POSTROUTINGチェーンに、別のルールを追加する必要があるかどうかわかりませんか?

以下では、上記の変数を実際のIPに置き換え、テスト環境でレイアウトを段階的に複製しようとしました。
$ CURR_SERVER_IP = 192.168.2.11
$ NEW_SERVER_IP = 192.168.2.12
$ CUST_IP = 192.168.0.50

  • 同じIPでポートフォワード

    / sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.11:8080

期待どおりに動作します。

  • IPとポートを別のマシンに転送する

    / sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080

接続がタイムアウトしたようです。

  • 特定のIPからのリクエストにのみ適用されるようにIPおよびポート転送を制限する

    / sbin/iptables -t nat -A PREROUTING -p tcp -s 192.168.0.50 -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080

@Massimoの提案に従ってACCEPTルールを追加しましたが、まだ成功していません。

新しく始めて、次のコマンドを実行しました。

# /sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080   
# iptables -A FORWARD -j ACCEPT

そして、ルールは次のようになります。

# iptables -L  -v --line-numbers  (see FORWARD rule 7)

Chain INPUT (policy ACCEPT 1115M packets, 889G bytes)  
num   pkts bytes target     prot opt in     out     source               destination           
1        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere            udp dpt:domain   
2        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere            tcp dpt:domain   
3        0     0 ACCEPT     udp  --  virbr0 any     anywhere             anywhere            udp dpt:bootps   
4        0     0 ACCEPT     tcp  --  virbr0 any     anywhere             anywhere            tcp dpt:bootps   

Chain FORWARD (policy ACCEPT 112 packets, 5936 bytes)  
num   pkts bytes target     prot opt in     out     source               destination           
1        0     0 ACCEPT     all  --  any    virbr0  anywhere             192.168.122.0/24    state RELATED,ESTABLISHED 
2        0     0 ACCEPT     all  --  virbr0 any     192.168.122.0/24     anywhere              
3        0     0 ACCEPT     all  --  virbr0 virbr0  anywhere             anywhere              
4        0     0 REJECT     all  --  any    virbr0  anywhere             anywhere            reject-with icmp-port-unreachable 
5        0     0 REJECT     all  --  virbr0 any     anywhere             anywhere            reject-with icmp-port-unreachable 
6        0     0 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED 
7        6   336 ACCEPT     all  --  any    any     anywhere             anywhere            

Chain OUTPUT (policy ACCEPT 813M packets, 428G bytes)
num   pkts bytes target     prot opt in     out     source               destination         

そして

# iptables -L -t nat -v --line-numbers
Chain PREROUTING (policy ACCEPT 3108K packets, 242M bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  any    any     anywhere             192.168.2.11 tcp dpt:16000 to:192.168.2.12:8080 

Chain POSTROUTING (policy ACCEPT 13M packets, 790M bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     8644 1979K MASQUERADE  all  --  any    any     192.168.122.0/24     anywhere            

Chain OUTPUT (policy ACCEPT 13M packets, 792M bytes)
num   pkts bytes target     prot opt in     out     source               destination         

http://192.168.2.11:160 にアクセスすると、ブラウザがタイムアウトするような明らかな問題が発生しますか?

ありがとう、

5
cclark

NATルールは問題ないようですが、このトラフィックにACCEPTルールも追加しましたか?

それ以外の場合、NATはうまく動作しますが、結果のパケットは静かにドロップされます...


更新:

このルールは、FORWARDチェーン(ファイアウォールを通過するがファイアウォールに直接関連しないパケットが処理される場所)で必要です。

FORWARDルールが適用されますafter PREROUTINGルール(NATなど)なので、このルールが適用されると、パケットは次のように表示されます。元のIPから送信されますが、変更された新しい宛先IPに送信されます。したがって、ルールは次のようになります。

/sbin/iptables -A FORWARD -s $CUSTIP -d $NEW_SERVER_IP -j ACCEPT
2
Massimo

Linuxボックスをルーターとして使用していて、このLinuxボックスが新しいIPを認識できると思います。

NATテーブルは、/ proc/sys/net/ipv4/ip_forwardが1に設定されている場合にのみ起動すると思います。これを永続的にするには、/ etc /sysctl.confに次の行を入力します。 :

net.ipv4.ip_forward = 1
1
Kevin M

(ここで最も深刻な問題の1つは、質問する方法がわからないことです。これにより、Serverfault.comはGuesswhatfault.comのようになります。)

あなたの質問では何も言われていないトポロジー、悲しいかな。サーバーがクライアントに到達できるかどうかはわかりません。実際には、クライアントは異なるサブネットにあります。クライアントは、サーバーの到達可能性が別の質問だと思いますか。 MASQUERADE/SNATを使用してクライアントのIPを変更したり、質問が実際に何であるかを説明する方法を少し考えたりすることができます。

1
poige

Dnatがループバックするのを防ぐsysctl設定があります。以下のeth0を外部インターフェイストラフィックが入ってくるように置き換えます。

それを許可するには

sysctl -w net.ipv4.conf.eth0.route_localnet=1

または

echo 1 > /proc/sys/net/ipv4/conf/eth0/route_localnet

と設定を確認します。

cat /proc/sys/net/ipv4/conf/eth0/route_localnet

これで、127.0.0.1にdnatできます

1
Pieter

私は同様の質問を投稿し、それに対する答えを自分で見つけました。ここにリンクがあります:-

iptablesを使用して、別のマシンで実行されているjBossサーバーにリクエストを転送する方法は?

0
CKing