[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
完。