[daily] 比端口转发更高级的ssh device tunnel转发

时间:2023-02-03 08:38:28

没有什么能够阻挡,你对*的向往。

场景:

我有一台设备Server100,在某一个f复杂的内网里,需要多次ssh跳转可以访问到。但是它不能直接访问internet。

我现在需要在我的ssh路径上,搭一条链路出来,让倒霉的设备Server100通过我笔记本上网。

方法:

第一步:通过多次建立端口转发隧道,把Server100的22端口映射出来。让我的笔记本可以直接ssh进Server100。

  第一跳:

┬─[tong@T7:~/VM/nlb]─[05:01:28 PM]
╰─>$ ssh -L127.0.0.1:60022:100.64.224.20:22 t36
┬─[tong@T7:~/VM/nlb]─[:: PM]
╰─>$ ss -l -t -p - |grep
LISTEN 127.0.0.1: 0.0.0.0:* users:(("ssh",pid=,fd=))

  第二跳:

原理同上,如果有的话。我。。没有了。。。[撒花][撒花]

第二步:在server100和笔记本上,分别建立两个tunnel device。为步骤三做准备。

server100上:

[root@nlb-tong- ~]# ip tuntap add mod tun
[root@nlb-tong- ~]# ip link show tun0
: tun0: <POINTOPOINT,MULTICAST,NOARP> mtu qdisc noop state DOWN mode DEFAULT group default qlen
link/none

配IP:

[root@nlb-tong- ~]# ip link set dev tun0 up
[root@nlb-tong- ~]# ip addr add 1.1.1.1/ dev tun0

笔记本上:

同server100

第三步:在Server100的sshd上,开启tunnel转发功能。

把 PermitTunnel改成yes,并重启sshd

[root@nlb-tong- ~]# cat /etc/ssh/sshd_config |grep Tun
#PermitTunnel no
[root@nlb-tong- ~]# systemctl restart sshd

第四步:通过步骤一中最后搭建出的的ssh链接,做一条设备转发隧道,将步骤二中的两个tunnel device打通。

┬─[tong@T7:~/VM/nlb]─[:: PM]
╰─>$ ssh -p60022 -w0: root@127.0.0.1

查看两端的tunnl设备的状态,由NO-CURRIER变成POINTOPOINT

: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu  qdisc pfifo_fast state UP group default qlen
link/none
inet 1.1.1.1/ scope global tun0
valid_lft forever preferred_lft forever

两端添加路由

sudo ip r add 2.1.1.1/ via 2.1.1.2 dev tun0  ##笔记本
ip r add 2.1.1.2/ via 2.1.1.1 dev tun0 ## server

ping一下,验证一下。

[root@nlb-tong- ~]# ip r add 1.1.1.2/ via 1.1.1.1 dev tun0
[root@nlb-tong- ~]# ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) () bytes of data.
bytes from 1.1.1.1: icmp_seq= ttl= time=0.163 ms
bytes from 1.1.1.1: icmp_seq= ttl= time=0.080 ms
^C

第五步:为两个device配置IP,路由。把Server100的公网流量全部转到笔记本的公网出口上去。

在server100上加路由:

其中第二条用来保证我当前的管理链接可以正常使用。

default via 1.1.1.1 dev tun0
10.0.0.0/ via 10.0.0.1 dev eth0

这个时候,在笔记本上,已经可以收到从1.1.1.1过来的公网包了。

┬─[tong@T7:~/VM/nlb]─[:: PM]
╰─>$ sudo tcpdump -i tun0 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size bytes
::19.436430 IP 1.1.1.1 > 114.114.114.114: ICMP echo request, id , seq , length
::20.451450 IP 1.1.1.1 > 114.114.114.114: ICMP echo request, id , seq , length
::21.475726 IP 1.1.1.1 > 114.114.114.114: ICMP echo request, id , seq , length
::22.435967 IP 1.1.1.1 > 114.114.114.114: ICMP echo request, id , seq , length

然后再在笔记本上进行设置,让这些包,给外网送出去,可用的方法有很多。

最简单的就是bridge。

下面,是用iptables的做法。

# 先,让二层包能相互转发
sudo iptables -A FORWARD -i tun0 -o wlan0 -j ACCEPT
sudo iptables -A FORWARD -o tun0 -i wlan0 -j ACCEPT
# 再,配个SNAT
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

好了, 通了

[root@client-tong- ~]# curl -q www.baidu.com
<!DOCTYPE html>

第六步:开心的上网。

[root@client-tong- ~]# yum search epel-release

还有还有:

其实,除了tunnel设备,tap设备也是可以的,详见下文:

https://www.taos.com/wp-content/uploads/2015/10/Taos-White-Paper_Advanced-SSH-Tunneling.pdf

大概是这样的:

ssh -o Tunnel=ethernet -f -w : root@remotehost.example.com true

完。