現在、Linux ルーターで作業していますが、希望どおりにファイアウォールを設定できません。
ルーターには 3 つのインターフェイスがあります。WAN はモバイル ブロードバンド プライベート サブネットで、172.18.15.0/24
安全ですが、信頼できないデバイス172.18.15.2
プライベート サブネットがあります。WAN は OpenVPN 経由でアクセスするためのもので、ルーターのデフォルト ゲートウェイです。10.0.0.0/24
ルーターの IP は172.18.15.1
とです。iptables では、ポートトラフィックを から に転送し、戻り時に MASQUERADE する10.0.0.1
DNAT ルールがあります。80
10.0.0.1
172.18.15.2
この部分は正常に動作します。
私が懸念しているのは、プライベート サブネットの誰かが を10.0.0.1
デフォルト ゲートウェイとして選択するか、172.18.15.0/24
経由するルートを作成する10.0.0.1
と、それが公開されてしまうことです。この動作を停止して、アドレスを経由する唯一の方法で Web に172.18.15.2
アクセスできるようにしたいと思います。172.18.15.2
10.0.0.1
転送をキャンセルすると、DNAT もキャンセルされるため、問題が発生します。
思いついた方法の 1 つは、Apache をインストールしてリバース プロキシを作成することです。ただし、それが正しい方法かどうかはわかりません。
ご提案ありがとうございます!
編集:
172.18.15.2
は単純なデバイスです。この場合は、自身のアドレスとゲートウェイのアドレスのみを持つことができます172.18.15.1
。/etc/sysctl.conf
net.ipv4.ip_forwarf=1
これはiptables-save -c
enp1s0 のダンプです。これは 10.0.0.0/24 のインターフェースです
。enp2s0 は 172.18.15.0/24 のインターフェースです
。wwx582c80139263 はモバイル ブロードバンド ゲートウェイのインターフェースです。
# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*filter
:INPUT ACCEPT [840:388180]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [643:92809]
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -j DROP
COMMIT
# Completed on Mon Apr 16 08:27:45 2018
# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*nat
:PREROUTING ACCEPT [10:648]
:INPUT ACCEPT [10:648]
:OUTPUT ACCEPT [11:770]
:POSTROUTING ACCEPT [11:770]
[0:0] -A PREROUTING -i enp1s0 -p tcp -m tcp --dport 80 -j DNAT --to-
destination 172.18.15.2:80
[0:0] -A POSTROUTING -s 172.18.15.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
COMMIT
# Completed on Mon Apr 16 08:27:45 2018
答え1
リバース プロキシ (X-Forwarded-For
ログ記録用にヘッダーを挿入する必要があります) を使用し、ネットワーク転送を削除するのが、クリーンなソリューションです。以下のソリューションは、iptables ルールのさらなる変更による予期しない影響を回避するために明確に理解する必要があります。
そうは言っても...
問題
- LAN
10.0.0.0/24
のノードは、少なくとも に到達するためには、Router をルーターとして使用してはなりません172.18.15.0/24
。ただし、そうするノードもあります。 - ルータは、DNATと転送を使用して、ノードに対して
172.18.15.0/24
( )にあるサービスを提供します。172.18.15.2:80
10.0.0.0/24
10.0.0.1
パケットがフィルター/FORWARD チェーンに到達すると、パケットが最初に宛先指定されてから DNAT されたのか、それとも直接送信されたのか(これは禁止されているはず)を区別する方法はあり172.18.15.2
ません。
ソリューション
したがって、NATが行われる前に分類を行う必要があります。これは、次のようにマングルテーブルで行われます。Netfilter と一般的なネットワークにおけるパケットフロー図式。この独自のルールで十分対応できます。
iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j DROP
しかし、通常は、よりよい管理のために、役割を分離する必要があります。つまり、変更 (削除ではない) またはここでマークする mangle と、フィルタリングして削除する filter テーブル (デフォルト) です。これは、mangle ステップでマークを使用し、filter ステップでドロップするこのマークと一致させることで可能です。つまり、次の式は同じです。
iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j MARK --set-mark 1
iptables -A FORWARD -m mark --mark 1 -j DROP
(そして本当に完全なものにするためには、iptables -A INPUT -m mark --mark 1 -j DROP
へのアクセスを防ぐこと172.18.15.1
)
どちらの方法も同じです。もちろん、保護する必要があるのが実際にデバイス 172.18.15.2 だけである場合は、-d 172.18.15.0/24
を に置き換えるだけです-d 172.18.15.2
。
更新: conntrack (NATのため既に使用されている) に依存するより簡単な方法を使用できます: クエリ接続トラックパケットが実際に DNAT されたかどうかを確認し、そうでない場合はドロップします。これは 1 つのルールのみで、フィルター/FORWARD チェーン内にあるため、物事が簡単になります。したがって、3 番目の方法として、上記のルールの代わりに次の方法があります。
iptables -A FORWARD -s 10.0.0.0/24 -d 172.18.15.0/24 -m conntrack ! --ctstate DNAT -j DROP
また、次の行は役に立たないので削除できます。PREROUTING は DNAT を使用して宛先を変更したため、フローは INPUT に到達せず、代わりに FORWARD チェーンを通過します。
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT