Linux禁用ping

禁止ping会有诸多不便,但是其带来的好处有时也令人不忍放弃,比如我,我有一台VPS之前因为搭了个VPN,结果没过多久后就遭到了洪水攻击,你懂得。。。后来把ping禁止掉后,换了下ssh的端口,立马清静了~

 

关于禁止ping的方法看了下网上很多人的帖子,其方式无外乎两类。一类通过修改内存加载的控制文件直接禁掉所有ICMP协议,另一类就是通过配置防火墙iptables规则来实现了。这两类方法各有优缺点,以下分别进行阐述。

 

第一类:修改内存加载的控制文件/proc/sys/net/ipv4/icmp_echo_ignore_all

这个方法也有很多种,最简单的就是直接修改文件:

关闭ping

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

开启ping

echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all

另外也可以通过控制命令sysctl来控制

sysctl -w net.ipv4.icmp_echo_ignore_all=1
sysctl -p

注:sysctl设置和显示在/proc/sys目录中的内核参数.能用sysctl来设置或重新设置连网功能,如IP转发、IP碎片去除及源路由检查等。用户只需要编辑/etc/sysctl.conf文件,即可手工或自动执行由sysctl控制的功能。

sysctl [-n] [-e] -w variable=value
sysctl [-n] [-e] -p (default /etc/sysctl.conf)
sysctl [-n] [-e] -a

常用参数的意义:
-w  临时改动某个指定参数的值,如:sysctl -w net.ipv4.ip_forward=1
-a   显示所有的系统参数
-p  从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
如果仅仅是想临时改动某个系统参数的值,能用两种方法来实现,例如想启用IP路由转发功能:
1) #echo 1 > /proc/sys/net/ipv4/ip_forward
2) #sysctl -w net.ipv4.ip_forward=1
以上两种方法都可能即时开启路由功能,但如果系统重启,或执行了
# service network restart
命令,所设置的值即会丢失,如果想永久保留设置,能修改/etc/sysctl.conf文件
将 net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1

可见,该方法的优点在于其简单,但缺点确在于无法保持配置,而且直接修改配置文件禁用的是整个icmp协议,在很多情况下确实有其不便之处。

第二类:配置iptables防火墙规则

本人对iptables也只是个初学者,没法进行详细讲解,这里就贴几个网上找到的例子。

iptables普通配置文件 :

vim /etc/firewall.sh

iptables -F
iptables -N FIREWALL
iptables -F FIREWALL
iptables -A INPUT -j FIREWALL
iptables -A FORWARD -j FIREWALL
iptables -A FIREWALL -p tcp -m tcp –dport 110 –syn -j ACCEPT
# nginx web server
iptables -A FIREWALL -p tcp -m tcp –dport 80 –syn -j ACCEPT
# apache web server
iptables -A FIREWALL -p tcp -m tcp –dport 81 –syn -j ACCEPT
#ssh
iptables -A FIREWALL -p tcp -m tcp –dport 22 –syn -j ACCEPT
iptables -A FIREWALL -i lo -j ACCEPT
# dns
iptables -A FIREWALL -p udp -m udp –sport 53 -j ACCEPT
iptables -A FIREWALL -p tcp -m tcp –syn -j REJECT
iptables -A FIREWALL -p udp -m udp -j REJECT
#禁ping
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
#开启ping
#iptables -D INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP

生成firewall.sh文件

权限
chmod 755 /etc/firewall.sh

修改配置文件

vim /etc/init.d/rc.local

在最后一行加上
sh /etc/firewall.sh

iptables屏蔽IP :
#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP

查看已配置的规则,使用如下命令

iptables -L

会输出以下内容

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

上面的规则说明,允许任何人从任何地方访问。

首先来创建一个Iptables的文件

nano /etc/iptables.test.rules

输入以下规则

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn’t use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp –dport 80 -j ACCEPT
-A INPUT -p tcp –dport 443 -j ACCEPT

# Allows SSH connections for script kiddies
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state –state NEW –dport 30000 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
-A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT

# log iptables denied calls (access via ‘dmesg’ command)
-A INPUT -m limit –limit 5/min -j LOG –log-prefix “iptables denied: ” –log-level 7

# Reject all other inbound – default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

这看到比较复杂,但细看每一部分,你会发现,它只是关闭除了我们允许的所有端口,在这种情况下是80和443端口(标准的网络浏览器的端口)和前面定义的SSH端口。

激活这些新的规则

iptables-restore < /etc/iptables.test.rules

再来看看有什么不同

iptables -L

我们看到,只有上面定义的端口是关闭的,其余都是关闭的。如果是这样的,将保存Iptables文件

iptables-save > /etc/iptables.up.rules

为了确保iptables规则开始重新启动,我们将创建一个新的文件

nano /etc/network/if-pre-up.d/iptables

输入下面内容

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

更改一下权限

chmod +x /etc/network/if-pre-up.d/iptables

#添加屏蔽IP
#禁止此IP访问服务器
iptables -I INPUT -s 1.2.3.4 -j DROP

iptables -A INPUT -s 1.2.3.4 -j DROP
#禁止服务器访问此IP
iptables -A OUTPUT -d 1.2.3.4 -j DROP
如果要封某个网段:
iptables -I INPUT -s 1.2.3.0/24 -j DROP

#清空屏蔽IP
iptables -t filter -D INPUT -s 1.2.3.4 -j DROP
iptables -t filter -D OUTPUT -d 1.2.3.4 -j DROP

#一键清空所有规则
iptables -F

#查看

iptables -L INPUT

iptables -L

iptables-save(此命令将保存规则,下次开机自动执行)

