NATの背後にあるサーバーへのSSHトンネルを実行しようとしています。
ラップトップからssh->ファイアウォールでポート転送を行うホスト->ゲストに直接アクセスします(ホストNATの背後にある172.16.0.2)。
ホストでiptablesを使用する-動作します:
# iptables -I OUTPUT -d 0.0.0.0/0 -j ACCEPT
# iptables -I FORWARD -d 0.0.0.0/0 -j ACCEPT
# iptables -I INPUT -d 0.0.0.0/0 -j ACCEPT
# iptables -t nat -I PREROUTING -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22
ただし。firewalldサービスが実行されているため、ホストの再起動時にiptablesは保存されません(firewalldはRHEL 7のデフォルトです)。
だから私は同じことをしようとしていますfirewall-cmdによるポート転送。
ホストでfirewall-cmdを使用-機能しません:
# firewall-cmd --permanent --zone=public --add-forward-port=port=222:proto=tcp:toport=22:toaddr=172.16.0.2'
# firewall-cmd --permanent --zone=public --add-masquerade
# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -d 0.0.0.0/0 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -d 0.0.0.0/0 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -d 0.0.0.0/0 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22
# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" forward-port port="222" protocol="tcp" to-port="22" to-addr='"172.16.0.2"
# firewall-cmd --reload
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp4s0f0
sources:
services: ssh dhcpv6-client
ports: 8139/tcp
protocols:
masquerade: yes
forward-ports: port=222:proto=tcp:toport=22:toaddr=172.16.0.2
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" destination address="0.0.0.0/0" forward-port port="222" protocol="tcp" to-port="22" to-addr="172.16.0.2"
# firewall-cmd --direct --get-all-rules
ipv4 filter INPUT 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 filter OUTPUT 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 filter FORWARD 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 nat PREROUTING 0 -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22
これで、ゲストに接続しようとすると-私のラップトップから、ホストポート222を介して-ssh接続が拒否されます。
ssh -l stack my-Host -p 222
ssh: connect to Host my-Host port 222: Connection refused
私は何が欠けているのですか?
あなたは試すことができますfirewall-cmd --add-forward-port
:
firewall-cmd --permanent --add-forward-port=port=222:proto=tcp:toaddr=172.x.x.x:toport=22
firewall-cmd --reload
一般的な構文( https://firewalld.org/documentation/man-pages/firewall-cmd.html ):
firewall-cmd [--permanent] [--zone=zone] \
--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] \
[--timeout=timeval]
個人的に同様の問題に直面しており、この解決策が私の助けになりました。試してみて、役に立ったかどうかをお知らせください。
NATの背後にあるサーバーにアクセスする方法はいくつかあります。ポート転送、受信トラフィックを内部サーバーに転送するようにルーター/ファイアウォールを構成できます。通常、プロトコル(UDP/TCP)、外部サービスポート、内部サービスポートを指定する必要があります。
Firewall-cmdを使用したSSHポート転送については、次のコマンドを試してください。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 222 -j DNAT \--to 172.x.x.x.:22
与えられたコードから、私はこれがあなたが達成しようとしているものであることを理解しています。必ずポートを確認してください。私の場合、ポート80で同じことを試しました。
このルールは、NATテーブルを指定して、組み込みのPREROUTINGチェーンを使用して、リストされた宛先IPアドレスに排他的に着信HTTP要求を転送します
「症状」とあなたが提示するデータは、「デフォルトネットワーク」でKVM(libvirt)を使用して経験したものと非常に似ています。このため、以下の答えが非常に適切です...
KVM(libvirt)with "default network"(virbr0)を使用してポート転送を行うことができる「唯一の」方法は、@ Antony Nguyenによって通知されたハック/回避策を使用することです。 libvirt-hook-qem を使用できます。
このスレッドには、libvirt-hook-qemu: https://superuser.com/a/1475915/19584 を使用して、CentOS 7(および他のディストリビューション)でこの問題を解決する方法の完全な説明があります。
あなたの問題はfirewall-cmdコマンドの問題ではないようですが、OpenStackと何か関係がありますか?
参考までに、私は最終的な応答(James Slagle、おそらく this one )を Bugzillaレポート に投稿します-誰かを助けるために:
Ericが提案したように、この問題はOSPの展開に関連しているため、バグの所有者がTripleOに変更されます。
OSP 14以降に影響することが知られていることに注意してください。
いいえ、私がバグをどのように解釈したかでは、これは正しくありません。 undercloud-0というvmをホストしているホスト(titan08)にファイアウォールルールを追加しようとしています。
undercloud-0は、OpenStackがインストールされている場所です。しかし、物理ホスト自体(titan08)で行われたOpenStack rpmまたは構成はありません。
その場合、これは完全に物理ホストのファイアウォールの構成に関するものであり、OpenStack vmに関するものではないようです。
Ericが指摘したように、firewalldで追加しようとしているルールは、物理ホスト(titan08)に保存されません。
私の理解は正しいですか?
VMにOpenStackをインストールしても、物理ホスト自体は変更されません。