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

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

这是我试图解决的问题。我可以从本地计算机连接到一个服务器(“远程系统”),但该远程系统没有互联网连接。我想使用基于 ssh 的 VPN 为远程系统提供通过本地计算机访问互联网的权限。我该如何实现这个目标?我尝试过以下方法,似乎部分有效。我所说的“部分工作”是指连接数据包(同步数据包)被发送到我的本地计算机,但无法建立与互联网的连接。我正在使用 tcpdump 捕获本地计算机上的数据包。本地计算机和远程系统都运行centos 7。

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

[user@remote ~]$ ip 地址显示
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
       永远有效_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 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 范围链接
       永远有效_lft 永远首选_lft
[user@local ~]$ ip 地址显示
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
       永远有效_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 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 范围链接
       永远有效_lft 永远首选_lft

创建tun0接口偏僻的系统。

[user@remote ~]$ sudo ip tuntap add tun0 模式 tun
[user@remote ~]$ ip 地址显示
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
       永远有效_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 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 范围链接
       永远有效_lft 永远首选_lft
3: tun0: mtu 1500 qdisc noop 状态 DOWN qlen 500
    链接/无

创建tun0接口当地的系统。

[user@local ~]$ sudo ip tuntap add tun0 模式 tun
[user@local ~]$ ip 地址显示
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
       永远有效_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 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 范围链接
       永远有效_lft 永远首选_lft
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
       永远有效_lft 永远首选_lft
[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
       永远有效_lft 永远首选_lft

修改远程和本地系统上的 sshd_config 以启用隧道:

[用户@远程 ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config
点对点许可隧道
[用户@local ~]$ sudo grep PermitTunnel /etc/ssh/sshd_config
点对点许可隧道

创建 ssh 隧道:

[用户@本地 ~]$ sudo ssh -f -w0:0 root@remote true
root@remote的密码:
[用户@local ~]$ ps aux | grep root@远程
根 1851 0.0 0.0 76112 1348? ss 23:12 0:00 ssh -f -w0:0 root@remote true

使用新的 IP 地址在两台服务器上测试 ping:

[用户@本地 ~]$ 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 毫秒
[用户@远程 ~]$ 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.8​​89/0.150 毫秒
[用户@远程~]$路线
内核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 原始静态指标 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

获取谷歌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
[用户@远程~]$路线
内核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 原始静态指标 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 '端口不是 22' -i 任意
tcpdump:监听任何,链接类型 LINUX_SLL(Linux 熟),捕获大小 65535 字节

尝试从远程服务器连接到谷歌。

[用户@远程 ~]$ openssl s_client -connect google.com:443
套接字:没有到主机的路由
连接:错误号=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]、原始 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]、原始 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]、原始 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]、原始 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]、原始 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,标志 [无],原始 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]、原始 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
[用户@local ~]$ sudo iptables-save
# 由 iptables-save v1.4.21 于 2017 年 4 月 15 日星期六 01:40:57 生成
*nat
:预路由接受 [35:8926]
:输入接受[1:84]
:输出接受 [6:439]
:后路由接受 [6:439]
:输出方向-[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 预路由 -j PREROUTING_ZONES
-A 输出 -j OUTPUT_direct
-A POSTROUTING -j POSTROUTING_direct
-A POSTROUTING -j POSTROUTING_ZONES_SOURCE
-A POSTROUTING -j POSTROUTING_ZONES
-A 后路由 -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]
:输出方向-[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 预路由 -j PREROUTING_ZONES
-A 输入 -j INPUT_direct
-A 转发 -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]
:输出接受[1229:185742]
:FORWARD_direct - [0:0]
:INPUT_direct - [0:0]
:输出方向-[0:0]
-A 输入 -j INPUT_direct
-A 转发 -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]
:输出接受[1229:185742]
:输出方向-[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]
:输出方向-[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 输入 -j 拒绝 --reject-with icmp-host-prohibited
-A 转发 -m conntrack --ctstate 相关,已建立 -j 接受
-A 转发 -i lo -j 接受
-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 DROP
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-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 接受
犯罪
# 于 2017 年 4 月 15 日星期六 01:40:57 完成


笔记2:
我在一个单独的主机上设置了一个 apache web 服务器,只有本地服务器可以访问。我在监听端口 80 的网络服务器上运行 tcpdump。当我运行时,telnet webserver 80我捕获以下数据包。这是预期的行为,因为 TCP 连接已建立(S、S-Ack、Ack)。

[user@webserver ~]$ sudo tcpdump -nn -vv '端口不是 22 和 80' -i eth0
tcpdump:监听 eth0,链路类型 EN10MB(以太网),捕获大小 65535 字节
07:17:30.411474 IP(tos 0x10,ttl 64,id 34376,偏移量 0,标志 [DF],原始 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]、原始 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,no p ,wscale 7],长度0
07:17:30.411725 IP(tos 0x10,ttl 64,id 34377,偏移量 0,标志 [DF],原始 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

当我尝试通过本地服务器从远程服务器连接到网络服务器时,网络服务器上的 tcpdump 不会捕获任何数据包(甚至不是初始同步),但本地服务器捕获发送到网络服务器的同步数据包(见下文)。这让我相信某些东西正在阻止数据包发送到网络服务器 - 可能是配置错误或防火墙。

[user@local ~]$ sudo tcpdump -nn -vv '端口不是 22 和 80' -i 任意
tcpdump:监听任何,链接类型 LINUX_SLL(Linux 熟),捕获大小 65535 字节
02:24:09.135842 IP(tos 0x10,ttl 64,id 38062,偏移量 0,标志 [DF],原始 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 将数据包发送到网络服务器(失败)。我可以通过在 tun0 接口上运行 tcpdump 来确认这一点:

[user@local ~]$ sudo tcpdump -nn -vv '端口不是 22 和 80' -i tun0
tcpdump:监听tun0,链接类型RAW(原始IP),捕获大小65535字节
02:28:10.295972 IP(tos 0x10,ttl 64,id 46976,偏移量 0,标志 [DF],原始 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:
我关闭了本地计算机中的防火墙,网络服务器收到了同步数据包。

[用户@local ~]$ sudo systemctl stopfirewalld
[user@webserver ~]$ sudo tcpdump -nn -vv '端口不是 22 和 80' -i eth0
tcpdump:监听 eth0,链路类型 EN10MB(以太网),捕获大小 65535 字节
08:25:17.390912 IP(tos 0x10,ttl 63,id 61767,偏移量 0,标志 [DF],原始 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]、原始 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 7123 514,没有,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],原始 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]、原始 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 7124 517,没有,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

现在很明显,在将数据包发送到网络服务器之前,需要更新源 IP 以匹配本地服务器的 IP 地址。正如 @xin 所建议的,需要在本地服务器上设置 NAT。


注意#4:
当我尝试连接到网络服务器时,我可以看到规则 9 的 pkts 计数增加了 1(如下所示)。

[用户@本地 ~]$ sudo iptables -nvL --line-numbers
…………
Chain FORWARD(策略接受0个数据包,0个字节)
num pkts 字节目标 prot 选择加入源目标         
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 主机拒绝
…………
[用户@local ~]$ sudo iptables -D FORWARD 9

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

[用户@本地 ~]$ sudo iptables -nvL --line-numbers
…………
Chain FORWARD(策略接受1个数据包,60字节)
num pkts 字节目标 prot 选择加入源目标         
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 无效
…………

答案1

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

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

相关内容