如何仅使用SSH创建/设置VPN?


9

这是我要解决的问题。有一个服务器(“远程系统”),我可以从本地计算机将其插入,但该远程系统没有Internet连接。我想使用基于ssh的VPN通过我的本地计算机为远程系统提供访问Internet的权限。我该如何完成?我尝试了以下方法,这似乎部分起作用。我的意思是“部分工作”是将连接数据包(同步数据包)发送到本地计算机,但无法建立与Internet的连接。我正在使用tcpdump捕获本地计算机上的数据包。本地计算机和远程系统都在运行centos 7。

设置 -注意:以下命令按顺序运行。user @ remote命令在远程服务器上运行,而user @ local命令在本地计算机上运行。

[user @ remote〜] $ ip地址显示
1:lo:mtu 65536 qdisc队列状态未知 
    链接/环回00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8范围主机lo
       永久有效_lft永久首选_lft
    inet6 :: 1/128作用域主机 
       永久有效_lft永久首选_lft
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 1785sec preferred_lft 1785sec
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL / 64范围全局noprefixroute动态 
       valid_lft 2591987sec preferred_lft 604787sec
    inet6 ABCD :: IIII:JJJJ:KKKK:LLLL / 64范围链接 
       永久有效_lft永久首选_lft
[user @ local〜] $ ip地址显示
1:lo:mtu 65536 qdisc队列状态未知 
    链接/环回00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8范围主机lo
       永久有效_lft永久首选_lft
    inet6 :: 1/128作用域主机 
       永久有效_lft永久首选_lft
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 1785sec preferred_lft 1785sec
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL / 64范围全局noprefixroute动态 
       valid_lft 2591987sec preferred_lft 604787sec
    inet6 ABCD :: IIII:JJJJ:KKKK:LLLL / 64范围链接 
       永久有效_lft永久首选_lft

远程系统上创建tun0接口。

[user @ remote〜] $ sudo ip tuntap add tun0模式tun
[user @ remote〜] $ ip地址显示
1:lo:mtu 65536 qdisc队列状态未知 
    链接/环回00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8范围主机lo
       永久有效_lft永久首选_lft
    inet6 :: 1/128作用域主机 
       永久有效_lft永久首选_lft
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 1785sec preferred_lft 1785sec
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL / 64范围全局noprefixroute动态 
       valid_lft 2591987sec preferred_lft 604787sec
    inet6 ABCD :: IIII:JJJJ:KKKK:LLLL / 64范围链接 
       永久有效_lft永久首选_lft
3:tun0:mtu 1500 qdisc noop state DOWN qlen 500
    链接/无 

本地系统上创建tun0接口。

[user @ local〜] $ sudo ip tuntap add tun0模式tun
[user @ local〜] $ ip地址显示
1:lo:mtu 65536 qdisc队列状态未知 
    链接/环回00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8范围主机lo
       永久有效_lft永久首选_lft
    inet6 :: 1/128作用域主机 
       永久有效_lft永久首选_lft
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 1785sec preferred_lft 1785sec
    inet6 EEEE:FFFF:GGGG:HHHH:IIII:JJJJ:KKKK:LLLL / 64范围全局noprefixroute动态 
       valid_lft 2591987sec preferred_lft 604787sec
    inet6 ABCD :: IIII:JJJJ:KKKK:LLLL / 64范围链接 
       永久有效_lft永久首选_lft
3:tun0:mtu 1500 qdisc noop state DOWN qlen 500
    链接/无

为tun0分配一个IP地址并启动它:

[user @ local〜] $ sudo ip addr add 10.0.2.1/30 dev tun0
[user @ local〜] $ sudo ip链接设置dev tun0向上
[user @ local〜] $ ip addr show tun0
3:tun0:mtu 1500 qdisc pfifo_fast状态DOWN qlen 500
    链接/无 
    inet 10.0.2.1/30范围全局tun0
       永久有效_lft永久首选_lft
