在linux下开启IP转发的方法 iptables实现IP地址重定向(转发)

时间:2024-03-17 19:38:14

IP地址分为公有ip地址和私有ip地址,Public Address是由INIC(internet network information center)负责的,这些IP地址分配给了注册并向INIC提出申请的组织机构。Private Address属于非注册地址,专门为组织内部使用。Private Address是不可能直接用来跟WAN通信的,要么利用帧来通信(FRE帧中继,HDLC,PPP),要么需要路由的转发(nat)功能把私有地址转换为公有地址才行。

出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功

 

1、通过访问sysctl的内核ipv4.ip_forward来判断转发是否开启。

说明:现在有些网络已经普及ipv6的,所以下面的命令可以从ipv4改为ipv6即可

使用sysctl:

sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0

或者检查/proc下的文件:

cat /proc/sys/net/ipv4/ip_forward 0

ipv4转发没有开启 (值为 0)

 

2、启动IP转发

通过sysctl可以开启ipv4的转发功能 (无需重启):

sysctl -w net.ipv4.ip_forward=1

或者

echo 1 > /proc/sys/net/ipv4/ip_forward

这种设置只是暂时的,它的效果会随着计算机的重启而失效。

通过在/etc/sysctl.conf设置参数:

如果想使IP转发永久生效,就请修改/etc/sysctl.conf ,在这里可以增加一条net.ipv4.ip_forward = 1

/etc/sysctl.conf: net.ipv4.ip_forward = 1

如果ipv4转发项已被设为0那么你只需要将它改为1。

 

3、要想是更改生效,你需要执行以下指令:

sysctl -p /etc/sysctl.conf

红帽系列的发行版上可以通过重启网络服务使之生效:

service network restart

而在Debian/Ubuntu系列的发行版则用这样的命令

#早期版本

/etc/init.d/procps.sh restart

#最新版本

/etc/init.d/procps restart

 

原文来自:

http://www.linuxidc.com/Linux/2017-09/147186.htm

 

Linux系统数据包转发

 

 

几个实例说明https://www.cnblogs.com/zhaogaojian/p/8186220.html

 

 

 

 

 

 

1. iptables的表格与链

1.1. Linuxs的iptables里面至少有三个表格(table)

  • Filter(过滤器):主要和进入Linux的数据包有关,是默认的tables;
  • NAT (地址转换):Network Address Translation的缩写,这个表格主要用来进行数据包的源地址以及目的地址的IP和Port的转换;
  • Mangle:不做过多讨论

1.2. 每个表格又含多个链(chain)

  1. Filter过滤器的链
  • INPUT: 定义规则过滤想要进入Linux主机的数据包;
  • OUTPUT:处理Linux主机想要送出去的数据包;
  • FORWARD:与当前的Linux主机无关,需要转发到其他计算机的包;
  1. NAT地址转换的链
  • PREROUTING:进行路由判断前要遵循的规则;
  • POSTROUTING:进行路由判断后要遵循的规则;
  • OUTPUT:过滤发出去的数据包
  1. 这些默认表格和链怎么相互工作
    这里不考虑Mangle表格,参看如下简化后netfilter流程图


     
     
  • 路径A:数据包经过路由判断后,是向Linux主机发起的,经过Filter:INPUT链进行数据控制;
  • 路径B:数据包是要转发走的,则先经过Filter:FORWARD的处理,然后经过NAT:POSTROUTING;
  • 路径C:数据包是从Linux本机送出去的;

2. 转发和NAT规则

多数的组织都只能分配到有限的公网IP地址。那么一个公司里面局域网(LAN)内的那么多节点要是上网就只能使用内网IP,这个时候就需要有一个Edge路由(比如说防火墙)可以从WAN上接受传输然后路由到内网节点上;同时防火墙/网关要可以吧局域网节点的数据包路由到WAN上。这个时候iptables就提供了路由和转发的策略来防止一些异常使用网络资源的行为。

2.1. FORWARD策略

\'FORWARD\'策略允许管理者来控制局域网内数据包转发到哪里去。举个例子来说,为了允许局域网内的数据包转发,假设网关上分配了一个内网IP地址给eth1,那么我们就需要添加如下的一条转发规则

iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT

这条规则就允许防火墙后面的系统来访问内部网络了,网关会把一个局域网内节点的数据包路由到另一个节点,通过eth1这个设备来传递所有数据包。

2.2. IP伪装

允许通过防火墙的内网IP地址进行数据包转发后,局域网内节点之间就可以相互通信了;但是这个时候还是不能访问外网,我们还必须配置防火墙的IP伪装,这个过程中会使用防火墙的外网地址(这里举例的外网网卡是eth0)来替代LAN节点上过来的数据包的内网IP。

 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

-t nat代表NAT表;-A POSTROUTING指定NAT上的POSTROUTING链; -j MASQUERADE指定了要用外网IP来替换数据包上的内网IP

2.3. DNAT设置

如果你的内网有个服务器,你想把它配置成外网可以访问,你可以使用-j DNAT来配置NAT表的PREROUTING链来指定一个内网IP用于外网发过来的数据包请求的转发。举个例子来说,如果你希望转发一个HTTP请求到你指定HTTP服务器:172.31.0.23,可以运行如下的命令:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT \
          --to 172.31.0.23:80

这条规则指定了NAT表中的内建链PREROUTING把所有收到的HTTP请求都转发到目的地址172.31.0.23

Note
如果你的FORWARD链中有一条默认的策略DROP,你必须添加一条规则来允许转发收到的HTTP请求,只有这样目的的NAT路由才有可能,
iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT




链接:https://www.jianshu.com/p/d4f349f6f48c


 
 

iptables不单只防火墙这么简单,NAT转发这些都很强大。但是市面上iptables的教程基本都是围绕着CentOS 6来展开的,而对于CentOS 7和Ubuntu又不一样的写法,尤其是Ubuntu居然加了一个ufw做为封装,目的是为了简化iptables,个人感觉比较乱,封装了太多导致上层看不到更多的原理!而CentOS 7整理来说会保持,但是有些规则还是变了,使用的是firewalld的新概念。

下面实现的是通过一个内网IP重定向到一个外网IP上,或者访问一个外网IP重定向到一个内网IP,基本操作保持一致,主要目的就是重定向,有点类似host:

1、通过代理访问121.8.210.236的转向访问192.168.191.236

sudo iptables -t nat -A OUTPUT -d 121.8.210.236 -j DNAT --to-destination 192.168.191.236 
sudo iptables -t nat -A OUTPUT -d 10.0.0.2 -p tcp --dport 11211 -j DNAT --to-destination 192.168.1.33:11211

2、反过来,访问192.168.191.236的转向访问121.8.210.236

sudo iptables -t nat -A OUTPUT -d 192.168.191.236 -j DNAT --to-destination 121.8.210.236

 

 

配完后

iptables -t nat -A OUTPUT -d 192.168.1.100 -j DNAT --to-destination 192.168.1.1 

查看