前两天在工作中遇到一个需求,某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实现内外网端口映射及转发上网的更多相关文章

  1. linux下搭建redis内网端口映射工具-rinetd

    最近在工作中使用到了redis缓存,用来提某些业务场景的计算速度和某些情况下的操作频率限制,客户端工具使用了redisDesktopmanager来管理,在本机操作测试的时候,是没有问题的.但是将系统 ...

  2. Tp-link路由器怎么设置端口映射 内网端口映射听语音

    https://jingyan.baidu.com/article/ca00d56c710ef9e99eebcf85.html 只有一台能上网的电脑就可以自己免费搭建服务器,本经验简单介绍家用tp-l ...

  3. centos6.7 配置外网端口映射

    目的: 为节省公司外网ip,现需要把部分没有外网ip的服务器做端口映射. 服务器节点: 118.192.66.66(外网服务器) em1 内网 em2 外网 192.168.32.124(内网服务器) ...

  4. ip route,ip rule, iptables和docker的端口映射

    iptables 默认5个表, 不可增加其他表 raw 用于配置数据包,raw 中的数据包不会被系统跟踪. filter 是用于存放所有与防火墙相关操作的默认表. nat 用于 网络地址转换(例如:端 ...

  5. 单线拨号上网时RouterOS内网端口映射的配置

    很多时候routeros 是通过单线拨号上网,假设PPP接口名为pppoe-out1 若需要添加内网ip=18.16.1.92主机的3389端口映射 ,可以在命令行键入: ip firewall na ...

  6. NAT ------ 为什么手动设置NAT端口映射(转发)不成功,导致访问不了局域网服务器

    手动设置端口映射成功的条件是路由器WAN口接的是外网IP,而不是网络提供商的路由器NAT之后的IP.假如有个外网的客户端,连的服务器IP一定要是外网IP(假设IP_A),如果自己的路由器WAN口接的是 ...

  7. tcp/udp/socket 端口映射,转发小工具

    1) 利用 Python 的 Socket 端口转发,用于远程维护 https://github.com/knownsec/rtcp 2) 反向端口转发工具 Reverse TCP Port to U ...

  8. 简单端口映射、转发、重定向工具-Rinetd

    一.简介 Rinetd是为在一个Unix和Linux操作系统中为重定向传输控制协议(TCP)连接的一个工具.Rinetd是单一过程的服务器,它处理任何数量的连接到在配置文件etc/rinetd中指定的 ...

  9. 内网端口映射+dnslog

    以前的DNSLOG部署在公网上也即自己的服务器上,产品依赖个人的环境不是很好.于是做了修改. 框架 细节 1)A域名的域名服务器指向B域名 ns0.B.com ns1.B.com 2)B域名的两个ns ...

随机推荐

  1. Java内部类(1):概述

    > 将一个类的定义放在另一个类的定义内部,这就是内部类. > 使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内 ...

  2. 如何创建一个img文件并且mount 它

    https://ubuntuhak.blogspot.com/2012/10/how-to-create-format-and-mount-img-files.html

  3. ECS Samples概述

    本文档介绍了Unity 面向数据的技术堆栈(DOTS)的三个主要方面:实体包,Unity C#作业系统和Unity Burst编译器所涵盖的Unity实体 - 组件系统(ECS).由于实体是DOTS中 ...

  4. 【计算机视觉】【并行计算与CUDA开发】OpenCV中GPU模块使用

    CUDA基本使用方法 在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下: 1.主机代码执行:2.传输数据到GPU:3.确定grid,block大小: 4.调用内核 ...

  5. Navicat Premium12 注册机下载及教程

    1.下载Navicat Premium 官网https://www.navicat.com.cn/下载最新版本下载安装(文末,网盘地址有64位安装包和注册机下载) 2.激活Navicat Premiu ...

  6. 上传下载文件到Linux服务器

    转自链接:https://blog.csdn.net/drdongshiye/article/details/89430535Mac的终端是十分强大 , 可以通过命令进行上传下载下载文件夹 scp - ...

  7. 通过js判断整型,浮点型,布尔型,字符串型

    <!DOCTYPE html> <html > <head>     <meta charset="UTF-8">     < ...

  8. 小米soar

    SOAR 简介 SOAR,即 SQL Optimizer And Rewriter,是一款 SQL 智能优化与改写工具,由小米运维 DBA 团队出品 SOAR 体系架构 SOAR主要由语法解析器,集成 ...

  9. ale.js 对比其他框架

    欢迎!我们相信你来这里的目的就是为了解 Ale 与其他大型框架的区别,这也正是我们想要在此回答的. 客观来说,作为 Ale 的核心开发者,我们肯定会更偏爱 Ale,认为对于某些问题来讲用 Ale 解决 ...

  10. 百度地图的初始化应当在vue的mounted()函数里执行

    今天使用百度地图出现了一个问题,百度地图初始化后宽.高都是0,但是地图容器宽高都设置好的, 一开始怎么都排除不出问题,后来无语了,把布局直接复制进入百度地图的示例里运行发现没有问题, 所以想到不是百度 ...