IP地址分为公有ip地址和私有ip地址,Public Address是由INIC(internet network information center)负责的,这些IP地址分配给了注册并向INIC提出申请的组织机构。Private Address属于非注册地址,专门为组织内部使用。Private Address是不可能直接用来跟WAN通信的,要么利用帧来通信(FRE帧中继,HDLC,PPP),要么需要路由的转发(nat)功能把私有地址转换为公有地址才行。
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功
说明:现在有些网络已经普及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)
通过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。
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
几个实例说明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)
- Filter过滤器的链
- INPUT: 定义规则过滤想要进入Linux主机的数据包;
- OUTPUT:处理Linux主机想要送出去的数据包;
- FORWARD:与当前的Linux主机无关,需要转发到其他计算机的包;
- NAT地址转换的链
- PREROUTING:进行路由判断前要遵循的规则;
- POSTROUTING:进行路由判断后要遵循的规则;
- OUTPUT:过滤发出去的数据包
-
这些默认表格和链怎么相互工作
这里不考虑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
查看