SSHのみを使用してVPNを作成/設定するにはどうすればよいですか?


9

これが私が解決しようとしている問題です。ローカルコンピューターからSSH接続できるサーバー(「リモートシステム」)がありますが、このリモートシステムはインターネットに接続していません。リモートシステムに、sshベースのVPNを使用してローカルコンピューターからインターネットにアクセスできるようにしたいと考えています。どうすればこれを達成できますか?次のことを試しましたが、部分的にはうまくいくようです。「部分的に機能する」とは、接続パケット(同期パケット)がローカルコンピューターに送信されても​​、インターネットへの接続を確立できないことです。ローカルコンピューター上のパケットをキャプチャするためにtcpdumpを使用しています。ローカルコンピューターとリモートシステムはどちらもcentos 7を実行しています。

セットアップ -注:以下のコマンドは順番に実行されます。user @ remoteコマンドはリモートサーバーで実行され、user @ localコマンドはローカルコンピューターで実行されます。

[user @ remote〜] $ ip addr show
1:lo:mtu 65536 qdisc noqueue状態不明 
    リンク/ループバック00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8スコープホストlo
       valid_lft forever preferred_lft forever
    inet6 :: 1/128スコープホスト 
       valid_lft forever preferred_lft forever
2:eth0:mtu 1500 qdisc pfifo_fast状態UP qlen 1000
    リンク/エーテルAA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255スコープグローバルダイナミックeth0
       valid_lft 1785秒preferred_lft 1785秒
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL / 64スコープグローバルnoprefixrouteダイナミック 
       valid_lft 2591987秒preferred_lft 604787秒
    inet6 ABCD :: IIII:JJJJ:KKKK:LLLL / 64スコープリンク 
       valid_lft forever preferred_lft forever
[user @ local〜] $ ip addr show
1:lo:mtu 65536 qdisc noqueue状態不明 
    リンク/ループバック00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8スコープホストlo
       valid_lft forever preferred_lft forever
    inet6 :: 1/128スコープホスト 
       valid_lft forever preferred_lft forever
2:eth0:mtu 1500 qdisc pfifo_fast状態UP qlen 1000
    リンク/エーテルAA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255スコープグローバルダイナミックeth0
       valid_lft 1785秒preferred_lft 1785秒
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL / 64スコープグローバルnoprefixrouteダイナミック 
       valid_lft 2591987秒preferred_lft 604787秒
    inet6 ABCD :: IIII:JJJJ:KKKK:LLLL / 64スコープリンク 
       valid_lft forever preferred_lft forever

リモートシステムにtun0インターフェイスを作成します。

[user @ remote〜] $ sudo ip tuntap add tun0 mode tun
[user @ remote〜] $ ip addr show
1:lo:mtu 65536 qdisc noqueue状態不明 
    リンク/ループバック00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8スコープホストlo
       valid_lft forever preferred_lft forever
    inet6 :: 1/128スコープホスト 
       valid_lft forever preferred_lft forever
2:eth0:mtu 1500 qdisc pfifo_fast状態UP qlen 1000
    リンク/エーテルAA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255スコープグローバルダイナミックeth0
       valid_lft 1785秒preferred_lft 1785秒
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL / 64スコープグローバルnoprefixrouteダイナミック 
       valid_lft 2591987秒preferred_lft 604787秒
    inet6 ABCD :: IIII:JJJJ:KKKK:LLLL / 64スコープリンク 
       valid_lft forever preferred_lft forever
3:tun0:mtu 1500 qdisc noop状態DOWN qlen 500
    リンク/なし 

ローカルシステムにtun0インターフェイスを作成します。

[user @ local〜] $ sudo ip tuntap add tun0 mode tun
[user @ local〜] $ ip addr show
1:lo:mtu 65536 qdisc noqueue状態不明 
    リンク/ループバック00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8スコープホストlo
       valid_lft forever preferred_lft forever
    inet6 :: 1/128スコープホスト 
       valid_lft forever preferred_lft forever
