iptable masquerade中源地址选择问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptable masquerade中源地址选择问题相关的知识,希望对你有一定的参考价值。

参考技术A

在iptable/ip6table上可以在nat table上完成SNAT和DNAT操作。SNAT指将匹配ip包的源地址进行修改,DNAT指将匹配ip包的目的地址进行修改。

在iptables命令上,SNAT书写规则需要写下SNAT转换的目标地址,这里必须明确写出自己需要转换成的地址
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j snat –to-source 192.168.5.3-192.168.5.5
但是在某些场合,iptable规则编写的时候源ip地址并不固定或可获取。那么此时Linux引入了masquerade动作,这个规则的意思就是Ip包从哪个interface出去,那么src ip就转换为此interface的ip地址。

那么当一个interface上有多个ip地址的时候怎么办呢?例如下面的接口eth0有两个相同网段的ip地址,那么masquerade会选择哪一个ip作为源ip地址呢?例如下面的情况

总体上来讲,masquerade在选择源ip地址时刻的选择规则其实和路由选择的源地址选择是一致的。最简单的获取masquerade源地址的方法是通过下面命令:
ip route get <dstip>
这在Linux源码上看得更清楚,下面是ipv4场景下masquerade选源路由的方法

上表中inet_select_addr(out,nh,RT_SCOPE_UNIVERSE)就是根据out,路由,选择源ip地址的过程。

在ipv4场景上,masquerade 源地址选择和路由源地址选择是也就是一致的,但是在ipv6场合就有一定的区别了。
ipv6场景下masquerade动作的执行函数为:

可见它的核心函数为ipv6_dev_get_saddr(),此函数执行的就是ipv6地址协议规定的源地址选择逻辑。而ipv6路由选择源地址函数实现为:

可以看到在ipv6 路由选择源地址中,并不是第一选择ipv6_dev_get_saddr()函数的。而是先选择ipv6 route 表中选路结果是否设置了prefsrc。上述函数中入参rt表示的是ipv6 route 路由表选择的entry。ipv6路由选择具体由ip6_route_output()—>fib6_fule_lookup查询而来。
是否设置了ipv6路由的prefer src可以通过ip -6 route list 命令查看到,例如:

可以看到针对2001::/64网段的dest ip,选路是eth0,prefer src为 2001::dbc:71
设置路由entry的prefer src命令为:ip -6 route add 2001::/64 dev eth0 scope link src 2001::dbc:71 metric 15

ipv6协议中规定了严格源地址/目标地址选择机制,主要涉及到RFC 3484.也就是说当ipv6源地址尚未确定时刻,按照RFC3484规定的 8条规则 选择一个源ip地址。这8条规则(rules)是有优先级的,从优先级从高到低排列如下:

所谓ipv6地址的scope(作用域)分为下面几类:

ipv6在选择地址时刻,还会进行目的地址和源地址的Label匹配,当匹配到固定的一对label时刻,匹配完成:
1.匹配时刻是按照目标地址最长前缀匹配方式,就是前缀匹配长度最长的label获胜,如此选出一个目标label;
2.按照源地址最长前缀匹配方式,找到一个label,这就是源label;

下面命令可以查看lpv6 address label
ip addrlabel list

单接口上有多个ip地址的时刻,masquerade源地址选择方式如下:

blog.csdn.net/dog250/article/details/87815123

iptables


MASQUERADE同样是做源地址转换,只不过防火墙会根据该策略自动查找可用的公网IP地址,适应变化的情况
?若接口使用ppp+,表示匹配ppp0、ppp1……中任意可用的拨号连接
?若需要演示操作,可以针对前一个SNAT策略的例子进行改写(因没有ADSL连接,接口仍然使用eth0):
先执行“iptables -t nat -F”清空nat表
再添加规则“iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE”

?讲解应用DNAT策略的基本步骤,其中涉及到的相关操作
?同样可适当强调:外网测试机并不需要将默认网关地址设为该Linux网关主机的IP地址
?确认路由功能状态时,可以执行sysctl命令查看:
[[email protected] ~]# sysctl -a | grep "ip_forward"
net.ipv4.ip_forward = 1

执行 “elinks http://218.29.30.29” 或者“lynx http://218.29.30.29”均可以进行测试
[[email protected] ~]# tail -f /var/log/httpd/access_log
218.29.30.29 - - [04/Jun/2009:14:35:53 +0800] "GET / HTTP/1.1" 200 15 "-" "ELinks/0.11.1 (textmode; Linux; 80x25-2)"


NAT转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to-source 218.29.30.31
先执行“iptables -t nat -F”清空nat表
再添加规则“iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE”
[[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
[[email protected] ~]# sysctl -a | grep "ip_forward" net.ipv4.ip_forward = 1
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
[[email protected] ~]# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2222 -j DNAT --to-destination
192.168.1.5:22
--------------------------理解ESTABLISHED
vm1
# iptables -P INPUT DROP
ping 192.168.56.201
ssh 192.168.56.201

全部失败
# iptables -A INPUT -p all -m state --state ESTABLISHED -j ACCEPT
ping 192.168.56.201
ssh 192.168.56.201
全部成功

vm2关闭防火墙
成功穿越反向防火墙。
tracerout 192.168.56.201 失败 ,原因看下面


--------------------------理解RELATE
vm1
# iptables -P INPUT DROP
# iptables -F
# iptables -A INPUT -p all -m state --state RELATED -j ACCEPT
tracerout 192.168.56.201 成功。由第一个包产生的其他回包都属于RELATE状态。


--------------------------理解NEW
vm1
OUTPUT默认策略为DROP。其他策略为ACCEPT
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT DROP
# iptables -F
ping 192.168.56.201
ssh 192.168.56.201
全部失败
# iptables -A OUTPUT -p all -m state --state ESTABLISHED,NEW -j ACCEPT


--------------------------理解INVALID
他需要特殊的第一条黑客工具产生,所以这里面紧急下面的用法。
通常应用在INPUT表的第一条。
# iptables -A INPUT -p all -m state --state INVALID -j DROP


--------------------------SNAT-内网访问外网
-------外网 --------------------网关防火墙-------------------内网PC1 192.168.56.202
10.0.100 eth0 eth1
10.0.1.200 192.168.56.200
内网:yum install elinks lynx -y
网关防火墙
# iptables -t nat -A POSTROUTING -s 192.168.56.202 -o eth0 -j SNAT --to-source 10.0.1.200
外网:httpd
# tailf /var/log/httpd/access_log


--------------------------DNAT-对外发布端口
外网:yum install elinks lynx -y
网关防火墙:
# iptables -t nat -A PREROUTING -i eth0 -d 10.0.1.200 -p tcp --dport 2345 -j DNAT --to-destination 192.168.56.202:80
内网:httpd
# tailf /var/log/httpd/access_log
内核模块存放位置
# ls /lib/modules/2.6.32-431.el6.x86_64/kernel/net/ipv4/netfilter/ //ipv4支持
# ls /lib/modules/2.6.32-431.el6.x86_64/kernel/net/ipv6/netfilter/ //ipv6支持
# ls /lib/modules/2.6.32-431.el6.x86_64/kernel/net/netfilter/ //同时支持
lsmod 查看当前的模块

 








































































以上是关于iptable masquerade中源地址选择问题的主要内容,如果未能解决你的问题,请参考以下文章

[转]IPTABLES中SNAT和MASQUERADE的区别

[转]IPTABLES中SNAT和MASQUERADE的区别

iptable filter nat MASQUERADE snat dat

iptables中DNATSNAT和MASQUERADE的理解

iptables SNAT和MASQUERATE

iptables防火墙