iptables は、LAN 内にいるときは個人の Web サイトへのアクセスを許可しますが、LAN 外にいるときはアクセスをブロックします。

iptables は、LAN 内にいるときは個人の Web サイトへのアクセスを許可しますが、LAN 外にいるときはアクセスをブロックします。

私は透過プロキシを使用して、ソース (クライアント) から宛先 (サーバー) にリクエストを転送しています。透過ビットを機能させるために iptables を使用しています... つまり、リクエストが中間プロキシを通過した場合でも、クライアントの IP が宛先に表示されます... これは実際には SSLH と呼ばれます...https://github.com/yrutschle/sslh

ルールは次のとおりです。

iptables -w -t mangle -N SSLH
iptables -w -t mangle -A PREROUTING -p tcp -m socket --transparent -j SSLH
iptables -w -t mangle -A OUTPUT --protocol tcp --out-interface eth0 -m multiport --sport 80,443,4480 --jump SSLH
iptables -w -t mangle -A SSLH --jump MARK --set-mark 0x1
iptables -w -t mangle -A SSLH --jump ACCEPT
ip rule add fwmark 0x1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

私はプロキシと同じマシン上の Apache で Web サイトを実行しています。これは自宅の LAN 内にある Pi です。

その Apache 上の Web サイトにアクセスしようとして、リクエストが LAN 外部から発信された場合... たとえば、携帯電話で Wi-Fi ホットスポットに接続すると、ページがブラウザーに表示されますが、LAN Wi-Fi ネットワークに接続して同じページを開こうとすると、タイムアウトになります... これらの iptables ルールを無効にしない限り... ただし、これを行うと、LAN 外部から発信されたリクエストはタイムアウトになります。

少し複雑になるかもしれませんが、同じ Pi で実行されている dnsmasq を使用して NAT ループバックをシミュレートし、ローカル IP アドレスだけでなくドメイン名を使用して自分の LAN 内から Web サイトにアクセスできるようにします。

ウェブサーバーのローカルIPアドレスだけを使用すると、とにかく動作しません。

次のような Web リクエストが実行されるように iptables ルールを変更する必要がありますか?

https://www.example.com/test.html

LAN の外部でも内部でもページが表示されますか?

ありがとう、

フレックス

答え1

うまくいく解決策があります。

私の質問は...

次のような Web リクエストが実行されるように iptables ルールを変更する必要がありますか?
https://www.example.com/test.html
LAN の外部でも内部でもページが表示されますか?

私の iptables ルールは、LAN 内部からの接続要求をブロックしているようです。LAN 外部からの接続要求はルールが適用されていれば問題なく動作し、外部または内部からの接続要求はルールが完全にオフになっていると正常に動作するため、iptables ルールが原因であることは間違いないということ以外、正確な原因はまだわかりません。

ローカル LAN 上のすべての IP アドレスからの受信トラフィックと送信トラフィックを受け入れるルールを追加することを思いつきました。ルーターの DHCP サーバーは、192.168.1.1 から 192.168.1.200 の範囲で LAN 上のデバイスに IP アドレスを割り当てます。

192.168.1.0/24 を指定すると、その範囲内のすべての IP を参照できます。

私が現在使用しているルールは次のとおりです。

iptables -t mangle -N SSLH
iptables -t mangle -A INPUT -p tcp -s 192.168.1.0/24 -j ACCEPT
iptables -t mangle -A OUTPUT -p tcp -d 192.168.1.0/24 -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j SSLH
iptables -t mangle -A OUTPUT -p tcp --out-interface eth0 -m multiport --sport 80,443,4480 -j SSLH
iptables -t mangle -A SSLH -j MARK --set-mark 0x1
iptables -t mangle -A SSLH -j ACCEPT
ip rule add fwmark 0x1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

そして、私は次のようなURLを喜んでお伝えしますhttps://www.example.com/これは、LAN 上の Pi 上の個人用 Apache サーバー上の Web ページを指すもので、LAN の内外からページを要求した場合に、Web ページが開くようになりました。

元のルールが LAN 内から発信されたリクエストをブロックしていた理由を突き止めるために、次の変更を試みました。

iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j SSLH

に:

iptables -t mangle -A PREROUTING -p tcp -j SSLH

透過ソケットの一致は、SSLH を経由しないリクエストである非透過ソケットを無視するためです。ただし、ローカル IP アドレスからのトラフィックは依然としてブロックされていました。

このルールが原因である可能性が高いです... このルールは、Web サーバー (ポート 443) からのすべての送信パケットをユーザー定義チェーン SSLH に送信します。 このチェーン内のすべてのパケットはマークされ、その後のルールの助けを借りて、sslh プロキシによる処理のためにループバック インターフェイスにルーティングされます。

iptables -t mangle -A OUTPUT -p tcp --out-interface eth0 -m multiport --sport 80,443,4480 -j SSLH

しかし、これらのパケットが「着信」であり、そもそも宛先に到達するために SSL プロキシを通過せず、「発信」され、SSL によって処理されるためにループバック インターフェイスにルーティングされると、SSL はこれらのパケットをどう処理すればよいか分からず、単に失われるだけだと思います。この場合、これらのパケットはクライアントのブラウザーに Web ページを表示するために必要だったため、Web サイトはタイムアウトします。

乾杯、

フレックス

関連情報