実際のIPを使用したテストVDSボックスがあります。物理インターフェイスポート80でWebサーバーを起動すると、そのIPアドレス(およびデフォルトのポート80)を介して別のコンピューターから開くことができます。
python -m SimpleHTTPServer 80
しかし、物理インターフェイスからポート80を再構築しようとすると、eth0
to loopback 127.0.0.1 port 8080 iは別のコンピューターからポート8080に接続できますが、ポート80には接続できません。これはエンドレスな「接続」です。リダイレクトが発生しないようです:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080
python -m SimpleHTTPServer 8080
私は何を間違っているのですか? :(
P.S. 「127.0.0.1:8080」でサーバーをバインドすると同じ結果が生成されますが、「0.0.0.0:8080」で実行されているサーバーは「127.0.0.1:8080」にリダイレクトされた接続を受け入れるため、問題ありません。私の知る限り。 :(
iptables -L
結果:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
iptables -t nat -L
結果:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:http to:127.0.0.1:8080
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
netstat -nlp
結果:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 676/sshd
tcp6 0 0 :::22 :::* LISTEN 676/sshd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 7964 600/acpid /var/run/acpid.socket
unix 2 [ ACC ] STREAM LISTENING 6590 1/init @/com/ubuntu/upstart
unix 2 [ ACC ] SEQPACKET LISTENING 6760 231/udevd /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 7030 345/dbus-daemon /var/run/dbus/system_bus_socket
ifconfig -a
結果:
eth0 Link encap:Ethernet HWaddr 00:16:3e:da:1a:98
inet addr:5.14.223.181 Bcast:5.14.223.255 Mask:255.255.255.0
inet6 addr: fe80::140:3eff:febe:201a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:371264 errors:0 dropped:59 overruns:0 frame:0
TX packets:2093 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:17377545 (17.3 MB) TX bytes:214428 (214.4 KB)
Interrupt:25
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:10 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:552 (552.0 B) TX bytes:552 (552.0 B)
私はしばらくの間この問題を解決しようとしてきましたが、最終的にサーバープロセスをローカルホストにバインドしないことに決めました(0.0.0.0:PORTを使用しました)が、しばらくの間、着信パケットが実際にどこに行くのかわかりませんでした正しいNATルールがあると思ったので。
答えは、カーネルがそれらを martian packet としてインターセプトし、それらをサイドに破棄していたことでした。
このサイト には、火星のパケットのロギングを設定するための非常に簡単な一連の手順があります。
別の解決策は、nginxをリバースプロキシとして使用することです。その場合、宛先ポートが80のパケットがiptablesファイアウォールを通過できるようにします(FILTERとNAT=ステージの間にドロップしていないことを確認してください-次のコマンドで確認できます。 Sudo iptables -t nat -L -v
またはSudo iptables -t filter -L -v
)。そこから、nginxはすべてのインターフェイスでポート80宛てのトラフィックをリッスンします。着信HTTPリクエストに関連するものを見つけたら、proxy_passディレクティブを使用して、nginxにこのリクエストをlocalhost:8080(127.0.0.1:8080)に転送させることができます。
@MonomiDevの投稿 here は、これを可能にする実際のnginx構成を提供します-そして、nginxがインストールされていない場合、ここにスタックとオンラインの両方でたくさんのチュートリアルがあり、開始しました。
ルールをこれに置き換えるだけです。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
動作するはずです。これにより、eth0上のすべての80ポートトラフィックが、Tomcatを実行しているlocalhostの8080ポートにリダイレクトされます。
Iptablesなしでこれを行うもう1つの方法(iptablesでそれが可能かどうかさえわからないため)は、xinetdサービスを使用することです。これを使用するには、マシンにxinetdをインストールします(通常、デフォルトでインストールされています)。次のようなファイルを作成します。
# vim /etc/xinted.d/Tomcat
このコンテンツをファイルに入れます:
service Tomcat
{
socket_type = stream
wait = no
user = root
redirect = 127.0.0.1 8080
bind = 10.31.33.101 80
}
Xintedサービスを再起動するだけです。
# service xinetd restart
そしてそれは魅力のように機能します。
これを行うとどうなりますか:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j REDIRECT --to-port 80 --match comment --comment "Explain."
このようなDNATルールを最後に使用したとき、POSTROUTINGにSNATルールを設定して、正しく機能させる必要がありました。