0%

Linux配置端口转发

这篇文章配置端口转发主要的应用场景为:本地虚拟机Kalimetasploit在攻击成功时,需要获取外网主机的反弹shell。因为虚拟机kali为本地局域网,外网无法直接访问。需要在VPS上做端口转发,让外网主机先访问VPS某个端口,然后VPS的端口转发到本地虚拟机kali的某个端口。

环境预设

虚拟机Kali:位于本地,NAT模式,外网无法访问

外网VPS:公网独立IPUbuntu 20.04

第一种办法:nftables+ssh远程端口转发

说是iptablesubuntu 20.04已经默认不再使用,推荐nftables

1
2
3
4
5
systemctl start nftables
nft add table ip nat
nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
nft add rule ip nat prerouting tcp dport 5555 redirect to :4444
nft list ruleset

ssh远程端口转发参照第二种办法中相关设置。

第二种办法:rinetd+ssh远程端口转发

  • 远程VPS安装rinetd
1
apt install rinetd
  • 配置rinetd(/etc/rinetd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#
# this is the configuration file for rinetd, the internet redirection server
#
# you may specify global allow and deny rules here
# only ip addresses are matched, hostnames cannot be specified here
# the wildcards you may use are * and ?
#
# allow 192.168.2.*
# deny 192.168.2.1?


#
# forwarding rules come here
#
# you may specify allow and deny rules after a specific forwarding rule
# to apply to only that forwarding rule
#
# bindadress bindport connectaddress connectport
0.0.0.0 5555 localhost 4444

# logging information
logfile /var/log/rinetd.log

# uncomment the following line if you want web-server style logfile format
# logcommon

这里配置的意思是:0.0.0.0表示本机绑定所有可用地址,将所有发往本机5555端口的请求转发到localhost4444端口。

  • 运行rinetd
1
rinetd -c /etc/rinetd.conf

ssh远程端口转发的时候,需要注意几点:

  1. sshd_config里要打开AllowTcpForwarding选项,否则-R远程端口转发会失败。

  2. 默认转发到远程主机上的端口绑定的是127.0.0.1,如要绑定0.0.0.0需要打开sshd_config里的GatewayPorts选项。

  3. SSH实现的内网穿透长时间没有数据传输会断掉,需要进行一些配置,让客户端和服务端保持连接:

    • 方法1.安装autossh,这个软件能够自动重连

      • 在虚拟机kali产生公钥和私钥

        1
        2
        3
        4
        $ ssh-keygen
        ...(一直按Enter,最后在~/.ssh/下生成密钥)
        $ ls ~/.ssh/
        id_rsa id_rsa.pub known_hosts
      • 复制kali生成的id_rsa.pub公钥到外网VPS主机上,并将内容加入到~/.ssh/authorized_keys

        1
        $ cat id_rsa.pub >> ~/.ssh/authorized_keys
      • autossh连接,其中,-M参数指定了autossh监听的端口,注意这里与其转发的端口要区分开。另外,-N表示禁止执行远程命令,-T表示禁止分配伪终端,这两个参数结合起来表示SSH连接不允许用户交互执行远程操作,只能用来传数据,从而保证了远程主机的安全。

        1
        autossh  -M 6666 -NTR 0.0.0.0:4444:192.168.13.4:4444 root@vps-ip -p vps-port
    • 方法2.让SSH客户端定时发送消息保持连接

      • 永久方案:修改SSH客户端配置文件。在Windows上,这个文件位于<用户目录>\.ssh\config,默认是没有这个配置文件的,需要手动创建一个。内容如下:

        1
        2
        Host *
        ServerAliveInterval 240
      • 一次性方案:启动SSH客户端时添加参数:-o ServerAliveInterval=240

    • 方法3.让SSH服务端定时发送消息保持连接。修改/etc/ssh/sshd_config,添加下面两行:

      1
      2
      ServerAliveInterval 30
      ServerAliveCountMax 60
  • 本地kali执行如下命令:
1
ssh -fNTR 4444:192.168.91.138:4444 -p vps-port root@vps-ip

执行完之后,退出rinetd的命令:(不要仅退出rinetd -c /etc/rinetd.conf

1
pkill rinetd

第三种办法:frp

  • 分别在vps和虚拟机kali 上下载对应版本的frp

  • vps上配置服务端(frps.ini

1
2
[common]
bind_port = 7000
  • 配置完启动服务端
1
./frps -c frps.ini
  • 虚拟机kali配置客户端
1
2
3
4
5
6
7
8
9
[common]
server_addr = vps-ip
server_port = 7000

[nc] //随便取名,便于区分,这里反弹nc
type = tcp
local_ip = 127.0.0.1
local_port = 4444
remote_port = 5555
  • 配置完启动客户端
1
./frpc -c frpc.ini

客户端通过vpsip7000端口建立连接,把本地的4444端口数据传递给公网的5555端口。

参考链接:

SSH的三种端口转发

SSH 端口映射

iptables端口转发

利用autorun建立ssh隧道