Loading... 故事要从新员工刚入职不久说起,那会也刚好手头一些个活,其中一个是要换操作系统。这个事情我直接安排给了新人做。替换操作系统还是挺考验基本功的。放心不下的我也是一边指导了他一下。因为在系统替换之前你得摸清楚系统中所有的可能和意外。做法也肯定从进程入手,得看上面运行着哪些进程以及端口分别做什么用的,还得分析进程所属服务是否还在使用,从而判断影响面。其次还得查系统配置情况(如应用自启动的配置情况,定时任务的周期,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 | ```bash [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上 ```bash [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上 ```bash [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上 ```bash [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开启默认路由 ```bash [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开启静态路由 ```bash [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方式 ```bash [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类方式:代理工具 ```bash [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类方式:隧道方式 ```bash [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的确是个强大便捷的命令,偷懒必备! 另外我个人认为不管是技术,还是资源管理,还是工作处理都是得都是个循序渐进的发展。要不时的进行分类管理,不可能一口气吃成胖子,这样才能更深刻的掌握和不断吸收。就像大树一样,有了根再长出主干,再长出枝干,最后再长出叶子,渐渐长成参天大树! Last modification:June 4, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