记一次ubuntu利用iptables做端口转发的操作

同事从海外远程连接国内某云上的一台机器3389端口,发现因为运营商路由原因非常慢,找运营商修改路由又非常麻烦。于是曲线救国,找了国内一台到两边访问都较快的机器做为跳板,做一个端口转发,以加速云机器3389端口的访问。这里记录下思路和操作。

我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。

网络拓扑图

如下,图中ip均为虚构。

主要目的就是通过配置跳板机的防火墙转发规则,使得访问1.1.1.1:21521的流量自动转发到2.2.2.2:3389

跳板机环境:ubuntu 16.04

1-network.jpg

iptables & ufw

iptables是linux中最常用的防火墙服务。

同样是iptables服务,centos是直接管理的,而可能是觉得iptables的一些命令对于初学者太复杂,ubuntu是通过ufw这个服务来管理的。

ufw有下面两类命令:

  • ufw命令 - 用来启动,停止,重启防火墙服务以及一些简单的规则设定
  • iptables命令 - 和centos中的操作一样,用来创建,查看,删除各种防火墙规则

常规使用直接用ufw命令就可以了,但是涉及到像端口转发这种比较复杂功能的实现,我们还是需要用iptables命令来完成。

ufw命令

  • 查看ufw状态
sudo ufw status

显示如下说明ufw已经处于激活状态

Status: active

我试了一下使用systemctl status ufwservice ufw status都不能正常返回ufw的状态,非常奇怪。

  • 停掉ufw服务
sudo ufw disable
  • 启动ufw服务
sudo ufw enable
  • 重启ufw服务
sudo ufw reload

iptables命令

iptables命令的格式如下

sudo iptables [-t table] -A/-D/-I/... CHAIN rule -j Target
  • 其中CHAIN一共有五个,分别为PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

如果一个包是发送给本机的,那么会依次经过

PREROUTING -> INPUT -> Kernel -> OUTPUT -> POSTROUTING

而像我们这种纯粹要被转发的包,会依次经过

PREROUTING -> FORWARD -> POSTROUTING

所以待会我们需要对这三个CHAIN进行操作。

  • 再来看这个table,一共有四个,分别是filer,nat,mangle和raw。因为涉及到SNAT和DNAT,所以待会我们主要是操作nat这个table

  • 至于rule,我们会根据目的端口和ip来匹配要被转发的包。

  • 最后是target,一个包从进来遇到PREROUTING,首先会被修改目的地址和端口,然后在FORWARD中被放行,最后在离开机器从POSTROUTING出去时会被修改源地址。

iptables的讲解不在这篇文章的范围内,如果想了解更多iptables的原理,欢迎关注我的csdn博客。

实际操作

以下操作没特殊说明都是在跳板机上执行

  • 检查先决条件

首先确保跳板机上可以ping到目标机器,并且在没有防火墙的情况下可以telnet到目标机器的目标端口

telnet 2.2.2.2 3389

打开ufw服务

sudo ufw enable
  • 打开内核转发开关
echo 1 > /proc/sys/net/ipv4/ip_forward
  • 允许回包
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  • iptables允许转发
sudo iptables -P FORWARD ACCEPT

可以通过sudo iptabls -nvL FORWARD --line-numbers来验证结果

  • 实现DNAT
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 21521 -j DNAT --to-destination 2.2.2.2:3389

对于目标端口为21521的TCP连接,全部修改目的地址为2.2.2.2:3389。回包会自动被改回来,所以不用为回包再特意配置一个SNAT了。

可以通过sudo iptables -nvL PREROUTING -t nat --line-numbers来验证结果

  • 实现SNAT
sudo iptables -t nat -A POSTROUTING -d 2.2.2.2/32 -p tcp -m tcp --dport 3389 -j MASQUERADE

对于访问2.2.2.2:3389的包,全部修改源地址为出口ip的地址。回包会自动被改回来,所以不用为回包再特意配置一个DNAT了。

可以通过sudo iptables -nvL POSTROUTING -t nat --line-numbers来验证结果

  • 验证结果

在本地telnet 1.1.1.1 21521如果通了表示配置完成

  • 如果要删除规则

首先查询某条规则在某个CHAIN中的行号,例如

sudo iptables -nvL INPUT --line-numbers

然后根据行号来删除,例如删除行号为9的规则

sudo iptables -D INPUT 9
  • 保存iptables规则
sudo iptables-save > /home/xiaofu/iptables.txt

可以把下面的脚本放到/etc/profile中开机自动恢复iptables

sudo iptables-restore < /home/xiaofu/iptables.txt

一些坑

  • 假如在跳板机上telnet目标机器的3389端口不通,但是从另外一台机器确认目标机器的3389确实是可以telnet到的,需要检查下跳板机上OUTPUT中是否有规则限制了出包或者是INPUT中限制了回包
  • 修改完iptables是直接生效,不需要reload ufw
  • 一旦reload ufw,那么FORWARD的默认规则又变成DROP,会导致失败
  • 表面上看需要在跳板机上打开21521端口进来,但亲测不用,因为包根本不会走到INPUT
sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21521 -j ACCEPT
  • ufw加了很多自己的CHAIN进来,所以查询的时候最好带上CHAIN的名字去查,不然很痛苦。如果是查PREROUTING和POSTROUTING记得加上-t nat
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值