[user @ remote〜] $ sudo ip addr add 10.0.2.2/30 dev tun0
[user @ remote〜] $ sudo ip链接设置dev tun0向上
[user @ remote〜] $ ip addr show tun0
3:tun0:mtu 1500 qdisc pfifo_fast状态DOWN qlen 500
    链接/无 
    inet 10.0.2.2/30范围全局tun0
       永久有效_lft永久首选_lft

在远程和本地系统上修改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时间= 1.68 ms
从10.0.2.2开始的64个字节:icmp_seq = 2 ttl = 64时间= 0.861 ms

--- 10.0.2.2 ping统计信息---
传输2个数据包,接收2个数据包,0%数据包丢失,时间1002ms
rtt最小值/平均值/最大值/ 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时间= 0.589 ms
从10.0.2.1开始的64个字节:icmp_seq = 2 ttl = 64时间= 0.889 ms

--- 10.0.2.1 ping统计信息---
传输2个数据包,接收2个数据包,0%数据包丢失,时间1000ms
rtt最小值/平均值/最大值/ mdev = 0.589 / 0.739 / 0.889 / 0.150 ms
[user @ remote〜] $路线
内核IP路由表
目标网关Genmask标志度量标准引用使用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路由显示
默认通过AAA.BBB.CCC.1 dev eth0 proto static metric 100 
10.0.2.0/30 dev tun0原型内核作用域链接src 10.0.2.2 
AAA.BBB.CCC.0 / 24 dev eth0原始内核作用域链接src AAA.BBB.CCC.31指标100 

获取Google IP地址:

[user @ local〜] $ nslookup google.com
服务器:服务器
地址:服务器#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路由添加173.194.219.0/24 dev tun0
[user @ remote〜] $路线
内核IP路由表
目标网关Genmask标志度量标准引用使用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路由显示
默认通过AAA.BBB.CCC.1 dev eth0 proto static metric 100 
10.0.2.0/30 dev tun0原型内核作用域链接src 10.0.2.2 
AAA.BBB.CCC.0 / 24 dev eth0原始内核作用域链接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服务网络重启
重新启动网络(通过systemctl):[确定]

