![如何仅使用 SSH 创建/设置 VPN?](https://linux22.com/image/109238/%E5%A6%82%E4%BD%95%E4%BB%85%E4%BD%BF%E7%94%A8%20SSH%20%E5%88%9B%E5%BB%BA%2F%E8%AE%BE%E7%BD%AE%20VPN%EF%BC%9F.png)
这是我试图解决的问题。我可以从本地计算机连接到一个服务器(“远程系统”),但该远程系统没有互联网连接。我想使用基于 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.889/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