2:eth0:mtu 1500 qdisc pfifo_fast状態UP qlen 1000
    リンク/エーテルAA:BB:CC:DD:EE:FF brd ff:ff:ff:ff:ff:ff
    inet AAA.BBB.CCC.DDD / 24 brd AAA.BBB.CCC.255スコープグローバルダイナミックeth0
       valid_lft 1785秒preferred_lft 1785秒
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL / 64スコープグローバルnoprefixrouteダイナミック 
       valid_lft 2591987秒preferred_lft 604787秒
    inet6 ABCD :: IIII:JJJJ:KKKK:LLLL / 64スコープリンク 
       valid_lft forever preferred_lft forever
3:tun0:mtu 1500 qdisc noop状態DOWN qlen 500
    リンク/なし

tun0にIPアドレスを割り当てて起動します。

[user @ local〜] $ sudo ip addr add 10.0.2.1/30 dev tun0
[user @ local〜] $ sudo ip link set dev tun0 up
[user @ local〜] $ ip addr show tun0
3:tun0:mtu 1500 qdisc pfifo_fast状態DOWN qlen 500
    リンク/なし 
    inet 10.0.2.1/30スコープのグローバルtun0
       valid_lft forever preferred_lft forever
[user @ remote〜] $ sudo ip addr add 10.0.2.2/30 dev tun0
[user @ remote〜] $ sudo ip link set dev tun0 up
[user @ remote〜] $ ip addr show tun0
3:tun0:mtu 1500 qdisc pfifo_fast状態DOWN qlen 500
    リンク/なし 
    inet 10.0.2.2/30スコープグローバルtun0
       valid_lft forever preferred_lft forever

リモートシステムとローカルシステムの両方でsshd_configを変更して、トンネリングを有効にします。

[user @ remote〜] $ sudo grep PermitTunnel / etc / ssh / sshd_config 
PermitTunnelポイントツーポイント
[user @ local〜] $ sudo grep PermitTunnel / etc / ssh / sshd_config 
PermitTunnelポイントツーポイント

sshトンネルを作成します。

[user @ local〜] $ sudo ssh -f -w0:0 root @ remote true
root @ remoteのパスワード: 
[user @ local〜] $ ps aux | grep root @ remote
ルート1851 0.0 0.0 76112 1348?Ss 23:12 0:00 ssh -f -w0:0 root @ remote true

新しいIPアドレスを使用して、両方のサーバーでpingをテストします。

[user @ local〜] $ ping 10.0.2.2 -c 2
PING 10.0.2.2(10.0.2.2)56(84)バイトのデータ。
10.0.2.2から64バイト:icmp_seq = 1 ttl = 64 time = 1.68 ms
10.0.2.2から64バイト:icmp_seq = 2 ttl = 64 time = 0.861 ms

--- 10.0.2.2 ping統計---
送信2パケット、受信2、パケット損失0%、時間1002ms
rtt min / avg / max / mdev = 0.861 / 1.274 / 1.688 / 0.415 ms
[user @ remote〜] $ ping 10.0.2.1 -c 2
PING 10.0.2.1(10.0.2.1)56(84)バイトのデータ。
10.0.2.1から64バイト:icmp_seq = 1 ttl = 64 time = 0.589 ms
10.0.2.1から64バイト:icmp_seq = 2 ttl = 64 time = 0.889 ms

--- 10.0.2.1 ping統計---
送信2パケット、受信2、パケット損失0%、時間1000ms
rtt min / avg / max / mdev = 0.589 / 0.739 / 0.889 / 0.150 ms
[user @ remote〜] $ルート
カーネルIPルーティングテーブル
宛先ゲートウェイのGenmaskフラグメトリックRef Use Iface
デフォルトゲートウェイ0.0.0.0 UG 100 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0
AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
[user @ remote〜] $ ip route show
AAA.BBB.CCC.1 dev eth0 proto静的メトリックによるデフォルト100 
10.0.2.0/30 dev tun0 protoカーネルスコープリンクsrc 10.0.2.2 
AAA.BBB.CCC.0 / 24 dev eth0 protoカーネルスコープリンクsrc AAA.BBB.CCC.31メトリック100 

