iptables端口转发DNAT

使用 iptables 进行端口转发

笔者在网上找了些代码,大部分都没有成功。后面根据网上的博文测试,最终调通~~~

这里使用三台 CentOS7 虚拟机进行测试。分别是A(192.168.187.153)、B(192.168.187.152)、C(192.168.187.142)
A上面启动了nginx,监听8000端口,上下文 /test
B上面配置iptables端口转发
C上面进行最终测试

最终的访问链路

C ---> B (port 8888) ---> A (port 8000)
  1. 在A上面请求本地8000端口,确保后端服务可以正常访问。注意防火墙要允许外部计算机网络本地8000端口,笔者
    这里关闭掉了防火墙,方便测试。


    image.png
  1. 在B上面配置iptables等内容

vim iptab.sh

#!/bin/bash

iptables -t nat -A PREROUTING -d 192.168.187.152 -p tcp --dport 8888 -j DNAT --to-destination 192.168.187.153:8000
iptables -t nat -A POSTROUTING -d 192.168.187.153 -p tcp --dport 8000 -j SNAT --to-source 192.168.187.152


:x 保存退出执行 sh iptab.sh

PREROUTING链的作用是数据到达防火墙时改变目的地址,POSTROUTING链的作用是离开防火墙时改变源地址。


vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

:x 保存退出执行 sysctl -p

开启内核转发


# 放行FORWARD数据包
# 笔者虚拟机使用的是ens33网卡的IP
iptables -I FORWARD -i ens33 -j ACCEPT

FORWARD 解释:在 Linux 的 iptables 防火墙中,FORWARD 链是用于处理转发的数据包的一个默认链。当一台 Linux 主机作为路由器或网关时,它会转发经过它的数据包,这些数据包会经过 FORWARD 链进行处理。iptables 的 FORWARD 链通常用于控制传入或传出系统的数据包是否允许转发。


# 查看iptables nat转发链路
iptables -t nat --list --line
image.png

注意这里并未保存iptables的配置,如果重启iptables服务就失效了。如果安装有 iptables-service,可以使用
service iptables save 来持久化配置

  1. 最后我们在C上面进行测试
curl -XGET http://192.168.187.152:8888/test -i
image.png

OK,测试成功!

注意第二步里面配置 PREROUTING 和 POSTROUTING 必不可少,配置内核转发也需要,最后还需要配置 FORWARD 链路规则,之前笔者没有配置 FORWARD,一直不成功,最后调整以后就可以了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容