残念ながら、特定の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
/ sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.11:8080
期待どおりに動作します。
/ sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.12:8080
接続がタイムアウトしたようです。
/ 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 にアクセスすると、ブラウザがタイムアウトするような明らかな問題が発生しますか?
ありがとう、
NATルールは問題ないようですが、このトラフィックにACCEPTルールも追加しましたか?
それ以外の場合、NATはうまく動作しますが、結果のパケットは静かにドロップされます...
このルールは、FORWARDチェーン(ファイアウォールを通過するがファイアウォールに直接関連しないパケットが処理される場所)で必要です。
FORWARDルールが適用されますafter PREROUTINGルール(NATなど)なので、このルールが適用されると、パケットは次のように表示されます。元のIPから送信されますが、変更された新しい宛先IPに送信されます。したがって、ルールは次のようになります。
/sbin/iptables -A FORWARD -s $CUSTIP -d $NEW_SERVER_IP -j ACCEPT
Linuxボックスをルーターとして使用していて、このLinuxボックスが新しいIPを認識できると思います。
NATテーブルは、/ proc/sys/net/ipv4/ip_forwardが1に設定されている場合にのみ起動すると思います。これを永続的にするには、/ etc /sysctl.confに次の行を入力します。 :
net.ipv4.ip_forward = 1
(ここで最も深刻な問題の1つは、質問する方法がわからないことです。これにより、Serverfault.comはGuesswhatfault.comのようになります。)
あなたの質問では何も言われていないトポロジー、悲しいかな。サーバーがクライアントに到達できるかどうかはわかりません。実際には、クライアントは異なるサブネットにあります。クライアントは、サーバーの到達可能性が別の質問だと思いますか。 MASQUERADE/SNATを使用してクライアントのIPを変更したり、質問が実際に何であるかを説明する方法を少し考えたりすることができます。
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できます
私は同様の質問を投稿し、それに対する答えを自分で見つけました。ここにリンクがあります:-