iptables转发规则改变源地址无效?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables转发规则改变源地址无效?相关的知识,希望对你有一定的参考价值。

我有一台服务器需要将数据转发到其他服务上,但是发现能转发,但是源地址转换规则没有生效。

发送数据的ip: 192.168.1.1
转发服务的ip:192.168.1.2
处理数据的ip:192.168.1.3

# 将192.168.1.1 发送到5000端口的udp数据转发到192.168.1.3
iptables -t nat -A PREROUTING -p udp --dport 5000 -j DNAT --to-destination 192.168.1.3:5000

# 将转发数据的源地址改为转发服务器IP,不需要让处理数据的服务知道,这个请求实际是谁发送的,只需要知道是转发服务器发送的就行
iptables -t nat -A POSTROUTING -p udp --dport 5000 -j SNAT --to-source 192.168.1.2

目前能够实现数据转发,但是在处理数据的ip上抓包,看到的源地址还是192.168.1.1,也就是源地址转换没生效,这是怎么回事?

设置前,已经开启了内核转发,以及清空了防火墙所有规则,目前只有这两个规则。

你的配置应该是正确的。但是有一些事情可能会导致源地址转换规则无效:

    如果有其他的防火墙规则在 POSTROUTING 链上,那么这些规则可能会覆盖你的源地址转换规则。你可以尝试将你的源地址转换规则放在最后,以确保它是最后一个被应用的规则。

    你可能需要设置主机的内核转发功能,以便转发数据包。你可以使用下面的命令来设置内核转发功能:

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

    如果你的主机正在运行其他的防火墙程序,比如 iptables-persistent 或 firewalld,那么这些程序可能会忽略你在 iptables 中设置的规则。你可以尝试停止这些程序,然后再尝试转发数据包。

    如果你正在使用路由器,那么它可能会忽略你在主机上设置的规则,并将数据包转发回主机。你可以尝试在路由器上设置转发规则,或者将主机设置为路由器的 DMZ 主机,这样它就可以直接接收所有的数据包。

    你的服务器可能正在运行 NAT 功能,导致源地址转换规则无效。你可以尝试关闭 NAT 功能,然后再尝试转发数据包。

    如果你的服务器正在运行 V/P/N,那么 它 可能会更改数据包的源地址,导致你的源地址转换规则无效。你可以尝试关闭它,然后再尝试转发数据包。

    最后,你可能需要在处理数据的服务器上检查防火墙规则是否有阻止数据包的规则。

    希望这些建议能帮助你解决问题。如果你还有其他问题,请继续提问,我会尽力帮助你。

参考技术A 一般来讲,iptables做端口转发后可以立即生效,但取决于内网IP是否更换决定,意思就是如果你内网更换IP后,DNS将同步所以转发的IP地址,此时需要同步时间,如果你的DNS设置一个小时,那么你在做IPTABLES后可能会在1个小时以后可以访问,如果你的DNS大于1小时,当然你的iptables生效可能会在1个小时以后。 参考技术B 以后您如果再遇到类似的问题,可以按照下面的思路去解决:
1、发现问题:往往生活在世界中,时时刻刻都处在这各种各样的矛盾中,当某些矛盾放映到意识中时,个体才发现他是个问题,并要求设法去解决它。这就是发现问题的阶段。从问题的解决的阶段性看,这是第一阶段,是解决问题的前提。

iptables转发技术

1|0NAT


1|1一. 什么是 NAT


NAT(Network Address Translation)译为网络地址转换。通常路由器在转发我们的数据包时,仅仅会将源MAC地址换成自己的MAC地址,但是NAT技术可以修改数据包的源地址、目的地址以及源端口、目的端口等信息。

1|2二. NAT的作用


NAT技术最常见的应用就是通过修改源IP地址实现内网多主机使用一个公网地址接入互联网。NAT技术通常用于端口和流量的转发、重定向,实现如端口映射、跨网络访问、流量代理等功能。

1|3二. iptables实现NAT转发


1.语法及参数介绍

iptables [-t TABLE] COMMAND CHAIN [num] 匹配条件 -j 处理动作

要使用iptables的NAT功能,我们首先需要启用网卡的IP转发功能

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

如果想要永久生效,我们要编辑/etc/sysctl.conf文件,设置net.ipv4.ip_forward = 1,然后用sysctl -p命令使配置文件生效。

我们使用-t nat参数指明使用nat表,因为iptables默认使用filter表。
nat表同filter表一样有三条缺省的"链"(chains):

