响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:sec:sysctl

sysctl脚本

本文讲述个人使用的sysctl脚本,用来设置几个与网络安全相关的内核参数,进一步提高安全性。

涉及参数的详细介绍在内核源代码的Documentation/networking/ip-sysctl.txt文档里,也可参考Ipsysctl-tutorial,同时本文也借鉴了Beyond Linux From Scratch的一些做法,在此一并感谢!

脚本框架

脚本遵循基本的脚本规范,提供start、stop、restart功能(其实这里用start/stop不够准确,用set/unset可能更恰当)。

基本框架如下:

start() {
...
}
 
stop() {
...
}
 
case "$1" in
'start')
	start
	;;
'stop')
	stop
	;;
'restart')
	stop
	start
	;;
*)
	echo "usage $0 start|stop|restart"
esac

脚本内容

当前的脚本模板可点击:rc.sysctl.ref

start()函数

忽略PING广播数据包:

# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

禁止源路由数据包:

# Disable Source Routed Packets
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
	echo 0 > $i
done

启用TCP SYN Cookie:

# Enable TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

禁止ICMP重定向数据包:

# Disable ICMP Redirect Acceptance
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
	echo 0 > $i
done

不发送重定向数据包:

# Don't send Redirect Messages
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
	echo 0 > $i
done

禁止反向路径数据包:

# Drop Spoofed Packets coming in on an interface, where responses
# would result in the reply going out a different interface.
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
	echo 1 > $i
done

在内核日志中记录非法地址数据包:

# Log packets with impossible addresses.
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
	echo 1 > $i
done

在内核日志中记录动态IP信息:

# be verbose on dynamic ip-addresses  (not needed in case of static IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr

禁止TCP拥塞通告:

# disable Explicit Congestion Notification
# too many routers are still ignorant
echo 0 > /proc/sys/net/ipv4/tcp_ecn

stop()函数

stop完全是start的逆操作,所以就没添加注释了:

echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
 
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
	echo 1 > $i
done
 
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
 
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
	echo 1 > $i
done
 
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
	echo 1 > $i
done
 
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
	echo 0 > $i
done
 
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
	echo 0 > $i
done
 
echo 0 > /proc/sys/net/ipv4/ip_dynaddr
 
echo 1 > /proc/sys/net/ipv4/tcp_ecn

参数说明

这里附上每个参数的说明(来自内核文档ip-sysctl.txt),不做翻译,避免歧义。

icmp_echo_ignore_broadcasts - BOOLEAN

If set non-zero, then the kernel will ignore all ICMP ECHO and TIMESTAMP requests sent to it via broadcast/multicast.

Default: 1

accept_source_route - BOOLEAN

Accept packets with SRR option.

conf/all/accept_source_route must also be set to TRUE to accept packets with SRR option on the interface.

default:

  • TRUE (router)
  • FALSE (host)

tcp_syncookies - BOOLEAN

Only valid when the kernel was compiled with CONFIG_SYNCOOKIES.

Send out syncookies when the syn backlog queue of a socket overflows. This is to prevent against the common 'SYN flood attack'.

Default: FALSE

Note, that syncookies is fallback facility. It MUST NOT be used to help highly loaded servers to stand against legal connection rate. If you see SYN flood warnings in your logs, but investigation shows that they occur because of overload with legal connections, you should tune another parameters until this warning disappear. See: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.

syncookies seriously violate TCP protocol, do not allow to use TCP extensions, can result in serious degradation of some services (f.e. SMTP relaying), visible not by you, but your clients and relays, contacting you. While you see SYN flood warnings in logs not being really flooded, your server is seriously misconfigured.

accept_redirects - BOOLEAN

Accept ICMP redirect messages.

accept_redirects for the interface will be enabled if:

  • both conf/{all,interface}/accept_redirects are TRUE in the case forwarding for the interface is enabled. or:
  • at least one of conf/{all,interface}/accept_redirects is TRUE in the case forwarding for the interface is disabled.

accept_redirects for the interface will be disabled otherwise.

default:

  • TRUE (host)
  • FALSE (router)

send_redirects - BOOLEAN

Send redirects, if router.

send_redirects for the interface will be enabled if at least one of conf/{all,interface}/send_redirects is set to TRUE, it will be disabled otherwise.

Default: TRUE

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 it in startup scripts.

log_martians - BOOLEAN

Log packets with impossible addresses to kernel log.

log_martians for the interface will be enabled if at least one of conf/{all,interface}/log_martians is set to TRUE, it will be disabled otherwise.

ip_dynaddr - BOOLEAN

If set non-zero, enables support for dynamic addresses.

If set to a non-zero value larger than 1, a kernel log message will be printed when dynamic address rewriting occurs.

Default: 0

tcp_ecn - INTEGER

Enable Explicit Congestion Notification (ECN) in TCP. ECN is only used when both ends of the TCP flow support it. It is useful to avoid losses due to congestion (when the bottleneck router supports ECN).

Possible values are:

  • 0 - disable ECN
  • 1 - ECN enabled
  • 2 - Only server-side ECN enabled. If the other end does not support ECN, behavior is like with ECN disabled.

Default: 2

应用

iptables脚本一样,很多Linux发行版都提供了自己的sysctl方案,最常用的就是/etc/sysctl.conf。为了保持系统整体性,可以参照sysctl的语法把要设置的参数转化成sysctl格式,从而能集成进去。

下面只讲述脚本在slackware下的使用方法。

slackware的脚本都存放在/etc/rc.d/目录下,故首先把脚本模板放到/etc/rc.d/目录下,改名为rc.sysctl:

cp rc.sysctl.ref /etc/rc.d/rc.sysctl

给新脚本增加执行权限:

chmod +x /etc/rc.d/rc.sysctl
网络接口启动以后有些参数设置才有效。在网络接口启动后,网络服务启动(rc.inet2)前运行脚本是一个不错的时机。但如果启用了IP转发(激活/etc/rc.d/rc.ip_forward脚本),由于启用IP转发会重置相关内核参数,所以sysctl脚本需要在rc.ip_forward脚本后运行。

由于时效性没有rc.iptables那么严格,不妨在/etc/rc.d/rc.local里运行。

编辑rc.local,添加:

# Initialize some networking parameters.
if [ -x /etc/rc.d/rc.sysctl ]; then
  . /etc/rc.d/rc.sysctl start
fi
computer/sec/sysctl.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1