很多情况下我们都需要进行端口转发,这里以centos为例记录一下linux系统上端口转发的3种方式。

iptables

想利用iptables进行端口转发,首先要打开内核转发功能:

1
2
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

然后编辑转发的服务器的/etc/sysconfig/iptables文件,添加

1
2
3
4
5
6
7
8
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -d 转发服务器的ip -p tcp --dport 转发服务器的端口 -j DNAT --to-destination 目标ip:端口
-A POSTROUTING -d 目标ip -p tcp --dport 目标端口 -j SNAT --to 转发服务器的Ip
COMMIT

重启Iptables后即可生效,在我们本机链接转发服务器的ip和端口实际上就是链接目标机器的ip和端口了。

SSH

先说几个常用参数

  1. -q 静默运行,就算出错也啥都不提示
  2. -f 后台运行
  3. -C 压缩,带宽很差的时候压缩会快一些,否则会更慢
  4. -l 指定用户名,其实就是@前面写的那个
  5. -N 不执行任何命令,适合仅转发的情况
    然后确保本机和转发服务器的ssh服务都开启了准许转发的参数:
    1
    2
    GatewayPorts yes
    AllowTcpForwarding yes

正向代理,在本机执行:

1
ssh -l username -N -L 本机IP:本机端口:目标机IP:目标机端口 转发服务器IP

然后再打开一个终端,使用ssh链接本机IP:本机端口即可访问目标机。当然,首先本机需要能访问转发服务器,其次转发服务器能访问目标机器。
反向代理,在本机执行:

1
ssh -N -R 转发服务器IP:转发服务器端口:本机IP:本机端口 username@转发服务器IP -p转发服务器SSH端口

这样,其他原本访问不了本机服务的机器就可以通过链接转发服务器IP:转发服务器端口来访问本机提供的服务了。

socket代理,配合chrome,firefox浏览器插件翻墙的利器,不多说,给个脚本:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/expect -f
set port 7070
set user xxxx
set host xxx.xxx.xxx.xxx
set password xxxx
set timeout -1
spawn autossh -p 22 -M 9998 -NC -D $port $user@$host
expect "*assword:*"
send "$password\r"
expect eof

autossh、spawn、expect命令需要安装,当然也可以使用ssh-copy-id进行免密码登录设置。然后浏览器代理插件端口设置成7070即可。

rinetd

这个软件看说明很强大,没真正使用过。官网:https://boutell.com/rinetd/
安装后配置vi /etc/rinetd.conf即可,编写的格式是

1
绑定的地址  绑定的端口  连接的地址  连接的端口

保存后启动即可,没用过我就不多说这个了。