Google IPアドレスを取得します。

[user @ local〜] $ nslookup google.com
サーバー:サーバー
アドレス:server#53

権威のない答え:
名前:google.com
住所:173.194.219.101
名前:google.com
住所:173.194.219.100
名前:google.com
住所:173.194.219.113
名前:google.com
住所:173.194.219.102
名前:google.com
住所:173.194.219.139
名前:google.com
住所:173.194.219.138

重要: 上記のコマンドを別の時間に実行すると、別の結果が得られました。あなたの応答が上記のnslookupに対する私のものと同じであると想定しないでください。

GoogleのすべてのIPアドレスは173.194.219で始まるため、これらすべてのIPアドレスをローカルコンピューター経由でルーティングします。

[user @ remote〜] $ sudo ip route add 173.194.219.0/24 dev tun0
[user @ remote〜] $ルート
カーネルIPルーティングテーブル
宛先ゲートウェイのGenmaskフラグメトリックRef Use Iface
デフォルトゲートウェイ0.0.0.0 UG 100 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.252 U 0 0 0 tun0
AAA.BBB.CCC.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
173.194.219.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
[user @ remote〜] $ ip route show
AAA.BBB.CCC.1 dev eth0 proto静的メトリックによるデフォルト100 
10.0.2.0/30 dev tun0 protoカーネルスコープリンクsrc 10.0.2.2 
AAA.BBB.CCC.0 / 24 dev eth0 protoカーネルスコープリンクsrc AAA.BBB.CCC.31メトリック100 
173.194.219.0/24 dev tun0スコープリンク 

ip_forwardingを有効にします。

[user @ local〜] $ grep ip_forward /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[user @ local〜] $ sudo service network restart
(systemctl経由で)ネットワークを再起動しています:[OK]

tcpdumpを使用してローカルコンピュータにパケットキャプチャを設定します。

[user @ local〜] $ sudo tcpdump -nn -vv 'port not 22' -i any
tcpdump:任意のリンクタイプLINUX_SLL(Linuxクック)でリッスン、キャプチャサイズ65535バイト

リモートサーバーからGoogleに接続してみます。

[user @ remote〜] $ openssl s_client -connect google.com:443
ソケット:ホストへのルートがありません
接続:errno = 113

opensslコマンドがリモートサーバーで実行されるとすぐに、tcpdumpはいくつかのパケットをキャプチャします。

    10.0.2.2.52768> 173.194.219.102.443:フラグ[S]、cksum 0x8702(正解)、seq 994650730、win 29200、オプション[mss 1460、sackOK、TS val 7701438 ecr 0、nop、wscale 7]、長さ0