POSTROUTING:定义进行源地址转换规则,重写数据包的源IP地址 PREROUTING:定义进行目的地址转换的规则,可以把外部访问重定向到其他主机上 OUTPUT:定义对本地产生的数据包的目的转换规则。

我们要利用iptables进行NAT转换时,使用的动作主要为SNAT、DNAT和REDIRECT:

SNAT:源地址转换 DNAT:目的地址转换 REDIRECT:端口重定向

(1)规则操作

-A:在链的尾部添加一条规则 -D CHAIN [num]: 删除指定链中的第num条规则 -I CHAIN [num]:在指定链内第num条位置插入一条规则 -R CHAIN [num]: 替换链内指定位置的一条规则

(2)源/目的IP地址

-s:指定源地址 --dst:指定目的地址

(3)网络接口

-i:入站接口。对于`PREROUTING`链,只能用-i指定进来的网络接口 -o:出站接口。对于POSTROUTINGOUTPUT,只能用-o指定出去的网络接口

(4)动作

ACCEPT:放行 DROP:丢弃 REJECT:拒绝 MASQUERADE:地址伪装 LOG:日志 MARK:标记

1|4三. 源/目的转发实例


1.源NAT(SNAT)
更改所有来自192.168.1.0/24的数据包的源IP地址为123.4.5.100

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 123.4.5.100

2.目的NAT(DNAT)
更改所有来自192.168.1.0/24的数据包的目的ip地址为123.4.5.100

iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 123.4.5.100

3.IP映射实例
假设有这样的情况:A、B单位给自内网中部分用户要求建立自己的Web服务器对外发布信息。我们可以在防火墙的外部网卡上绑定多个合法公网IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的Web服务器上,并将该内部Web服务器的响应包伪装成该公网IP发出的包。

节点内网IP公网IP
A单位Web服务器 192.168.1.100 123.4.5.100
B单位Web服务器 192.168.1.200 123.4.5.200
linux防火墙 192.168.1.1(eth1) 123.4.5.1(eth0)

在进行NAT之前,我们需要先将分配给A、B单位的公网ip绑定到防火墙的外网接口:

ifconfig eth0 add 123.4.5.100 netmask 255.255.255.0 ifconfig eth0 add 123.4.5.200 netmask 255.255.255.0

对防火墙接收到的目的ip为123.4.5.100和123.4.5.200的所有数据包进行目的NAT(DNAT):

iptables -A PREROUTING -i eth0 -d 123.4.5.100 -j DNAT --to 192.168.1.100 iptables -A PREROUTING -i eth0 -d 123.4.5.200 -j DNAT --to 192.168.1.200

其次,对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT):

iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 123.4.5.100 iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 123.4.5.200

这样,所有目的ip为123.4.5.100和123.4.5.200的数据包都将分别被转发给192.168.1.100和192.168.1.200;
而所有来自192.168.1.100和192.168.1.200的数据包都将分别被伪装成由123.4.5.100和123.4.5.200,从而也就实现了ip映射。

iptables -t nat -A PREROUTING -d 公网ip -p tcp --dport 公网端口 -j DNAT --to 内网ip:内网服务端口 iptables -t nat -A POSTROUTING -d 内网ip -p tcp --dport 内网服务端口 -j SNAT --to-source 网关外网IP
节点内网IP(eth0)公网IP(eth1)
网关 10.0.0.1 123.4.5.100
内网主机 10.0.0.20  

例:把内网ssh服务映射到外网。iptables规则配置如下:

iptables -t nat -A PREROUTING -d 123.4.5.100 -p tcp --dport 2222 -j DNAT --to-destination 10.0.0.20:22 iptables -t nat -A POSTROUTING -d 10.0.0.20 -p tcp --dport 22 -j SNAT --to-source 123.4.5.100

把访问公网123.4.5.100:2222的数据包转发到了内网10.0.0.20:22

1|5四.端口转发实例


1.本机端口转发

把发往本机80端口的数据重定向到8080端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

2.远程端口转发

把访问123.4.5.100:8080的数据包转发到123.4.5.200:80

iptables -t nat -A PREROUTING -d 123.4.5.100 -p tcp --dport 8080 -j DNAT --to-destination 123.4.5.200:80

多网卡问题:iptables学习笔记:端口转发命令优化


__EOF__

作  者:ssooking
出  处:https://www.cnblogs.com/ssooking/p/7890192.html

以上是关于iptables转发规则改变源地址无效?的主要内容,如果未能解决你的问题,请参考以下文章

iptables转发技术

iptables nat 技术转发

iptables转发技术(NAT)

iptables防火墙

iptable masquerade中源地址选择问题

iptables防火墙