Linux内核参数之rp_filter

Linux内核参数之rp_filter,第1张

rp_filter参数用于控制系统是否开启对数据包源地址的校验。

首先看一下Linux内核文档 documentation/networking/ip-sysctl.txt 中的描述:

rp_filter - INTEGER

0 - No source validation.

1 - Strict mode as defined in RFC3704 Strict Reverse Path

Each incoming packet is tested against the FIB and if the interface

is not the best reverse path the packet check will fail.

By default failed packets are discarded.

2 - Loose mode as defined in RFC3704 Loose Reverse Path

Each incoming packet's source address is also tested against the FIB

and if the source address is not reachable via any interface

the packet check will fail.

Current recommended practice in RFC3704 is to enable strict mode

to prevent IP spoofing from DDos attacks. If using asymmetric routing

or other complicated routing, then loose mode is recommended.

The max value from conf/{all,interface}/rp_filter is used

when doing source validation on the {interface}.

Default value is 0. Note that some distributions enable itin startup scripts.

即rp_filter参数有三个值,0、1、2,具体含义:

0:不开启源地址校验。

1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。

2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。

假设机器有2个网口:

eth0: 192.168.1.100

eth1:200.153.1.122

数据包源IP:10.75.153.98,目的IP:200.153.1.122

系统路由表配置为:

[root@localhost ~]# route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

default      192.168.1.234      0.0.0.0    UG    0      0        0 eth0

192.168.120.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

10.75.153.98    0.0.0.0         255.255.255.0   U     0      0        0 eth0

系统rp_filter参数的配置为:

[root@localhost ~]# sysctl -a | grep rp_filter

net.ipv4.conf.all.rp_filter=1

net.ipv4.conf.default.rp_filter=1

如上所示,数据包发到了eth1网卡,如果这时候开启了rp_filter参数,并配置为1,则系统会严格校验数据包的反向路径。从路由表中可以看出,返回响应时数据包要从eth0网卡出,即请求数据包进的网卡和响应数据包出的网卡不是同一个网卡,这时候系统会判断该反向路径不是最佳路径,而直接丢弃该请求数据包。(业务进程也收不到该请求数据包)

解决办法:

1.修改路由表,使响应数据包从eth1出,即保证请求数据包进的网卡和响应数据包出的网卡为同一个网卡。

2.关闭rp_filter参数。(注意all和default的参数都要改)

1)修改/etc/sysctl.conf文件,然后sysctl -p刷新到内存。

2)使用sysctl -w直接写入内存:sysctl -w net.ipv4.conf.all.rp_filter=0

3)修改/proc文件系统: echo "0">/proc/sys/net/ipv4/conf/all/rp_filter

1. 减少DDoS攻击

校验数据包的反向路径,如果反向路径不合适,则直接丢弃数据包,避免过多的无效连接消耗系统资源。

2. 防止IP Spoofing

校验数据包的反向路径,如果客户端伪造的源IP地址对应的反向路径不在路由表中,或者反向路径不是最佳路径,则直接丢弃数据包,不会向伪造IP的客户端回复响应。

1. DDos攻击(Distribute Deny of Service)

分布式拒绝服务攻击。通过构造大量的无用数据包向目标服务发起请求,占用目标服务主机大量的资源,还可能造成网络拥塞,进而影响到正常用户的访问。

2. IP Spoofing(IP欺骗)

IP Spoofing指一个客户端通过伪造源IP,冒充另外一个客户端与目标服务进行通信,从而达到某些不可告人的秘密。

我按下面这个配置成功了,你可以试下:

一、安装的前提条件

1.确保安装了网卡并工作正常

使用命令

#ifconfig eth0

查看网卡状态,然后关闭ifdown eth0,注意一定要关闭ifdown eth0

2.在系统中不要设置默认路由(网关),让ADSL拨号后自动获得

如果已经设置了默认路由,使用以下方法删除:

在文件 /etc/sysconfig/network 中删除 GATEWAY= 这一行,然后以root执行:

#/etc/rc.d/init.d/network restart

3.已经安装了pppd软件包

