iptables实现内外网端口映射及转发上网
前两天在工作中遇到一个需求,某192.168.1.0/24内网网段内只有一台主机A连接到了公网,A的两块网卡分别有一个公网地址(123.234.345.456)和一个内网地址(192.168.1.10),现需要内网的另一台主机B(192.168.1.77)连接到互联网下载某些东西,同时将B的某服务端口开放到公网上,两台主机的系统均为CentOS7。
主要参考了https://www.cnblogs.com/ssgeek/p/9220680.html 和 https://blog.csdn.net/light_jiang2016/article/details/79029661 两篇文章,事实证明并不需要改路由表等操作,简单几条命令即可完成我们的需求。
解决思路为使用iptables的转发功能,当然CentOS7自带了firewalld防火墙也有转发功能,但因为配置内网转接公网也需要通过iptables进行,这里就都使用iptables(CentOS7无需安装和启用iptables.service,我们只是用到了iptables命令)。
首先查看B主机的网卡
[root@~]# ip addr : lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc mq state UP group default qlen
link/ether ::0f:f5::c0 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.77/ brd 192.168.1.255 scope global noprefixroute em1
valid_lft forever preferred_lft forever
inet6 fe80:::fff:fef5:25c0/ scope link noprefixroute
valid_lft forever preferred_lft forever
编辑网卡ens1的配置文件
[root@r740 redis]# vi /etc/sysconfig/network-scripts/ifcfg-ens1 TYPE=Ethernet
PROXY_METHOD=none
BOOTPROTO=static #也可以设置为dhcp,具体看路由器是否开启了dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
NAME=ens1
UUID=531a7963-406d-4e4d-b949-efe5d55d6cc
DEVICE=ens1
ONBOOT=yes
IPADDR=192.168.1.77
PREFIX=
GATEWAY=192.168.1.10 #重点在这里,网关要设成主机A的内网地址
DNS1=114.114.114.114
~
~
~
:wq保存修改,然后重启网络服务
systemctl restart network
systemctl restart NetworkManager #如果安装了图形界面,network会被NetworkManager代替
之后回到A主机,开启A的内核转发
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf && sysctl -p
iptables -t nat -A POSTROUTING -s 192.168.1.77 -j MASQUERADE #进行ip伪装,对来源为192.168.1.77的主机数据报进行转发,如果改为192.168.1./,则对整个内网网段的主机都进行转发
OK,现在在主机B ping一个公网网址,发现已经可以ping通了。
将以下代码保存成shell脚本,执行,即可开启对应端口的公网映射
#!/bin/bash
pro='tcp' src_host='123.234.345.456' #主机A的公网地址
src_port=16379 #在主机A上要映射的端口 Dst_Host='192.168.1.77' #主机B的内网地址
Dst_Port=6379 #在主机B上要映射过去的端口 # 清空规则(如果自己以前定义过规则,比如上文的转发规则,则慎用!)
#iptables -F
#iptables -X
#iptables -Z
#iptables -t nat -F # Destination network address translate (dnat) iptables -t nat -A PREROUTING -p $pro -d $src_host --dport $src_port -j DNAT --to $Dst_Host:$Dst_Port iptables -A FORWARD -p $pro -d $Dst_Host --dport $Dst_Port -j ACCEPT # 本地连接不经过prerouting,只经过output链,所以想要在服务器A通过本地ip访问服务器B需要在output 链增加dnat规则 iptables -t nat -A OUTPUT -p $pro -d $src_host --dport $src_port -j DNAT --to $Dst_Host:$Dst_Port
在主机B运行redis服务后,扫描123.234.345.456的13679端口,发现已经是开启状态,端口转发成功。
如果希望持久化配置
iptables-save > /etc/sysconfig/iptables
将新加规则写入到配置文件中。
iptables实现内外网端口映射及转发上网的更多相关文章
- linux下搭建redis内网端口映射工具-rinetd
最近在工作中使用到了redis缓存,用来提某些业务场景的计算速度和某些情况下的操作频率限制,客户端工具使用了redisDesktopmanager来管理,在本机操作测试的时候,是没有问题的.但是将系统 ...
- Tp-link路由器怎么设置端口映射 内网端口映射听语音
https://jingyan.baidu.com/article/ca00d56c710ef9e99eebcf85.html 只有一台能上网的电脑就可以自己免费搭建服务器,本经验简单介绍家用tp-l ...
- centos6.7 配置外网端口映射
目的: 为节省公司外网ip,现需要把部分没有外网ip的服务器做端口映射. 服务器节点: 118.192.66.66(外网服务器) em1 内网 em2 外网 192.168.32.124(内网服务器) ...
- ip route,ip rule, iptables和docker的端口映射
iptables 默认5个表, 不可增加其他表 raw 用于配置数据包,raw 中的数据包不会被系统跟踪. filter 是用于存放所有与防火墙相关操作的默认表. nat 用于 网络地址转换(例如:端 ...
- 单线拨号上网时RouterOS内网端口映射的配置
很多时候routeros 是通过单线拨号上网,假设PPP接口名为pppoe-out1 若需要添加内网ip=18.16.1.92主机的3389端口映射 ,可以在命令行键入: ip firewall na ...
- NAT ------ 为什么手动设置NAT端口映射(转发)不成功,导致访问不了局域网服务器
手动设置端口映射成功的条件是路由器WAN口接的是外网IP,而不是网络提供商的路由器NAT之后的IP.假如有个外网的客户端,连的服务器IP一定要是外网IP(假设IP_A),如果自己的路由器WAN口接的是 ...
- tcp/udp/socket 端口映射,转发小工具
1) 利用 Python 的 Socket 端口转发,用于远程维护 https://github.com/knownsec/rtcp 2) 反向端口转发工具 Reverse TCP Port to U ...
- 简单端口映射、转发、重定向工具-Rinetd
一.简介 Rinetd是为在一个Unix和Linux操作系统中为重定向传输控制协议(TCP)连接的一个工具.Rinetd是单一过程的服务器,它处理任何数量的连接到在配置文件etc/rinetd中指定的 ...
- 内网端口映射+dnslog
以前的DNSLOG部署在公网上也即自己的服务器上,产品依赖个人的环境不是很好.于是做了修改. 框架 细节 1)A域名的域名服务器指向B域名 ns0.B.com ns1.B.com 2)B域名的两个ns ...
随机推荐
- Java内部类(1):概述
> 将一个类的定义放在另一个类的定义内部,这就是内部类. > 使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内 ...
- 如何创建一个img文件并且mount 它
https://ubuntuhak.blogspot.com/2012/10/how-to-create-format-and-mount-img-files.html
- ECS Samples概述
本文档介绍了Unity 面向数据的技术堆栈(DOTS)的三个主要方面:实体包,Unity C#作业系统和Unity Burst编译器所涵盖的Unity实体 - 组件系统(ECS).由于实体是DOTS中 ...
- 【计算机视觉】【并行计算与CUDA开发】OpenCV中GPU模块使用
CUDA基本使用方法 在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下: 1.主机代码执行:2.传输数据到GPU:3.确定grid,block大小: 4.调用内核 ...
- Navicat Premium12 注册机下载及教程
1.下载Navicat Premium 官网https://www.navicat.com.cn/下载最新版本下载安装(文末,网盘地址有64位安装包和注册机下载) 2.激活Navicat Premiu ...
- 上传下载文件到Linux服务器
转自链接:https://blog.csdn.net/drdongshiye/article/details/89430535Mac的终端是十分强大 , 可以通过命令进行上传下载下载文件夹 scp - ...
- 通过js判断整型,浮点型,布尔型,字符串型
<!DOCTYPE html> <html > <head> <meta charset="UTF-8"> < ...
- 小米soar
SOAR 简介 SOAR,即 SQL Optimizer And Rewriter,是一款 SQL 智能优化与改写工具,由小米运维 DBA 团队出品 SOAR 体系架构 SOAR主要由语法解析器,集成 ...
- ale.js 对比其他框架
欢迎!我们相信你来这里的目的就是为了解 Ale 与其他大型框架的区别,这也正是我们想要在此回答的. 客观来说,作为 Ale 的核心开发者,我们肯定会更偏爱 Ale,认为对于某些问题来讲用 Ale 解决 ...
- 百度地图的初始化应当在vue的mounted()函数里执行
今天使用百度地图出现了一个问题,百度地图初始化后宽.高都是0,但是地图容器宽高都设置好的, 一开始怎么都排除不出问题,后来无语了,把布局直接复制进入百度地图的示例里运行发现没有问题, 所以想到不是百度 ...