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

 

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

 

场景:

我有一台设备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]─[04:59:57 PM] ╰─>$ ss -l -t -p -4 |grep 600 LISTEN 0 128 127.0.0.1:60022 0.0.0.0:* users:(("ssh",pid=5494,fd=7))

  第二跳:

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

 

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

server100上:

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

配IP:

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

笔记本上:

同server100

 

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

把 PermitTunnel改成yes,并重启sshd

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

 

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

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

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

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

两端添加路由

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

 

ping一下,验证一下。

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

 

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

在server100上加路由:

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

default via 1.1.1.1 dev tun0
10.0.0.0/8 via 10.0.0.1 dev eth0

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

┬─[tong@T7:~/VM/nlb]─[05:43:16 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 262144 bytes
17:43:19.436430 IP 1.1.1.1 > 114.114.114.114: ICMP echo request, id 7897, seq 21, length 64
17:43:20.451450 IP 1.1.1.1 > 114.114.114.114: ICMP echo request, id 7897, seq 22, length 64
17:43:21.475726 IP 1.1.1.1 > 114.114.114.114: ICMP echo request, id 7897, seq 23, length 64
17:43:22.435967 IP 1.1.1.1 > 114.114.114.114: ICMP echo request, id 7897, seq 24, length 64

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

最简单的就是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-1 ~]# curl -q www.baidu.com
<!DOCTYPE html>

 

第六步:开心的上网。

[root@client-tong-1 ~]# 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 0:0 root@remotehost.example.com true

 

完。

 

posted on 2018-11-29 15:46  toong  阅读(1137)  评论(0编辑  收藏  举报