如果存在文件 /usr/sbin/pppd,则说明已经安装了pppd

如果未安装,从RedHatLinux 6.2安装光盘上安装ppp-2.3.11-

4.i386.rpm这个软件包

二、安装PPPOE客户端软件

Linux下的PPPOE客户端软件比较多,而且大多使用GNU License,我们推荐使用rp-pppoe 这个软件包。从http://www.roaringpenguin.com/pppoe/这个网站上,不仅可以下载

RedHat 62平台下的rp-pppoe的二进制软件包,而且可以下载源代码软件包。

1.二进制软件包的安装:

A.下载二进制软件包

http://www.roaringpenguin.com/pppoe/rp-pppoe-3.2-1.i386.rpm

B.进行安装

以root执行:

#rpm -Uvh rp-pppoe-3.2-1.i386.rpm

2.从源代码进行安装:

从源代码进行安装同样适用于其它平台的Linux,但必须在Linux系统中安装gcc编译器。

A.下载源代码软件包

http://www.roaringpenguin.com/pppoe/rp-pppoe-3.2.tar.gz

B.解压缩

#tar xvfz rp-pppoe-3.2.tar.gz

#cd rp-pppoe-3.2

C.进行编译和安装

运行脚本

#./go

将自动进行编译和安装,最后,调用/usr/sbin/adsl-setup进行配置,具体解释见三。

三、配置PPPOE客户端软件

安装完软件包后,必须配置pppoe的配置文件/etc/ppp/pppoe.conf,从而让ADSL拨号时使用配置文件中的用户名、密码等参数。我们不必手工改动这个文件,可以使用adsl-setup这个工具进行配置:

#/usr/sbin/adsl-setup

当出现

>>>Enter your PPPoE user name :

输入ADSL帐号的用户名

当出现

>>>Enter the Ethernet interface connected to the ADSL modem

For Solaris, this is likely to be something like /dev/hme0.

For Linux, it will be ethn, where 'n' is a number.

(default eth0):

输入 eth0 ,这是ADSL相连的网卡的名字

当出现

>>>Enter the demand value (default no):

输入 no

当出现

>>>Enter the DNS information here:

输入 server ,这表示使用ADSL拨号自动获得的DNS服务器IP地址

当出现

>>>Please enter your PPPoE password:

输入ADSL帐号的密码

当出现

>>>Choose a type of firewall (0-2):

输入 0 ,不使用防火墙

当出现

>>>Accept these settings and adjust configuration files (y/n)?

如果输入的信息正确,输入 y ,完成配置,否则,输入 n 重新输入。

四、启动PPPOE客户端软件

使用命令

/usr/sbin/adsl-start 启动PPPOE客户端软件,进行连接,如果成功,将出现

Connected

如果不成功,请检查网线、ADSL MODEM等物理设备,并查看 /var/log/messages中的信息

/usr/sbin/adsl-stop 关闭和ISP的连接

/usr/sbin/adsl-status 查看当前连接的状态

如果想在Linux系统启动时自动启动ADSL连接,输入以下命令

#chkconfig --add adsl

将在当前的运行级下加入ADSL的自启动脚本

五、测试

当连接成功后,使用命令

#ifconfig -a

在输出中应该含有关于 ppp0 的一堆信息,其中还绑定了 IP 地址,说明已经从拨号中获得了IP地址。

使用命令

#netstat -nr

查看路由表信息,这时的默认路由应该是上面获得的IP地址。

如果没有默认路由,我们可以手动增加:

#route add default gw 上面获得的IP地址

使用命令

#nslookup www.sina.com.cn

如果解析出新浪的IP,说明已经从拨号中正确获得了DNS服务器

最后,使用命令ping某个域名或IP,如果有响应,表示你已经大功告成了。

六、其它说明

1、RedHat Linux 7.1已经集成了rp-pppoe这个软件包,只不过版本有些低,如果你不在意版本高低,可以直接进行三后面的步骤。

2、以后要拔号上网时,只要:

ifdown eth0

ifup ppp0

/usr/sbin/adsl-start


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7312190.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存