故事要从新员工刚入职不久说起,那会也刚好手头一些个活,其中一个是要换操作系统。这个事情我直接安排给了新人做。替换操作系统还是挺考验基本功的。放心不下的我也是一边指导了他一下。因为在系统替换之前你得摸清楚系统中所有的可能和意外。做法也肯定从进程入手,得看上面运行着哪些进程以及端口分别做什么用的,还得分析进程所属服务是否还在使用,从而判断影响面。其次还得查系统配置情况(如应用自启动的配置情况,定时任务的周期,iptables配置是否存在映射,网络连接情况)。在检查过程中,有一个进程他看不懂。进程是类似这样的ssh -CfNg -L 127.0.0.1:9115:127.0.0.1:9115 root@192.168.200.4 -p 22
。我那会也是简单告诉他这个命令的用途‘用途是把192.168.200.4这台机器的9115抓到本机来’,但他还是天真的以为这两个个127.0.0.1是一个意思。后来我为了让他有个深刻的理解,给他出了个题。给他准备三台测试机A、B、C。B有两个网卡,A、C均只有一块网卡。A和B能通过B的其中一块网卡够互通。同理C和B也是。换言之,A机网卡和B机的网卡1连得是交换机SWA,C机网卡和B机网卡2连得是交换机SWB。问对方能想到几种方式使在A机上ssh连接到C机。这个是个开放题,直接把这个问题去网上搜也不见得会给你答案,全的靠日常积累和个人认知。也是这题的恶心之处。以下我对这个问题做一些解答和总结!
解答
环境 | 网卡1(192.168.1.0) | 网卡2(192.168.2.0) |
---|---|---|
Route1 | 192.168.1.1 | 192.168.2.1 |
Route2 | 192.168.1.2 | / |
Route3 | / | 192.168.2.3 |
[root@route1_vsw4vsw5 ~]# ip a #已简化输出内容
1: ens224: 192.168.1.1/24
2: ens256: 192.168.2.1/24
[root@route2_vsw4 ~]# ip a
1: ens224: 192.168.1.2/24
[root@route3_vsw5 ~]# ip a
1: ens224: 192.168.2.3/24
以下统称:执行命令的所在机为本地机,命令末尾的root@192.169.X.X -p 22为远程机。且均用Route3直接ssh到Route2为例。如下代码框中如在不同机器上执行命令,则用空行间隔。
第1类方式:ssh方式
使用反向连接:Route1 执行命令,端口放在Route3上
[root@route1_vsw4vsw5 ~]# ssh -fN -R 127.0.0.1:2222:192.168.1.2:22 root@192.168.2.3 -p 22
# 命令理解: 看到-R则表示在远程机上启动2222端口,这个2222端口是从本地机代理到Route2
[root@route1_vsw4vsw5 ~]# ps -ef |grep 2222 |grep -v grep
root 9175 1 0 00:00:00 ssh -fN -R 127.0.0.1:2222:192.168.1.2:22 root@192.168.2.3 -p 22
[root@route3_vsw5 ~]# ss -nutlp |grep 2222 |grep -v grep #在远程机上查看端口
tcp LISTEN 0 128 127.0.0.1:2222 *:* users:(("sshd",pid=21142,fd=8))
[root@route3_vsw5 ~]# ssh 127.0.0.1 -p 2222 #验证是否已从Route3可以直接ssh连接至Route2
Last login:
[root@route2_vsw4 ~]#
使用正向连接: Route3执行命令,端口放在Route3上
[root@route3_vsw5 ~]# ssh -fNg -L 192.168.2.3:2222:192.168.1.2:22 root@192.168.2.1 -p 22
# 命令理解: 看到-L则表示在本地机上启动2222端口,这个2222端口是从远程机代理到Route2
[root@route3_vsw5 ~]# ss -nutlp |grep 2222 |grep -v grep #在本地机上查看端口
tcp LISTEN 0 128 192.168.2.3:2222 *:* users:(("ssh",pid=21202,fd=4))
[root@route3_vsw5 ~]# ssh 192.168.2.3 -p 2222 #验证是否已从Route3可以直接ssh连接至Route2
Last login:
[root@route2_vsw4 ~]#
使用正向连接: Route1执行命令,端口放在Route1上
[root@route1_vsw4vsw5 ~]# ssh -fNg -L 192.168.2.1:2222:192.168.1.2:22 root@192.168.2.1 -p 22
# 命令理解: 看到-L则表示在本地机上启动2222端口,这个2222端口是从本地机代理到Route2
[root@route1_vsw4vsw5 ~]# ps -ef |grep 2222 |grep -v grep
root 12012 1 00:00:00 ssh -fNg -L 192.168.2.1:2222:192.168.1.2:22 root@192.168.2.1 -p 22
[root@route3_vsw5 ~]# ssh 192.168.2.1 -p 2222 #验证是否已从Route3可以直接ssh连接至Route2
Last login:
[root@route2_vsw4 ~]#
第2类方式:路由方式
使用默认路由:Route1上临时开启路由转发,Route2,3开启默认路由
[root@route1_vsw4vsw5 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward #临时开启路由转发
[root@route2_vsw4 ~]# ip route add default via 192.168.1.1 dev ens224 #开启默认路由
[root@route3_vsw5 ~]# ip route add default via 192.168.2.1 dev ens224 #开启默认路由
[root@route3_vsw5 ~]# ssh 192.168.1.2 -p 22 #验证是否已从Route3可以直接ssh连接至Route2
Last login:
[root@route2_vsw4 ~]#
使用静态路由: Route1上临时开启路由转发,Route2,3开启静态路由
[root@route1_vsw4vsw5 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward #临时开启路由转发
[root@route2_vsw4 ~]# ip route add 192.168.2.0/24 via 192.168.1.1 dev ens224 proto static metric 101 #开启静态路由
[root@route3_vsw5 ~]# ip route add 192.168.1.0/24 via 192.168.2.1 dev ens224 proto static metric 101 #开启静态路由
[root@route3_vsw5 ~]# ssh 192.168.1.2 -p 22 #验证
Last login:
[root@route2_vsw4 ~]#
第3类方式:NAT方式
[root@route1_vsw4vsw5 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward #临时开启路由转发
[root@route1_vsw4vsw5 ~]# iptables -t nat -A PREROUTING -d 192.168.2.1/32 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.1.2:22 #流量进来或者转发前把目的地址为2.1的数据包,改变其目的地址为1.2
[root@route1_vsw4vsw5 ~]# iptables -t nat -A POSTROUTING -d 192.168.1.2/32 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.1.1 #流量出去或者转发后把目的地址为1.2的数据包,将源地址改变为1.1
[root@route3_vsw5 ~]# ssh 192.168.2.1 -p 32 #测试
Last login:
[root@route2_vsw4 ~]#
第4类方式:代理工具
[root@route1_vsw4vsw5 nginx]# wget https://nginx.org/download/nginx-1.25.5.tar.gz
[root@route1_vsw4vsw5 nginx]# tar -xf nginx-1.25.5.tar.gz
[root@route1_vsw4vsw5 nginx]# cd nginx-1.25.5/
[root@route1_vsw4vsw5 nginx]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/usr/local/nginx/tmp/client/ --http-proxy-temp-path=/usr/local/nginx/tmp/proxy/ --http-fastcgi-temp-path=/usr/local/nginx/tmp/fcgi/ --with-poll_module --with-file-aio --with-http_realip_module --with-http_addition_module --with-http_addition_module --with-http_random_index_module --with-http_stub_status_module --http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp --http-scgi-temp-path=/usr/local/nginx/scgi_temp --with-stream
[root@route1_vsw4vsw5 nginx]# make && make install
[root@route1_vsw4vsw5 nginx]# groupadd www
[root@route1_vsw4vsw5 nginx]# useradd www -g www
[root@route1_vsw4vsw5 nginx]# cat /usr/local/nginx/conf/nginx.conf # 查看nginx主配置文件
...
stream {
...
include /usr/local/nginx/conf.d/*.stream;
}
[root@route1_vsw4vsw5 nginx]# cat /usr/local/nginx/conf.d/ssh.stream #在nginx的stream模块下配置本机2222端口,代理到Route2
upstream ssh {
server 192.168.1.2:22;
}
server {
listen 2222;
proxy_pass ssh;
proxy_connect_timeout 1h;
proxy_timeout 1h;
}
[root@route1_vsw4vsw5 nginx]# /usr/local/nginx/sbin/nginx
[root@route1_vsw4vsw5 nginx]# ss -nutlp |grep 2222 |grep -v grep
tcp LISTEN 0 511 *:2222 *:* users:(("nginx",pid=18734,fd=7),("nginx",pid=18733,fd=7))
[root@route3_vsw5 ~]# ssh 192.168.2.1 -p 2222 #测试
Last login:
[root@route2_vsw4 ~]#
第5类方式:隧道方式
[root@route1_vsw4vsw5 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward #临时开启路由转发
[root@route1_vsw4vsw5 ~]# yum -y install openvpn easy-rsa firewalld
[root@route1_vsw4vsw5 ~]# cd ~
[root@route1_vsw4vsw5 ~]# /usr/share/easy-rsa/3/easyrsa init-pki
[root@route1_vsw4vsw5 ~]# /usr/share/easy-rsa/3/easyrsa build-ca nopass
[root@route1_vsw4vsw5 ~]# /usr/share/easy-rsa/3/easyrsa gen-dh
[root@route1_vsw4vsw5 ~]# /usr/share/easy-rsa/3/easyrsa build-server-full vpn-server nopass
[root@route1_vsw4vsw5 ~]# /usr/share/easy-rsa/3/easyrsa build-client-full vpn-client-01 nopass
[root@route1_vsw4vsw5 ~]# /usr/share/easy-rsa/3/easyrsa build-client-full vpn-client-02 nopass
[root@route1_vsw4vsw5 ~]# /usr/share/easy-rsa/3/easyrsa gen-crl
[root@route1_vsw4vsw5 ~]# openvpn --genkey --secret pki/ta.key
[root@route1_vsw4vsw5 ~]# cp pki/ca.crt /etc/openvpn/ca.crt
[root@route1_vsw4vsw5 ~]# cp pki/dh.pem /etc/openvpn/dh.pem
[root@route1_vsw4vsw5 ~]# cp pki/issued/vpn-server.crt /etc/openvpn/server.crt
[root@route1_vsw4vsw5 ~]# cp pki/private/vpn-server.key /etc/openvpn/server.key
[root@route1_vsw4vsw5 ~]# cp pki/ta.key /etc/openvpn/ta.key
[root@route1_vsw4vsw5 ~]# cp pki/crl.pem /etc/openvpn/crl.pem
[root@route1_vsw4vsw5 ~]# cd /etc/openvpn
[root@route1_vsw4vsw5 ~]# vim server.conf
[root@route1_vsw4vsw5 ~]# cat <<EOF > server.conf
> # Secure OpenVPN Server Config
> # Basic Connection Config
> dev tun
> proto udp
> port 1194
> keepalive 10 120
> max-clients 5
> # Certs
> ca ca.crt
> cert server.crt
> key server.key
> dh dh.pem
> tls-auth ta.key 0
> # Ciphers and Hardening
> reneg-sec 0
> remote-cert-tls client
> crl-verify crl.pem
> tls-version-min 1.2
> cipher AES-256-CBC
> auth SHA512
> tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
> # Drop Privs
> user nobody
> group nobody
> # IP pool
> server 172.31.100.0 255.255.255.0
> topology subnet
> ifconfig-pool-persist ipp.txt
> client-config-dir client
> # Misc
> persist-key
> persist-tun
> comp-lzo
> # DHCP Push options force all traffic through VPN and sets DNS servers
> push "redirect-gateway def1 bypass-dhcp"
> push "dhcp-option DNS 223.5.5.5"
> push "dhcp-option DNS 114.114.114.114"
> # Logging
> log-append /var/log/openvpn.log
> verb 3
> EOF
[root@route1_vsw4vsw5 ~]# systemctl start openvpn@server
[root@route1_vsw4vsw5 ~]# systemctl enable openvpn@server
[root@route1_vsw4vsw5 ~]# cd ~
[root@route1_vsw4vsw5 ~]# mkdir vpn-client-01-config
[root@route1_vsw4vsw5 ~]# cp pki/ca.crt vpn-client-01-config/ca.crt
[root@route1_vsw4vsw5 ~]# cp pki/issued/vpn-client-01.crt vpn-client-01-config/client.crt
[root@route1_vsw4vsw5 ~]# cp pki/private/vpn-client-01.key vpn-client-01-config/client.key
[root@route1_vsw4vsw5 ~]# cp pki/ta.key vpn-client-01-config/ta.key
[root@route1_vsw4vsw5 ~]# cat <<EOF > vpn-client-01-config/client.conf
> # Secure OpenVPN Client Config
> #viscosity dns full
> #viscosity usepeerdns true
> #viscosity dhcp true
> tls-client
> pull
> client
> dev tun
> proto udp
> remote 192.168.1.1 1194
> redirect-gateway def1
> nobind
> persist-key
> persist-tun
> comp-lzo
> verb 3
> ca ca.crt
> cert client.crt
> key client.key
> tls-auth ta.key 1
> remote-cert-tls server
> ns-cert-type server
> key-direction 1
> cipher AES-256-CBC
> tls-version-min 1.2
> auth SHA512
> tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
> EOF
[root@route1_vsw4vsw5 ~]# cd ~
[root@route1_vsw4vsw5 ~]# mkdir vpn-client-02-config
[root@route1_vsw4vsw5 ~]# cp pki/ca.crt vpn-client-02-config/ca.crt
[root@route1_vsw4vsw5 ~]# cp pki/issued/vpn-client-02.crt vpn-client-02-config/client.crt
[root@route1_vsw4vsw5 ~]# cp pki/private/vpn-client-02.key vpn-client-02-config/client.key
[root@route1_vsw4vsw5 ~]# cp pki/ta.key vpn-client-02-config/ta.key
[root@route1_vsw4vsw5 ~]# cat <<EOF > vpn-client-02-config/client.conf
...
> remote 192.168.2.1 1194
...
> EOF
[root@route1_vsw4vsw5 ~]# scp -r vpn-client-01-config/ 192.168.1.2:/root/
[root@route1_vsw4vsw5 ~]# scp -r vpn-client-02-config/ 192.168.2.3:/root/
[root@route2_vsw4 ~]# yum -y install openvpn easy-rsa firewalld
[root@route2_vsw4 ~]# cp vpn-client-01-config/* /etc/openvpn/client/
[root@route2_vsw4 ~]# systemctl start openvpn-client@client
[root@route2_vsw4 ~]# systemctl enable openvpn-client@client
[root@route2_vsw4 ~]# ip a #输出精简
1: ens224: 192.168.1.2/24
2: tun0: 172.31.100.2/24
[root@route3_vsw5 ~]# yum -y install openvpn easy-rsa firewalld
[root@route3_vsw5 ~]# cp vpn-client-02-config/* /etc/openvpn/client/
[root@route3_vsw5 ~]# systemctl start openvpn-client@client
[root@route3_vsw5 ~]# systemctl enable openvpn-client@client
[root@route3_vsw5 ~]# ip a #输出精简
1: ens224: 192.168.2.1/24
2: tun0: 172.31.100.3/24
[root@route3_vsw5 ~]# ssh 172.31.100.2 -p 22
Last login:
[root@route2_vsw4 ~]#
总结
这个问题如果是按几种来问的话,实在太多,也就无解了。以至于我只能对不同方式进行一个分类。如果还有其他种类的方式不防留言或者加好友一起学习一下。ssh的确是个强大便捷的命令,偷懒必备!
另外我个人认为不管是技术,还是资源管理,还是工作处理都是得都是个循序渐进的发展。要不时的进行分类管理,不可能一口气吃成胖子,这样才能更深刻的掌握和不断吸收。就像大树一样,有了根再长出主干,再长出枝干,最后再长出叶子,渐渐长成参天大树!
:::: column
::: column-left
:::
::: column-right
:::
::::
客官,欢迎光临本站!路途遥远,常进来看看!
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。