linux转发请求命令 linux转发数据包( 二 )


有人会说:“既然是这样,我就不用私有IP了,我自己分配自己合法的地址不行吗?那样包就会回来了吧?” 。答案是否定的,IP地址是ICANN来分配的,Internet上的路由器会把这个返回包送到合法的IP去 , 你同样收不到 。而你这种行为有可能被定义为一种ip欺骗 , 很多设备会把这样的包在接入端就给滤掉了 。
那么Linux如何做SNAT 呢?环境配置如下:
当内网节点10.1.1.12需要访问202.2.2.2的web服务器,发送数据包时先路由到10.1.1.1节点,随后(在10.1.1.1节点配置SNAT)将源IP改为60.1.1.1后送出 。同时在ip_conntrack表里面做一个记录:内网的哪一个ip的哪个端口访问的这个web服务器 , 自己把它的源地址改成多少了,端口改成多少了,以便这个web服务器返回数据包的时候linux将它准确的送回给发送请求的这个pc.
大体的数据转发流程我们说完了,我们看看iptables使用什么样的参数来完成这些操作 。在描述这些具体的操作之前,我还要说几个我对iptables的概念的理解(未必完全正确),这将有助于大家理解这些规则 , 以实现更精确的控制 。
上文中我们提到过,对包的控制是由我们在不同的Chain(链)上面添加不同的规则来实现的 。那么既然叫链,一定就是一条或者多条规则组成的了,这时就有一个问题了,如果多个规则对同一种包进行了定义 , 会发生什么事情呢?
在Chain中,所有的规则都是从上向下来执行的,也就是说 , 如果匹配了第一行,那么就按照第一行的规则执行,一行一行的往下找 , 直到找到 符合这个类型的包的规则为止 。如果找了一遍没有找到符合这个包的规则怎么办呢?iptables里面有一个概念,就是Policy(策略),如果找了一遍找不到符合处理这个包的规则,就按照policy来办 。iptables 使用-P来设置Chain的策略 。
对链的操作就那么几种:
比如我们要添加一个规则到filter表的FORWARD链:
在iptables中 , 默认的表名就是filter,所以这里可以省略-t filter直接写成:
iptables中的匹配参数: 我们在这里就介绍几种常用的参数,详细地用法可以man iptables看它的联机文档,你会有意外的收获 。
环境信息:
或者使用如下命令
配置完成,在内网节点(192.168.234.72)发起的服务器节点(8.1.234.73)请求 , 会由外网节点修改源ip后转发出去 。
在8.1.234.73上启动nginx服务,在192.168.234.72上通过curl访问效果如下:
可以将上述配置写到一个文件中,以便重复执行 。
除此之外,也可以精确控制他的访问地址,比如我就允许10.1.1.99访问3.3.3.3这个ip
或者只允许他们访问80端口
更多的控制可以自己灵活去做,或者查阅iptables的联机文档 。
环境信息:
确保服务监听的是ip是内网ip
或者使用如下命令
同样,可以将这部分配置放到一个文件中:
OK,至此配置完成,我们可以尝试在外网节点(8.1.234.73)上,通过网关节点(8.1.234.71)访问内网(192.168.234.72)提供的服务(80端口) 。
在前面的配置中 , 内网节点将互通的外网节点做为网关 , 由网关节点修改目的地址 , 源地址保持不变 。其实,还存在另外一种配置方式,同时修改源地址、目的地址 。将内网地址中的默认路由配置删除
增加一个SNAT配置
这条命令不太好懂?其实很简单,如果使用这条命令,那么你的web server不需要再设置默认网关,就能收到这个请求,只要他和linux的lan ip地址是能互访的(也就是说web server和Linux的Lan ip在一个广播域) 。我们在根据上面的netfilter流程图来分析这个包到底被我们怎么样了:

推荐阅读