最常用的几个端口转发的例子

安全
很多情况下,我们往往需要通过对某个端口进行转发(端口映射)实现某些特殊功能,比如堡垒机和负载均衡什么的。在这里我就稍微总结了几种最常用的端口转发方式供大家参考。

很多情况下,我们往往需要通过对某个端口进行转发(端口映射)实现某些特殊功能,比如堡垒机和负载均衡什么的。在这里我就稍微总结了几种最常用的端口转发方式供大家参考。

Linux防火墙模式——反向NAT

这种模式大多是要求用户很快速的实现将外网的某个端口eth0 1.1.1.1:80的流量引流到内网的一台主机10.0.0.1:8080中,本机内网IP eth1 10.0.0.2这种模式性能是毋庸置疑的,但相对来说稳定性和可控性不佳,往往用于临时过渡。

sysctl net.ipv4.ip_forward=1 #这个配置非常重要!

iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.1

iptables -t nat -A POSTROUTING -s 10.0.0.1/255.0.0.0 -d 10.0.0.1 -p tcp -m tcp --dport 8080 -j SNAT --to-source 10.0.0.2

Haproxy

这个方式其实根防火墙模式很相似,不过经过HAproxy的封装,增加了很多方便的配置,你可以很方便的配置出简单的负载均衡规则,状态监控,日志方式甚至于配置心跳等,适合作为中等以上规模的负载均衡集群。

具体的配置大家可以参考官方文档或者直接修改安装包内的默认配置文件,非常浅显易懂!

SSH tunnel

不得不说,SSH是一个很强大的工具。它完全可以应付简单的端口转发和链路加密。适用于低流量的两台互信主机之间的信息加密,它还有个特点是它支持带宽压缩,可以节约部分带宽资源。

配置方式:

通过ssh的tunnel达到邮件在传输的过程中不会受到中间人攻击造成数据泄露。

故名思义,tunnel就是在邮件服务器和企业防火墙之后设置一条逻辑上的隧道。这条隧道一方面为了数据安全,另一方面,由于ssh的压缩功能也能在一定程度上减少邮件这类纯文本传输的网络需求。

先决条件:

Unix like的邮件系统,并安装了ssh-server,本例中假定邮件服务器ip为1.2.3.4

企业路由器和内网:路由最好有vpn和防火墙功能。

内网的 一台主机,配置不必太高(我用了虚拟机,64M内存已经足够近百人使用),安装有ssh-client,如果是win主机,推荐使用putty的安装版本。经过测试,个人觉得FreeBSD下的性能较好。考虑到安全,这台主机尽量不要安装远程控制台并尽可能上锁。本例假定ip 192.168.1.1。

注意整个系统的安全策略,账户策略等,相比中间人攻击这样的“高级”黑客行为,破解密码,利用漏洞永远是成本最低的方法。

SSH隧道实现安全Mail系统示意

第一步:设置公钥方式登录:

内网主机上运行mkdir -p ~/.ssh;cd ~/.ssh;ssh-keygen –d,如果变态一点可以使用ssh-keygen -b 4096 -d增加强度,之后 不要输入任何信息,一律回车带过,很多人不能实现ssh的无验证通过,大多是因为这里没有弄好。这样~/.ssh目录下将会出现id_dsa 和id_dsa.pub两个文件。

将内网主机的id_dsa.pub文件拷贝邮件服务器,并在邮件服务器上执行cat id_dsa.pub >> ~/.ssh/authorized_keys 。尝试在内网主机上执行 ssh A主机的IP ,成功地话应该没有提示密码(即直接得到A主机的控制台)。

如果经常来小站做客的朋友会觉得这段很熟,没错它贴自这里,如果你用了windows作为内网主机,请参考这里的内容。

第二步:配置管道:

写个脚本 vi /usr/sbin/ssh_tunnel

#!/bin/sh
localIP='192.168.1.1'
removteIP='1.2.3.4'
ports='25 80 110' #3个端口,smtp http pop3
for port in $ports
do
    /usr/bin/ssh -C -N -f -L $localIP:$port:$removteIP:$port root@$removteIP  &
done
chmod 755 /usr/sbin/ssh_tunnel

修改rc.local文件,在其中加入 /usr/sbin/ssh_tunnel,当然要放在exit那条之前。

windows不是很熟,写个笨蛋批处理吧ssh_tunnel.cmd

start /min cmd /c 'C:\Program Files\PuTTY\plink.exe' -C -N -f -L 192.168.1.1:25:1.2.3.4:25 root@1.2.3.4
start /min cmd /c 'C:\Program Files\PuTTY\plink.exe' -C -N -f -L 192.168.1.1:80:1.2.3.4:80 root@1.2.3.4
start /min cmd /c 'C:\Program Files\PuTTY\plink.exe' -C -N -f -L 192.168.1.1:110:1.2.3.4:110 root@1.2.3.4

