web-dev-qa-db-ja.com

NATの後にソースIPを保持する

今日まで、私は安価なルーターを使用していたので、NATを使用しながらインターネット接続を共有し、Webサーバーもオンラインにしておくことができました。ユーザーIP($ _SERVER ['REMOTE_ADDR'])は問題ありませんでした。ユーザーのクラスA IPが表示されていました。

しかし、トラフィックが毎日増大するにつれ、私の古いルーターがトラフィックを維持できなくなったため、インターネット接続を共有するためにLinuxサーバー(Debian)をインストールする必要がありました。 NATを使用してIPTABLES経由でインターネットを共有しましたが、ポート80をWebサーバーに転送した後、実際のユーザーのIPではなく、ゲートウェイIP(Linux内部IP)がユーザーのIPアドレスとして表示されます。

この問題を解決するには?


投稿を編集したので、現在使用しているルールを貼り付けることができます。

#!/bin/sh
#I made a script to set the rules

#I flush everything here.
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables -F
iptables -X


# I drop everything as a general rule, but this is disabled under testing
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP


# these are the loopback rules
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# here I set the SSH port rules, so I can connect to my server
iptables -A INPUT -p tcp --sport 513:65535 --dport 22 -m state --state NEW,ESTABLISHED     -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 --dport 513:65535 -m state --state ESTABLISHED -j ACCEPT


# These are the forwards for 80 port
iptables -t nat -A PREROUTING -p tcp -s 0/0 -d xx.xx.xx.xx --dport 80 -j DNAT --to     192.168.42.3:80
iptables -t nat -A POSTROUTING -o eth0 -d xx.xx.xx.xx -j SNAT --to-source 192.168.42.3
iptables -A FORWARD -p tcp -s 192.168.42.3 --sport 80 -j ACCEPT

# These are the forwards for bind/dns
iptables -t nat -A PREROUTING -p udp -s 0/0 -d xx.xx.xx.xx --dport 53 -j DNAT --to 192.168.42.3:53
iptables -t nat -A POSTROUTING -o eth0 -d xx.xx.xx.xx -j SNAT --to-source 192.168.42.3
iptables -A FORWARD -p udp -s 192.168.42.3 --sport 53 -j ACCEPT


# And these are the rules so I can share my internet connection
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0:1 -j ACCEPT

MASQUERADEの部分を削除すると、PHPでエコーしながら実際のIPが表示されますが、インターネットがありません。ポートを転送しているときにインターネットを利用して実際のIPを確認するにはどうすればよいですか?

** xx.xx.xx.xx-は私のパブリックIPです。セキュリティ上の理由で隠しました。

5
John Miller

私自身の謎を解決しましたが、今まで助けてくれた方々に感謝します。 iptablesのmanページをもう少し調べて、私が望むように機能するように見える解決策に行きました:

[〜#〜] masquerade [〜#〜](iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE)を含む行を置き換えます次の行で:

iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o eth0 -j SNAT --to-source XX.XX.XX.XX

これで実際のIPアドレスを確認でき、インターネットも利用できます。

* XX.XX.XX.XX =パブリックIP

4
John Miller

マスカレードルール(-j MASQUERADE)。あなたが使っているのは「宛先ネットワークアドレス変換」(-j DNAT)、たとえば次のようなもの:

/sbin/iptables -t nat -A PREROUTING -p tcp -d {$PUBLICADDRESS} --dport 80 -j DNAT --to {$WEBSERVER}:80

もちろん、上記はルールの残りの部分に応じて機能する場合と機能しない場合があります。少なくとも、現在Webサーバーに関連するルールを使用して質問を更新する必要があります。

0
David Spillett