使用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
套接字:无主机路由
connect:错误号= 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,标志[无],proto 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],原始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,标志[无],proto 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],原始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(正确),seq 995927943,win 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,标志[无],proto 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(正确),seq 995927943,win 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
#由iptables-save v1.4.21于2017年4月15日01:40:57生成
* nat
:不接受[35:8926]
:输入接受[1:84]
:接受输出[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输出-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
#由iptables-save v1.4.21于2017年4月15日01:40:57生成
*缠结
:接受接受[169:18687]
:输入接受[144:11583]
:正接受[0:0]
:输出接受[80:8149]
:接受发布[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输入-j INPUT_direct
-A FORWARD -j FORWARD_direct
-A输出-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
#由iptables-save v1.4.21于2017年4月15日01:40:57生成
*安全
:接受输入[2197:163931]
:正接受[0:0]
:OUTPUT ACCEPT [1229:185742]
:FORWARD_direct-[0:0]
:INPUT_direct-[0:0]
:OUTPUT_direct-[0:0]
-A输入-j INPUT_direct
-A FORWARD -j FORWARD_direct
-A输出-j OUTPUT_direct
承诺
#于2017年4月15日星期六完成01:40:57
#由iptables-save v1.4.21于2017年4月15日01:40:57生成
*生的
:接受接受[2362:184437]
:OUTPUT ACCEPT [1229:185742]
:OUTPUT_direct-[0:0]
:PREROUTING_direct-[0:0]
-A PREROUTING -j PREROUTING_direct
-A输出-j OUTPUT_direct
承诺
#于2017年4月15日星期六完成01:40:57
#由iptables-save v1.4.21于2017年4月15日01:40:57生成
*过滤
:输入接受[0:0]
:正接受[0:0]
:输出接受[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输入-m conntrack --ctstate相关,已确定-j接受
-A输入-i lo -j接受
-A输入-j INPUT_direct
-A输入-j INPUT_ZONES_SOURCE
-A输入-j INPUT_ZONES
-A输入-m conntrack --ctstate无效-j DROP
-A INPUT -j REJECT --icmp-host-prohibited拒绝
-A前进-m conntrack --ctstate相关,已确定-j接受
-A前进-i lo -j接受
-A FORWARD -j FORWARD_direct
-A FORWARD -j FORWARD_IN_ZONES_SOURCE
-A FORWARD -j FORWARD_IN_ZONES
-A FORWARD -j FORWARD_OUT_ZONES_SOURCE
-A FORWARD -j FORWARD_OUT_ZONES
-A转发-m conntrack --ctstate无效-j DROP
-A FORWARD -j REJECT-拒绝icmp-host禁止
-A输出-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接受
-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接受
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate新-j ACCEPT
承诺
#于2017年4月15日星期六完成01:40:57


注意#2:
我在仅本地服务器有权访问的单独主机上设置了apache网络服务器。我在侦听端口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:标志[S。],cksum 0x8412(不正确-> 0x9114),seq 2651711943,ack 3018586543,win 28960,选项[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不会捕获任何数据包(甚至不是初始的Sync),而是本地服务器捕获正在发送到Web服务器的Sync数据包(请参阅下文)。这使我相信某种原因阻止了数据包发送到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(原始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:
我关闭了本地计算机中的firewalld,并且Web服务器收到了同步数据包。

[user @ local〜] $ sudo systemctl停止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,标志[无],proto 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:
尝试连接到Web服务器后,可以看到规则9的pkts计数增加了1(如下所示)。

[user @ local〜] $ sudo iptables -nvL --line-numbers
.....
链转发(策略接受0个数据包,0个字节)
num pkts字节目标prot opt出源目的地         
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全部-* * 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全部-* * 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全部删除-* * 0.0.0.0/0 0.0.0.0/0 ctstate无效
9 1 60全部拒绝-* * 0.0.0.0/0 0.0.0.0/0拒绝-禁止icmp-host
.....
[user @ local〜] $ sudo iptables -D FORWARD 9

一旦从FORWARD链中删除规则9(如@xin所建议,从上面删除),我就可以连接到Web服务器。

[user @ local〜] $ sudo iptables -nvL --line-numbers
.....
链转发(策略接受1个数据包,60字节)
num pkts字节目标prot opt出源目的地         
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全部-* * 0.0.0.0/0 0.0.0.0/0           
4 2 120 FORWARD_IN_ZONES_SOURCE全部-* * 0.0.0.0/0 0.0.0.0/0           
5 2 120 FORWARD_IN_ZONES全部-* * 0.0.0.0/0 0.0.0.0/0           
6 2 120 FORWARD_OUT_ZONES_SOURCE全部-* * 0.0.0.0/0 0.0.0.0/0           
7 2 120 FORWARD_OUT_ZONES全部-* * 0.0.0.0/0 0.0.0.0/0           
8 0 0全部删除-* * 0.0.0.0/0 0.0.0.0/0 ctstate无效
.....

Answers:


4

数据包的源地址应替换为本地计算机的地址之一,以便本地计算机可以接收答案,否则没有(好的)理由将这些数据包发送到下一个路由器,无论如何都无法捕获答案。iptables MASQUERADESNAT可用于更改这些数据包的源地址:

[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吗?
阿里

1
如果本地计算机使用接口eth0连接到Internet,即使没有此命令,数据包也应转到eth0。因此,可能涉及某些防火墙设置。能放iptables-save本地机器的输出吗?
reith

我已经将iptables-save的输出添加到原始帖子中。
阿里

需要关闭firewalld。关闭防火墙后,我运行了您的命令,并且连接开始工作!感谢你的帮助!查看原始帖子中的结帐注释,以查看进度。
阿里

1
做得好。看来问题是iptable规则-A FORWARD -j REJECT --reject-with icmp-host-prohibited。到达您的计算机且目标地址不在您的计算机中的数据包将进入FORWARD链,因此请丢弃此规则。
reith
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.