____________________________ ____________________________
| Host | | Client |
| Public IP: 66.66.66.66 | | |
| Internal IP: 10.0.3.1 | <---------> | Internal IP: 10.0.3.192 |
---------------------------- ----------------------------
veth
ネットワークオプションで始まりました。ufw
で構成され、それぞれのポートが開かれてクライアントに転送されます。これは機能します。/etc/ufw/before.rules
でのiptables
ポート転送:
# nat Table rules
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.192:80
-A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.192:443
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
ホスト上の/etc/network/interfaces
:
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 66.66.66.66
netmask 255.255.255.0
network 66.66.66.0
broadcast 66.66.66.255
gateway 66.66.66.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 8.8.8.8
/etc/network/interfaces
クライアント:
# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.0.3.192
netmask 255.255.255.0
gateway 10.0.3.1
broadcast 10.0.3.255
クライアントからのポートスキャン
Starting Nmap 5.21 ( http://nmap.org ) at 2014-04-18 18:46 CEST
Nmap scan report for 66.66.66.66
Host is up (0.00011s latency).
PORT STATE SERVICE
80/tcp closed http
443/tcp closed https
「外部」からのポートスキャン
Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-18 19:54 CEST
Nmap scan report for 66.66.66.66
Host is up (0.41s latency).
PORT STATE SERVICE
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 Host up) scanned in 1.28 seconds
iptables構成:
$ iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:http to:10.0.3.192:80
DNAT tcp -- anywhere anywhere tcp dpt:https to:10.0.3.192:443
DNAT tcp -- anywhere anywhere tcp dpt:43211 to:10.0.3.192:22
DNAT tcp -- anywhere anywhere tcp dpt:http-alt to:10.0.3.192: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
MASQUERADE tcp -- anywhere 10.0.3.192 tcp dpt:http
MASQUERADE tcp -- anywhere 10.0.3.192 tcp dpt:https
MASQUERADE all -- 10.0.3.0/24 !10.0.3.0/24
パブリックIPを介して、クライアント自体からクライアントのポート80でWebサーバーにアクセスしたい。
$ curl http://66.66.66.66
curl: (7) couldn't connect to Host
と同じ結果が得られるはずです
$ curl http://10.0.3.192
<html>.....
不思議なことに、プライベートネットワーク内のクライアントからの$ ping 66.66.66.66
は機能します。
この問題は、いわゆる Hairpin NAT/Loopback NAT )に非常に関連していることがわかりますが、次のルールでマスカレードを構成することはできませんでした。動作します(PREROUTING
エントリの後の/etc/ufw/before.rules
内):
# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -d 10.0.3.192 -p tcp --dport 80 -j MASQUERADE
-A POSTROUTING -o eth0 -d 10.0.3.192 -p tcp --dport 443 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT
解決策に対する私の推測は、ブリッジされたネットワーク、またはMASQUERADEルールをセットアップに正しく適合させることができないことが問題であるということです。セットアップ全般に対する提案やコメントは大歓迎です。
(最初に書いたのは、ブリッジネットワークではなくルーテッドネットワークです。現在、LXCを使用していることがわかりますので、よくわかりません。ただし、PREROUTINGが既に機能している場合は、以下に記述した内容が機能することを願っています)
PREROUTINGチェーンを使用している場合、このチェーンは、ルーティングされたパケット(つまり、別の場所から送信されたパケット)のみを変更します。 Hostで生成されたパケット自体はルーティングされないため(他のホストが実行できるように、出力は問題ありません)、このチェーンはcurlのパケットを受信しません。 curlは、いつものようにHostに接続しようとしました。ローカルで生成されたパケットをキャッチする他のチェーンがあります:OUTPUT。
したがって、いくつかの変更を加えて、DNATルールを(-t nat)OUTPUTチェーンにも複製します。OUTPUTは入力インターフェイスを必要としません。 -i eth0
を-o lo ! -s 127.0.0.0/8
または単に-d 66.66.66.66
などに置き換えますが、制限が必要です。それ以外の場合、どこへのWebリクエストもClientに送信されます。最初の例はHostのIPから独立しており、2番目の例は必要に応じて短くなっています。これはタイプミスではありません。それ自体から66.66.66.66に接続する場合、それはローカルパケットであるため、lo
インターフェイスを経由します。ただし、127.0.0.1のような宛先は再ルーティングできないため(curl http://127.0.0.1/
は接続できなかったと言う代わりにタイムアウトします)、127.0.0.0/8は例外として配置されます。
以上です。それ以外はすべてconntrackによって通常どおり処理されます。 2ポート固有のMASQUERADEルールを削除する必要があります。それらは必要ではなく、干渉することさえあります(それらが機能する場合、結果はクライアントは常にホストをWebサーバー上のソースとして見ることになります)
したがって、簡単な答えは(-t natを使用)です。
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.192
-A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.192
-A OUTPUT -o lo ! -s 127.0.0.0/8 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.192
-A OUTPUT -o lo ! -s 127.0.0.0/8 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.192