これが私のシナリオです。私は3つのホストを持っています。
1)OpenVPNサーバーを実行しているゲートウェイ。 1つのLAN IP(192.168.1.10)と1つのOpenVPN IP(10.8.0.1)があります。
2)LOCAL-CLIENT、GATEWAYと同じLAN内のマシン、1つのLAN IP(192.168.1.12)
3)REMOTE-SERVER、OpenVPNサーバーのクライアントであるMySQLサーバー。 1つのパブリックIPと1つのOpenVPN IP(10.8.0.51)があります。
VPNを介してLOCAL-CLIENTからREMOTE-SERVER上のMySQLに接続できるようにしたい。
これまでのところ、IP転送を有効にし、次のようにポート転送を追加しました。
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A OUTPUT -p tcp --dport 3306 -j DNAT --to 10.8.0.51
これはゲートウェイから機能し、ホストとして192.168.1.10を使用してMySQLに接続できます。しかし、LOCAL-CLIENTから試行すると、「MySQLクライアントまたはポート3306へのtelnetを使用して」「接続拒否」エラーが発生します。
ここで何が欠けていますか?
ところで、REMOTE-SERVERでも実行されているApacheに対してテストするためにHTTPポートを転送してみたところ、同じ結果が得られたので、MySQLの問題ではありません。
詳しくは:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.8.0.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
192.168.1.0 0.0.0.0 255.255.255.0 U 1 0 0 eth1
5.5.0.0 0.0.0.0 255.255.252.0 U 0 0 0 as0t0
5.5.4.0 0.0.0.0 255.255.252.0 U 0 0 0 as0t1
5.5.8.0 0.0.0.0 255.255.252.0 U 0 0 0 as0t2
5.5.12.0 0.0.0.0 255.255.252.0 U 0 0 0 as0t3
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
ここに私のゲートウェイのiptablesがあります(AFAIK、ほとんどのルールはOpenVPNサーバーによって追加されます)。これは、@ SmallClangerによって提案された変更を適用した後です。
iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
AS0_ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
AS0_ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
AS0_IN_PRE all -- 0.0.0.0/0 0.0.0.0/0 mark match 0x2000000/0x2000000
AS0_ACCEPT tcp -- 0.0.0.0/0 192.168.1.10 state NEW tcp dpt:915
AS0_ACCEPT tcp -- 0.0.0.0/0 192.168.1.10 state NEW tcp dpt:914
AS0_ACCEPT udp -- 0.0.0.0/0 192.168.1.10 state NEW udp dpt:917
AS0_ACCEPT udp -- 0.0.0.0/0 192.168.1.10 state NEW udp dpt:916
AS0_WEBACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
AS0_WEBACCEPT tcp -- 0.0.0.0/0 192.168.1.10 state NEW tcp dpt:943
Chain FORWARD (policy ACCEPT)
target prot opt source destination
AS0_ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
AS0_IN_PRE all -- 0.0.0.0/0 0.0.0.0/0 mark match 0x2000000/0x2000000
AS0_OUT_S2C all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 10.8.0.0/24 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
ACCEPT tcp -- 0.0.0.0/0 10.8.0.51 tcp dpt:3306
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
AS0_OUT_LOCAL all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_ACCEPT (7 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_DNS (2 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 172.20.2.26
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_IN (4 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 5.5.0.1
ACCEPT all -- 0.0.0.0/0 10.8.0.1
ACCEPT all -- 0.0.0.0/0 192.168.1.0/24
AS0_IN_POST all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_IN_POST (1 references)
target prot opt source destination
AS0_OUT all -- 0.0.0.0/0 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_IN_PRE (2 references)
target prot opt source destination
AS0_DNS tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:53
AS0_DNS udp -- 0.0.0.0/0 0.0.0.0/0 state NEW udp dpt:53
AS0_IN all -- 0.0.0.0/0 5.5.0.0/20
AS0_IN all -- 0.0.0.0/0 192.168.0.0/16
AS0_IN all -- 0.0.0.0/0 172.16.0.0/12
AS0_IN all -- 0.0.0.0/0 10.0.0.0/8
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_OUT (2 references)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_OUT_LOCAL (1 references)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 5
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_OUT_S2C (1 references)
target prot opt source destination
AS0_OUT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_WEBACCEPT (2 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
NATテーブル
iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
AS0_NAT_PRE_REL_EST all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
AS0_DPFWD_UDP udp -- 0.0.0.0/0 192.168.1.10 udp dpt:1194 state NEW
AS0_DPFWD_TCP tcp -- 0.0.0.0/0 192.168.1.10 tcp dpt:443 state NEW
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 to:10.8.0.51
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
AS0_NAT_POST_REL_EST all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
AS0_NAT_PRE all -- 0.0.0.0/0 0.0.0.0/0 mark match 0x2000000/0x2000000
MASQUERADE all -- 10.8.0.0/24 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain AS0_DPFWD_TCP (1 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 to:192.168.1.10:914
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_DPFWD_UDP (1 references)
target prot opt source destination
DNAT udp -- 0.0.0.0/0 0.0.0.0/0 to:192.168.1.10:916
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_NAT (2 references)
target prot opt source destination
SNAT all -- 0.0.0.0/0 0.0.0.0/0 to:192.168.1.10
SNAT all -- 0.0.0.0/0 0.0.0.0/0 to:10.8.0.1
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_NAT_POST_REL_EST (1 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_NAT_PRE (1 references)
target prot opt source destination
AS0_NAT_TEST all -- 0.0.0.0/0 5.5.0.0/20
AS0_NAT_TEST all -- 0.0.0.0/0 192.168.0.0/16
AS0_NAT_TEST all -- 0.0.0.0/0 172.16.0.0/12
AS0_NAT_TEST all -- 0.0.0.0/0 10.0.0.0/8
AS0_NAT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_NAT_PRE_REL_EST (1 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
Chain AS0_NAT_TEST (4 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 5.5.0.0/20
AS0_NAT all -- 0.0.0.0/0 0.0.0.0/0
編集:
@SmallClangerのコメントに基づいて、ポート転送やNATを行う必要がないことに気付きました。 LOCAL-CLIENTは、VPNのIPを介してREMOTE-SERVERに接続できます。このため、私のVPNゲートウェイはデフォルトゲートウェイではないため、この静的ルートをLOCAL-CLIENTに追加する必要がありました。
ip route add 10.8.0.0/24 via 192.168.1.10 dev eth0
また、LOCAL-CLIENTがVPNクライアントに接続できないようにするiptablesのこのFORWARDルールを削除する必要がありました。
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
これは、OUTPUT
チェーンがローカルプロセスから発信されたパケットに対してのみ機能するためです。 (この有用な画像 ここ を参照してください。)
置き換える場合(またはゲートウェイから接続したい場合は補足)、そのルールを次のように置き換えます。
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to 10.8.0.51
また、トラフィックをまだ許可していない場合:
iptables -t filter -A FORWARD -p tcp -d 10.8.0.51 --dport 3306 -j ACCEPT
その後、接続が通過するはずです。ゲートウェイからすでに動作しているので、MySQLが正しくリッスンしていることと、サーバーが接続を受け入れていることを確認できます。
ただし、実際にNAT=が必要かどうかを質問します。ルーティングだけで適切なFORWARD
ルールを使用してこれを処理できます。そのルーティングは手動で、またはVPNサーバーの構成を通じて確立できます。 、要件によって異なります。このオプションを確認したい場合は、openvpnサーバー構成とroute -n
の出力を投稿に追加できますか?
[〜#〜]編集[〜#〜]
接続がVPN経由で確実に戻るようにするには、サーバーからLANへのルートが必要です。これをMySQLサーバーに手動で追加するには:
route add -net 192.168.1.0/24 dev tun0
(tun0
がVPNクライアントインターフェイスの場合).
機能する場合は、VPNクライアントの構成にこれを追加することをお勧めします:route 192.168.1.0/24
(これにより、トンネルインターフェースやPPPエンドポイントアドレスの設定に関係なく、接続時にルートが自動的に作成されます中古)
デバッグに役立つヒント:サーバー上のtcpdump -i tun0 -qtln port 3306
は、VPNアダプター(クライアントまたはサーバー)を通過するmysqlトラフィックを表示します。接続のハンドシェイクがうまくいかないところを確認できるはずです。