没有什么能够阻挡,你对*的向往。
场景:
我有一台设备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
完。