#处理IP碎片数量,防止攻击,允许每秒100个
iptables -A FORWARD -f -m limit –limit 100/s –limit-burst 100 -j ACCEPT
#设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包
iptables -A FORWARD -p icmp -m limit –limit 1/s –limit-burst 10 -j ACCEPT

 

 

 

 

Lighttpd下的https强制跳转

考虑到以后可能会出现的敏感内容,于是申请并且安装了个免费的startssl的证书,然后~打算看看怎么才能强制使用ssl连接。。。

以下内容摘自:http://redmine.lighttpd.net/projects/1/wiki/HowToRedirectHttpToHttps

 

How to redirect HTTP requests to HTTPS

Since 1.4.19 the following should work. For older versions check the history of this page… or just update, srsly.

Example 1 – redirect everything

$HTTP["scheme"] == "http" {
    # capture vhost name with regex conditiona -> %0 in redirect pattern
    # must be the most inner block to the redirect rule
    $HTTP["host"] =~ ".*" {
        url.redirect = (".*" => "https://%0$0")
    }
}

Example 2 – specific url

$HTTP["scheme"] == "http" {
    $HTTP["host"] =~ ".*" {
        url.redirect = ("^/phpmyadmin/.*" => "https://%0$0")
    }
}

Example 3 – only for specific vhost and url

$HTTP["scheme"] == "http" {
    $HTTP["host"] == "sth.example.com" {
            url.redirect = ("^/phpmyadmin/.*" => "https://sth.example.com$0")
    }
}

Further stuff

Also works the other way round (https -> http) with if $HTTP["scheme"] == "https"

Lighttpd重定向配置

有时候需要将一个url重定向到另外一个url上。 如最简单的将不带www的域名重定向到www上,例如将domain.com重定向到www.domain.com上。这时候,Lighttpd的mod_redirect模块就起作用了。

这时候就可以使用mod_redirect模块。 如上面的例子可以在/etc/lighttpd/lighttpd.conf中使用下面的代码来解决:
1. 激活配置文件中的mod_redirect模块,去掉其前面的#
2. 插入下面代码

1
2
3
4
5
$HTTP["host"] =~ "^([^.]+.[^.]+)$" {
  url.redirect = (
      ".*" => "http://www.%1"
  )
}

其中,%1表示$HTTP[“host”] 中正则表达式中括号中匹配的内容。%1表示第一个匹配值,%2表示第二个匹配值。%0表示整个字符串

再如,希望把www.prosight.me/blog/index.php/2009/03/archives/321这样的url跳转到blog.prosight.me/index.php/2009/03/321这个url上的话,就使用如下配置:

1
2
3
4
5
6
7
$HTTP["host"] == "www.prosight.me" {
  url.redirect = (
       "^/blog/index.php/([0-9]+/[0-9]+)/archives/([0-9]+)$"
       => "http://blog.prosight.me/index.php/$1/$2",
       "^/blog(/)?$" => "http://blog.prosight.me"
  )
}

其中  $1表示在url.redirect里正则表达式中第一个括号匹配的内容,$2表示第二个匹配的内容,以此类推。

url.redirect可以放置在任何$HTTP[“host”] 块中,与其他模块共同使用。例如与rewrite一同使用,或者跟server.document-root属性一起使用来共同配置一个虚拟主机。

 

Lighttpd、Apache强制跳转https

这两者其实质都是通过重定向来实现的,只不过lighttpd不能使用.htaccess文件,所以它的配置是写在lighttpd.conf配置文件下的。两者方法如下

Lighttpd:

#vi /etc/lighttpd/lighttpd.conf

添加如下内容:

$HTTP[“scheme”] == “http” {
# capture vhost name with regex conditiona -> %0 in redirect pattern
# must be the most inner block to the redirect rule
$HTTP[“host”] =~ “.*” {
url.redirect = (“.*” => “https://%0$0”)
}
}

Apache:

Apache的重定向可以写在配置文件(具体位置根据安装方法不同,我的使用Debian下直接apt-get的,其路径为 /etc/apache2/sites-enabled/000-default)

也可以直接写在目录的.htaccess文件下

如果需要整站跳转,则在网站的配置文件的<Directory>标签内,键入以下内容:

RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$ //也可以这么写RewriteCond %{HTTPS} off,呵呵,下面的例子又是一种写法,至于为什么,自己想去
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [L,R]
如果对某个目录做https强制跳转,则复制以下代码:
RewriteEngine on
RewriteBase /yourfolder
RewriteCond %{SERVER_PORT} !^443$
#RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [L,R]
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

或者这样

#RewriteCond %{HTTP_HOST} !=’你的域名(包括引号,不带http前缀哦)’ [NC,OR]
#RewriteCond %{HTTPS} !=on [NC]
#RewriteRule ^(.*)$ https://’你的域名加访问路径(含引号)’%{REQUEST_URI} [L,R=301]
如果只需要对某个网页进行https跳转,可以使用redirect 301来做跳转!

redirect 301  /你的网页 https://你的主机+网页

其实,rewrite规则就是正则表达式,具体的怎么写法,等有时间再整理下。

 

开启apache的rewrite模块

Lighttpd开启伪静态跳转没啥说的,直接在配置文件里加上mod_rewrite模块就好,至于apache其实也是非常简单的,开启模块后配置文件里改几个参数就好。

首先,开启rewrite模块。

 

Command代码
  1. a2enmod rewrite

 

接着,修改配置文件,支持.htaccess,我的是默认安装的修改配置文件

 

Command代码
  1. vi /etc/apache2/sites-enabled/000-default

查找AllowOverride参数,将None改为all

<Directory />
   Options FollowSymLinks
   AllowOverride None
</Directory>
改为
<Directory />
   Options FollowSymLinks
   AllowOverride All
</Directory>
好了,现在可以直接把rewrite规则写到.htaccess下啦。