web-dev-qa-db-ja.com

netfilterDNATルールはローカルトラフィックでは機能しません

ファイアウォールの背後に隠されたWebサーバーがあります。私のファイアウォールのDNATルールは、インターネットからの訪問者がファイアウォールに到達できるようにします。このルールは、インターネットからのトラフィックに対して機能します。残念ながら、実際の宛先と同じサブネットからのトラフィックに対しては機能しません(または部分的にのみ機能します)。何らかの理由で、netfilterは元の宛先アドレスを復元しないため、クライアント/送信者は応答パケットを無視します。

私は何が間違っているのですか?

ネットワークレイアウト

192.168.101.0/24  # LOCAL Lan

192.168.101.16  # Client
192.168.101.18  # Server
192.168.101.254 # firewall
144.256.256.1   # firewall (Not the real IP)


          (Internet)
      | 144.256.256.1 |
              |       |
      |   Firewall    |
              |       |
      | 192.168.101.254 |
              |
              |
    ----------------------
    |                     |
192.168.101.16        192.168.101.18
  (Client)            (Server)

iptablesルール

-t nat -A PREROUTING -d 144.256.256.1 --dport 81 -j DNAT destination 192.168.0.2
-t nat -A POSTROUTING -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MASQUERADE (Should be irrelevant)

Szenarioが機能しない

(Client) 192.168.101.16 trying to reach (Server) 144.256.256.1/81

ファイアウォール上のtcpdump

192.168.101.16.57631 > 144.256.256.1.81: Flags [S], seq 1884612678 
192.168.101.16.57631 > 192.168.101.18.81: Flags [S], seq 1884612678 
192.168.101.16.57631 > 144.256.256.1.81: Flags [S], seq 1884612678 
192.168.101.16.57631 > 192.168.101.18.81: Flags [S], seq 1884612678
(Seems okay. tcpdump was on -i any. Incoming packet to orginal destination 144.xx Outgoing packet to new destination. But for some reason we're not seeing the responses)

宛先(サーバー)のtcpdump

IP 192.168.101.16.57874 > 192.168.101.18.81: Flags [S], seq 4243879528,
IP 192.168.101.18.81 > 192.168.101.16.57874: Flags [S.], seq 595099059, ack 4243879529,
IP 192.168.101.16.57874 > 192.168.101.18.81: Flags [R], seq 4243879529, win 0, length 0
(Seems good)

ソース(クライアント)のtcpdump

IP 192.168.101.16.57874 > 144.256.256.1.81: Flags [S], seq 4243879528
IP 192.168.101.18.81 > 192.168.101.16.57874: Flags [S.], seq 595099059, ack 4243879529, (WTF packet. The source should be 144.x again. For some reason netfilter didn't restore the orignal destination address for the response packet.)
IP 192.168.101.16.57874 > 192.168.101.18.81: Flags [R], seq 4243879529
1
Thorsten

ファイアウォールには応答パケットがないため、応答パケットは表示されません。クライアントは同じサブネットにあるため、サーバーはファイアウォールに応答を送信しません。

リクエスト:クライアント->ファイアウォール->サーバー

返信:サーバー->クライアント

したがって、クライアントはサーバーからではなくファイアウォールからの応答を期待しているため、応答を破棄します。

クレイジーなルーティングマジックを試すか、クライアントのhostsファイルでURLの内部IPを設定してください。または、NATをすべて削除します...

3
nerdlich