00:49:33.247753 IP(tos 0x0、ttl 64、id 46037、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.48774> 173.194.219.100.443:フラグ[S]、cksum 0x47a7(正しい)、seq 2218733674、win 29200、オプション[mss 1460、sackOK、TS val 7701439 ecr 0、nop、wscale 7]、長さ0
00:49:33.247883 IP(tos 0xc0、ttl 64、id 9538、オフセット0、フラグ[なし]、プロトコルICMP(1)、長さ88)
    10.0.2.1> 10.0.2.2:ICMPホスト173.194.219.100に到達できません-管理禁止、長さ68
    IP(tos 0x0、ttl 63、id 46037、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.48774> 173.194.219.100.443:フラグ[S]、cksum 0x47a7(正しい)、seq 2218733674、win 29200、オプション[mss 1460、sackOK、TS val 7701439 ecr 0、nop、wscale 7]、長さ0
00:49:33.253068 IP(tos 0x0、ttl 64、id 26282、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.51312> 173.194.219.101.443:フラグ[S]、cksum 0x6ff8(正しい)、seq 2634016105、win 29200、オプション[mss 1460、sackOK、TS val 7701443 ecr 0、nop、wscale 7]、長さ0
00:49:33.254771 IP(tos 0xc0、ttl 64、id 9539、オフセット0、フラグ[なし]、プロトコルICMP(1)、長さ88)
    10.0.2.1> 10.0.2.2:ICMPホスト173.194.219.101到達不能-管理禁止、長さ68
    IP(tos 0x0、ttl 63、id 26282、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.51312> 173.194.219.101.443:フラグ[S]、cksum 0x6ff8(正しい)、seq 2634016105、win 29200、オプション[mss 1460、sackOK、TS val 7701443 ecr 0、nop、wscale 7]、長さ0
00:49:33.258805 IP(tos 0x0、ttl 64、id 9293、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.33686> 173.194.219.139.443:フラグ[S]、cksum 0x542b(正解)、シーケンス995927943、勝利29200、オプション[mss 1460、sackOK、TS val 7701450 ecr 0、nop、wscale 7]、長さ0
00:49:33.258845 IP(tos 0xc0、ttl 64、id 9540、オフセット0、フラグ[なし]、プロトコルICMP(1)、長さ88)
    10.0.2.1> 10.0.2.2:ICMPホスト173.194.219.139到達不能-管理禁止、長さ68
    IP(tos 0x0、ttl 63、id 9293、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.33686> 173.194.219.139.443:フラグ[S]、cksum 0x542b(正解)、シーケンス995927943、勝利29200、オプション[mss 1460、sackOK、TS val 7701450 ecr 0、nop、wscale 7]、長さ0
^ C
キャプチャされた13パケット
フィルターで受信した13パケット
カーネルによってドロップされた0パケット

tcpdumpを使用してキャプチャされたパケットは、接続を確立しようとする試み(同期パケットが送信される)が何も受信されないことを示唆しています。また10.0.2.1 > 10.0.2.2: ICMP host 173.194.219.139 unreachable - admin prohibited, length 68、問題を示唆するように思われるメッセージもあります。

この問題を回避する方法に関する提案はありますか?追加する必要があるiptableルールはありますか?ファイアウォールの問題(firewall-d?)。


注#1
iptables-saveからの出力:

[user @ local〜] $ sudo iptables -t nat -A POSTROUTING -s 10.0.2.2/32!-d 10.0.2.1/30 -jマスカレード-o eth0
[user @ local〜] $ sudo iptables-save
#2017年4月15日01:40:57にiptables-save v1.4.21によって生成
* nat
:PREROUTING ACCEPT [35:8926]
:INPUT ACCEPT [1:84]
:OUTPUT ACCEPT [6:439]
:受入承認[6:439]
:OUTPUT_direct-[0:0]
:POSTROUTING_ZONES-[0:0]
:POSTROUTING_ZONES_SOURCE-[0:0]
:POSTROUTING_direct-[0:0]
:POST_public-[0:0]
:POST_public_allow-[0:0]
:POST_public_deny-[0:0]
:POST_public_log-[0:0]
:PREROUTING_ZONES-[0:0]
:PREROUTING_ZONES_SOURCE-[0:0]
:PREROUTING_direct-[0:0]
:PRE_public-[0:0]
:PRE_public_allow-[0:0]
:PRE_public_deny-[0:0]
:PRE_public_log-[0:0]
-A PREROUTING -j PREROUTING_direct
-A PREROUTING -j PREROUTING_ZONES_SOURCE
-A PREROUTING -j PREROUTING_ZONES
-A OUTPUT -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A POSTROUTING -j POSTROUTING_ZONES_SOURCE
-A POSTROUTING -j POSTROUTING_ZONES
-A POSTROUTING -s 10.0.2.2/32!-d 10.0.2.0/30 -jマスカレード
-A POSTROUTING_ZONES -o eth0 -g POST_public
-A POSTROUTING_ZONES -g POST_public
-A POST_public -j POST_public_log
-A POST_public -j POST_public_deny
-A POST_public -j POST_public_allow
-A PREROUTING_ZONES -i eth0 -g PRE_public
-A PREROUTING_ZONES -g PRE_public
-A PRE_public -j PRE_public_log
-A PRE_public -j PRE_public_deny
-A PRE_public -j PRE_public_allow
コミット
#2017年4月15日土曜日01:40:57に完了
#2017年4月15日01:40:57にiptables-save v1.4.21によって生成
*マングル
:PREROUTING ACCEPT [169:18687]
:INPUT ACCEPT [144:11583]
:フォワードアクセプト[0:0]
:OUTPUT ACCEPT [80:8149]
:POSTROUTING ACCEPT [80:8149]
:FORWARD_direct-[0:0]
:INPUT_direct-[0:0]
:OUTPUT_direct-[0:0]
:POSTROUTING_direct-[0:0]
:PREROUTING_ZONES-[0:0]
:PREROUTING_ZONES_SOURCE-[0:0]
:PREROUTING_direct-[0:0]
:PRE_public-[0:0]
:PRE_public_allow-[0:0]
:PRE_public_deny-[0:0]
:PRE_public_log-[0:0]
-A PREROUTING -j PREROUTING_direct
-A PREROUTING -j PREROUTING_ZONES_SOURCE
-A PREROUTING -j PREROUTING_ZONES
-A INPUT -j INPUT_direct
-Aフォワード-j FORWARD_direct
-A OUTPUT -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A PREROUTING_ZONES -i eth0 -g PRE_public
-A PREROUTING_ZONES -g PRE_public
-A PRE_public -j PRE_public_log
-A PRE_public -j PRE_public_deny
-A PRE_public -j PRE_public_allow
コミット
#2017年4月15日土曜日01:40:57に完了
#2017年4月15日01:40:57にiptables-save v1.4.21によって生成
*セキュリティ
:INPUT ACCEPT [2197:163931]
:フォワードアクセプト[0:0]
:OUTPUT ACCEPT [1229:185742]
:FORWARD_direct-[0:0]
:INPUT_direct-[0:0]
:OUTPUT_direct-[0:0]
-A INPUT -j INPUT_direct
-Aフォワード-j FORWARD_direct
-A OUTPUT -j OUTPUT_direct
コミット
#2017年4月15日土曜日01:40:57に完了
#2017年4月15日01:40:57にiptables-save v1.4.21によって生成
*生
:PREROUTING ACCEPT [2362:184437]
:OUTPUT ACCEPT [1229:185742]
:OUTPUT_direct-[0:0]
:PREROUTING_direct-[0:0]
-A PREROUTING -j PREROUTING_direct
-A OUTPUT -j OUTPUT_direct
コミット
#2017年4月15日土曜日01:40:57に完了
#2017年4月15日01:40:57にiptables-save v1.4.21によって生成
*フィルタ
:INPUT ACCEPT [0:0]
:フォワードアクセプト[0:0]
:OUTPUT ACCEPT [80:8149]
:FORWARD_IN_ZONES-[0:0]
:FORWARD_IN_ZONES_SOURCE-[0:0]
:FORWARD_OUT_ZONES-[0:0]
:FORWARD_OUT_ZONES_SOURCE-[0:0]
:FORWARD_direct-[0:0]
:FWDI_public-[0:0]
:FWDI_public_allow-[0:0]
:FWDI_public_deny-[0:0]
:FWDI_public_log-[0:0]
:FWDO_public-[0:0]
:FWDO_public_allow-[0:0]
:FWDO_public_deny-[0:0]
:FWDO_public_log-[0:0]
:INPUT_ZONES-[0:0]
:INPUT_ZONES_SOURCE-[0:0]
:INPUT_direct-[0:0]
:IN_public-[0:0]
:IN_public_allow-[0:0]
:IN_public_deny-[0:0]
:IN_public_log-[0:0]
:OUTPUT_direct-[0:0]
-A INPUT -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES_SOURCE
-A INPUT -j INPUT_ZONES
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --icmp-host-prohibitedでの拒否
-A転送-m conntrack --ctstate関連、確立-J ACCEPT
-A FORWARD -i lo -j ACCEPT
-Aフォワード-j FORWARD_direct
-Aフォワード-j FORWARD_IN_ZONES_SOURCE
-Aフォワード-j FORWARD_IN_ZONES
-Aフォワード-j FORWARD_OUT_ZONES_SOURCE
-Aフォワード-j FORWARD_OUT_ZONES
-A転送-m conntrack --ctstate無効-jドロップ
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -j OUTPUT_direct
-A FORWARD_IN_ZONES -i eth0 -g FWDI_public
-A FORWARD_IN_ZONES -g FWDI_public
-A FORWARD_OUT_ZONES -o eth0 -g FWDO_public
-A FORWARD_OUT_ZONES -g FWDO_public
-A FWDI_public -j FWDI_public_log
-A FWDI_public -j FWDI_public_deny
-A FWDI_public -j FWDI_public_allow
-A FWDI_public -p icmp -j ACCEPT
-A FWDO_public -j FWDO_public_log
-A FWDO_public -j FWDO_public_deny
-A FWDO_public -j FWDO_public_allow
-A INPUT_ZONES -i eth0 -g IN_public
-A INPUT_ZONES -g IN_public
-A IN_public -j IN_public_log
-A IN_public -j IN_public_deny
-A IN_public -j IN_public_allow
-A IN_public -p icmp -j ACCEPT
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
コミット
#2017年4月15日土曜日01:40:57に完了


注2:
ローカルサーバーのみがアクセスできる別のホストにApache Webサーバーをセットアップしました。ポート80でリッスンしているWebサーバーでtcpdumpを実行しましたtelnet webserver 80。実行すると、次のパケットがキャプチャされます。TCP接続が確立されているため、これは予想される動作です(S、S-Ack、Ack)。

[user @ webserver〜] $ sudo tcpdump -nn -vv 'port not 22 and 80' -i eth0 
tcpdump:eth0でリッスン、リンクタイプEN10MB(イーサネット)、キャプチャサイズ65535バイト
07:17:30.411474 IP(tos 0x10、ttl 64、id 34376、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    local.server.46710> web.server.80:フラグ[S]、cksum 0x8412(不正-> 0x6d96)、seq 3018586542、win 29200、オプション[mss 1460、sackOK、TS val 3047398 ecr 0、nop、wscale 7] 、長さ0
07:17:30.411557 IP(tos 0x0、ttl 64、id 0、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    web.server.80> local.server.46710:Flags [S.]、cksum 0x8412(incorrect-> 0x9114)、seq 2651711943、ack 3018586543、win 28960、options [mss 1460、sackOK、TS val 37704524 ecr 3047398、nop 、wscale 7]、長さ0
07:17:30.411725 IP(tos 0x10、ttl 64、id 34377、オフセット0、フラグ[DF]、proto TCP(6)、長さ52)
    local.server.46710> web.server.80:フラグ[。]、cksum 0x840a(不正-> 0x301c)、seq 1、ack 1、win 229、オプション[nop、nop、TS val 3047398 ecr 37704524]、長さ0

ローカルサーバーを介してリモートサーバーからWebサーバーに接続しようとすると、Webサーバーのtcpdumpはパケットをキャプチャしません(初期同期も含めません)が、ローカルサーバーはWebサーバーに送信される同期パケットをキャプチャします(以下を参照)。これにより、何らかの原因でパケットがWebサーバーに送信されないようになっていると考えられます。

[user @ local〜] $ sudo tcpdump -nn -vv 'port not 22 and 80' -i any
tcpdump:任意のリンクタイプLINUX_SLL(Linuxクック)でリッスン、キャプチャサイズ65535バイト
02:24:09.135842 IP(tos 0x10、ttl 64、id 38062、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.50558> web.server.80:フラグ[S]、cksum 0x668d(正解)、seq 69756226、win 29200、オプション[mss 1460、sackOK、TS val 4780524 ecr 0、nop、wscale 7]、長さ0

重要:パケットはeth0経由でルーティングされていませんが、代わりにtun0経由でパケットをWebサーバーに送信しようとします(失敗します)。これを確認するには、tun0インターフェイスでtcpdumpを実行します。

[user @ local〜] $ sudo tcpdump -nn -vv 'port not 22 and 80' -i tun0
tcpdump:tun0でリッスン、リンクタイプRAW(Raw IP)、キャプチャサイズ65535バイト
02:28:10.295972 IP(tos 0x10、ttl 64、id 46976、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.50560> webserver.80:フラグ[S]、cksum 0xd560(正解)、seq 605366388、win 29200、オプション[mss 1460、sackOK、TS val 5021684 ecr 0、nop、wscale 7]、長さ0


注意#3:
ローカルコンピューターでファイアウォールをオフにしたところ、同期パケットがWebサーバーで受信されました。

[user @ local〜] $ sudo systemctl stop firewalld
[user @ webserver〜] $ sudo tcpdump -nn -vv 'port not 22 and 80' -i eth0
tcpdump:eth0でリッスン、リンクタイプEN10MB(イーサネット)、キャプチャサイズ65535バイト
08:25:17.390912 IP(tos 0x10、ttl 63、id 61767、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.50580> web.server.80:フラグ[S]、cksum 0x30dc(正解)、seq 2601927549、win 29200、オプション[mss 1460、sackOK、TS val 7123514 ecr 0、nop、wscale 7]、長さ0
08:25:17.391003 IP(tos 0x0、ttl 64、id 0、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    web.server.80> 10.0.2.2.50580:フラグ[S。]、cksum 0x4e23(不正-> 0xa316)、seq 959115533、ack 2601927550、win 28960、オプション[mss 1460、sackOK、TS val 41771503 ecr 7123514、nop 、wscale 7]、長さ0
08:25:17.391192 IP(tos 0x0、ttl 128、id 60032、オフセット0、フラグ[なし]、プロトコルTCP(6)、長さ40)
    10.0.2.2.50580> web.server.80:フラグ[R]、cksum 0x7339(正解)、seq 2601927550、win 8192、長さ0
08:25:18.393794 IP(tos 0x10、ttl 63、id 61768、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    10.0.2.2.50580> web.server.80:フラグ[S]、cksum 0x2cf1(正解)、seq 2601927549、win 29200、オプション[mss 1460、sackOK、TS val 7124517 ecr 0、nop、wscale 7]、長さ0
08:25:18.393898 IP(tos 0x0、ttl 64、id 0、オフセット0、フラグ[DF]、proto TCP(6)、長さ60)
    web.server.80> 10.0.2.2.50580:フラグ[S。]、cksum 0x4e23(不正-> 0x7e71)、seq 974785773、ack 2601927550、win 28960、オプション[mss 1460、sackOK、TS val 41772506 ecr 7124517、nop 、wscale 7]、長さ0
08:25:18.394003 IP(tos 0x0、ttl 128、id 60033、オフセット0、フラグ[なし]、プロトコルTCP(6)、長さ40)
    10.0.2.2.50580> web.server.80:フラグ[R]、cksum 0x566a(正解)、seq 2601927550、win 8192、長さ0

これで明らかに、パケットがWebサーバーに送信される前に、ローカルサーバーのIPアドレスと一致するようにソースIPを更新する必要があります。@xinが示唆しているように、NATはローカルサーバーで設定する必要があります。


注#4:
ウェブサーバーに接続しようとすると、ルール9のpktsカウントが1増加することがわかります(以下を参照)。

[user @ local〜] $ sudo iptables -nvL --line-numbers
..........
チェーンフォワード(ポリシーACCEPT 0パケット、0バイト)
num pktsバイトターゲットプロトオプトインソースソース宛先         
1 0 0すべて受け入れ-* * 0.0.0.0/0 0.0.0.0/0 ctstate関連、確立済み
2 0 0すべて受け入れ-lo * 0.0.0.0/0 0.0.0.0/0           
3 1 60 FORWARD_direct all-* * 0.0.0.0/0 0.0.0.0/0           
4 1 60 FORWARD_IN_ZONES_SOURCEすべて-* * 0.0.0.0/0 0.0.0.0/0           
5 1 60 FORWARD_IN_ZONESすべて-* * 0.0.0.0/0 0.0.0.0/0           
6 1 60 FORWARD_OUT_ZONES_SOURCE all-* * 0.0.0.0/0 0.0.0.0/0           
7 1 60 FORWARD_OUT_ZONESすべて-* * 0.0.0.0/0 0.0.0.0/0           
8 0 0 DROP all-* * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
9 1 60 REJECT all-* * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
..........
[user @ local〜] $ sudo iptables -D FORWARD 9

FORWARDチェーンのルール9が削除されると(@xinが示唆するように、上から)、Webサーバーに接続できます。

[user @ local〜] $ sudo iptables -nvL --line-numbers
..........
チェーンフォワード(ポリシーACCEPT 1パケット、60バイト)
num pktsバイトターゲットプロトオプトインソースソース宛先         
1 12 5857すべて受け入れる-* * 0.0.0.0/0 0.0.0.0/0 ctstate関連、確立済み
2 0 0すべて受け入れ-lo * 0.0.0.0/0 0.0.0.0/0           
3 2 120 FORWARD_direct all-* * 0.0.0.0/0 0.0.0.0/0           
4 2 120 FORWARD_IN_ZONES_SOURCE all-* * 0.0.0.0/0 0.0.0.0/0           
5 2 120 FORWARD_IN_ZONES all-* * 0.0.0.0/0 0.0.0.0/0           
6 2 120 FORWARD_OUT_ZONES_SOURCE all-* * 0.0.0.0/0 0.0.0.0/0           
7 2 120 FORWARD_OUT_ZONES all-* * 0.0.0.0/0 0.0.0.0/0           
8 0 0 DROP all-* * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
..........

回答:


4

パケットの送信元アドレスをローカルマシンのアドレスのいずれかに置き換えて、ローカルマシンが応答を受信できるようにする必要があります。そうでない場合、これらのパケットを次のルーターに送信する(適切な)理由がなく、いずれにしても応答をキャッチできません。iptables MASQUERADEおよびSNATこれらのパケットの送信元アドレスを変更するのに役立ちます:

[user@local ~]$ iptables -t nat -A POSTROUTING -s 10.0.2.2/32 ! -d 10.0.2.1/30 -j MASQUERADE -o eth0

返信@xinをありがとう。指定したコマンドを実行しましたが、同じ応答が返されました。私はeth0とtun0でtcpdumpを実行しました。パケットはeth0にルーティングされません。tun0はまだgoogleに連絡しようとしています。どうにかしてパケットをtun0からeth0にルーティングする必要がありますか?
Ali

1
ローカルマシンがインターネットへの接続にインターフェースeth0を使用している場合、このコマンドがなくてもパケットはeth0に送信されます。そのため、ファイアウォール設定が関係している可能性があります。iptables-saveローカルマシンの出力を入れてもらえますか?
xin 2017

元の投稿にiptables-saveの出力を追加しました。
アリ

firewalldをオフにする必要がありました。Firewalldをオフにしてコマンドを実行したところ、接続が機能し始めました!あなたの助けに感謝!進捗状況を確認するには、元の投稿のメモをチェックアウトしてください。
2017

1
よくやった。問題はiptableルールのよう-A FORWARD -j REJECT --reject-with icmp-host-prohibitedです。マシンに到着し、宛先アドレスがマシンの外にあるパケットは、FORWARDチェーンに送られるため、このルールをドロップします。
xin 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.