其实putty的那个plink效果完全等同于ssh,当然,win下面主要是用里面的窗口程序,大多数人不怎么用而已。win下比较烦的是每次重起后都要手工加载key,执行这个批处理。希望对win熟的朋友可以提供自动解决方法。

第三步:设置邮件服务器防火墙

通过邮件服务的防火墙关闭除25和22之外的所有端口。这样做是最安全的,但这样的后果是在企业局域网之外只能发不能收邮件。VPN是比较好的折中方案。当然,如果你的邮件系统只需要内部收发邮件(那还要什么邮件系统?),你尽可以连25号也封上。

第四步:设置本地邮件客户端

将局域网内所有邮件客户端的smtp和pop都设置为192.168.1.1即可。我这里由于用了webmail,webmail同样也通过192.168.1.1访问

如果企业有自己的DNS服务器,甚至整个公司都在域管理模式之下。不妨通过本地的DNS服务器用本地IP覆盖掉外网真实IP。这样即便没有vpn,只要不封邮件服务器的110端口,在邮件客户端中设置域名,对用户来说在任何地方都是透明的。

总结:

这种模式,从邮件服务器到企业局域网内的传输是加密透明的,外部很难窃取,如果定期为两边的ssh更换强化的秘钥,效果几乎可以达到变态的要求。据说4096位的秘钥的破解成本已经到了天文数字。

这种方式相对成本较低,不需要太多的投入,特别是在多个分支机构之间成本优势更加突出。本想通过smtp的tls和pop的SSL进行加密,可outlook下对没有根秘证书签名的秘钥会弹出讨厌的警告框,反而增加了用户的不安。申请根证书的签名价格也不菲。

由于企业的邮件系统最多的邮件往往来自于内部,这种方式可以减少差不多一半以上的互联网带宽。把带宽留给更重要的应用。

同理,利用此种方式可以实现其他多种安全方案,达到双宿主机或者多机虚拟的效果,进而可以为企业节约宝贵的外网IP资源。

netcat

工具几乎所有的linux都默认安装了netcat工具(部分Linux的版本用的是OpenBSD-nc,与netcat略有不同,尽管名字一致),这可是一个强大的tcp/ip工具哦。感觉这样的操作有点黑科技的意思了,建议做调试的时候可以用用。

这个例子是把本地的81号端口的访问转移到80号

mknod tunnel p #创建一个临时的管道文件tunnel

netcat -l -p 81 0 < tunnel | netcat -l -p 80 | tee tunnel

socat

其实这个命令根上一个非常类似,从名字上就看得出这个是针对于linux下socket文件的netcat。多数Linux都可以通过默认源来安装。由于是直接建立本地的socket文件,就不需要像上例那样创建管道文件了。

把所有本地的80号转移到10.0.0.1的8080上

socat -d -d -l TCP4-LISTEN:80,reuseaddr,fork,su=nobody TCP4:10.0.0.1:8080

Windows 的netsh

说到底我们用的最多的还是windows,尽管装一个cygwin可以实现几乎上面所有的操作,但最佳的解决方案还是用原生的吧。netsh是windows的一个网络工具,只要你愿意,你在命令行下可以通过它实现几乎所有的windows网络操作。

还是把本地80转移到10.0.0.1的8080

netsh interface portproxy add listenport=80 connectaddress=10.0.0.1 connectport=8080

责任编辑:蓝雨泪 来源: 开源小站
相关推荐

2020-08-25 08:53:02

Linux端口转发

2023-10-30 18:00:00

Docker命令开源平台

2024-10-16 15:25:15

2021-03-02 08:49:53

tmuxLinux命令

2017-10-30 22:22:34

程序员

2018-06-21 15:17:15

机器学习

2011-03-17 14:26:45

iptables 端口

2023-11-30 16:25:21

2020-03-31 14:00:29

Python 开发工具

2009-10-13 14:33:00

2023-03-24 10:07:46

tail命令

2023-03-23 21:08:59

head命令

2010-07-14 15:52:28

Telnet命令

2022-06-16 11:01:22

数据库SQL

2022-03-08 09:16:20

webpack前端开发

2017-10-30 13:34:22

深度学习KerasAPI

2014-07-21 11:05:32

Eclipse快捷键

2022-03-31 10:42:04

端口转发Linux

2011-03-16 10:12:27

LinuxIptables端口转发

2023-04-20 13:59:01

Pythonwhile循环的
点赞
收藏

51CTO技术栈公众号