说明
- 收到下面一封邮件,简单来说就是需要一个虚拟机,外网能ping同,但端口全封,给他们做渗透用。
- 问了需求 不需要登录,封死所有端口。
所以 就用下面2个方式双重封死。
iptables拒绝所有端口放开特定端口方法流程
拒绝所有端口
-
命令:
-
iptables -P INPUT DROP
【我这就执行了这个进的】 -
iptables -P FORWARD DROP
-
iptables -P OUTPUT DROP
-
注:上面执行以后,看不到具体规则且
iptables -F
是无法清除上面规则的,同时ping也不能使用。 -
测试
允许所有端口
-
命令:
iptables -P INPUT ACCEPT
注:只有这个端口能放开上面拒绝的所有端口,iptables -F
是不能删除上面规则的。 -
验证
之前默认是已经封堵了,无法访问百度,允许以后,百度可以访问
允许特定端口
-
我这需要放开2个ip段的22端口【这是放开端口,下面hosts是ip策略,分开做的】
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-
更多说明
#允许已建立的连接通过【不执行也可以,但有些特定版本不执行这个可能下面规则不会生效】
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH 连接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP 连接
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许 HTTPS 连接
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
临时规则写入配置文件永久生效
- 上面做的是临时生效的,重启以后就没了,想要永久生效,执行下面命令【下面配置文件中的规则是基于iptables服务的,如果服务没启动,重启后下面规则依然不会生效】
- 命令
iptables-save > /etc/sysconfig/iptables
iptables允许ping和拒绝ping
- 首先,我执行
iptables -P INPUT DROP
命令以后,外部就ping不通了,我执行iptables -F
以后依然ping不通,折腾许久外部都无法ping通,我以为我网络出问题了,但每次重启就好,后来才发现这个命令的规则-F清除不掉,卧槽。
禁止允许ping说明
- 下面内容来源网络整理,自行测试。
内核参数设置
禁止
- 临时禁止ping设置
echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
- 1
- 永久禁止ping设置
echo net.ipv4.icmp_echo_ignore_all=1 >> /etc/sysctl.conf
- 1
- 使/etc/sysctl.conf 配置文件生效
注意:如果/etc/sysctl.conf
配置文件里已经有net.ipv4.icmp_echo_ignore_all
字段了,那么直接用 vim 进去直接修改0或1即可。
sysctl -p
- 1
允许
- 临时允许ping设置
echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all
- 1
- 永久允许ping设置
echo net.ipv4.icmp_echo_ignore_all=0 >> /etc/sysctl.conf
- 1
- 使/etc/sysctl.conf 配置文件生效
注意:如果/etc/sysctl.conf
配置文件里已经有net.ipv4.icmp_echo_ignore_all
字段了,那么直接用 vim 进去直接修改0或1即可
sysctl -p
- 1
防火墙设置
- 注:使用以下方法的前提是内核配置是默认值,也就是内核没有禁ping
禁止
- 禁止PING设置
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
- 1
- 上面代码参数说明
--icmp-type 8 echo request 表示回显请求(ping请求)
0/0 表示所有 IP
允许
- 允许PING设置 【方式1】
进
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
- 1
- 允许PING设置 【方式2】
进
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
- 1
- 允许PING设置 【方式1】
出
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
- 1
- 允许PING设置 【方式2】
出
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
- 1
禁止ping
- 我这用的是这种方式
iptables -P INPUT DROP
【慎用,所以端口都无法进出】
允许ping
外部ping通虚拟机内部
- 我执行了下面命令以后
iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
【这条命令执行完外部就通虚拟机了】
iptables -A OUTPUT -o eth+ -p icmp --icmp-type 0 -j ACCEPT
【好像这个没生效?】
外部就可以ping通该虚拟机ip
虚拟机内部使用ping
- 但我发现,虚拟机内部不能使用ping了。我以为是面中的output没生效。
- 但我最后发现,换个方式执行INPUT以后,虚拟机内部就能使用ping了。
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
- 所以这里的output到底是啥逻辑?
- 但我最后发现,换个方式执行INPUT以后,虚拟机内部就能使用ping了。
规则详细
至此未知,现在的规则详细如下:
hosts阻止所有ip指定放开ip方法流程
其实上面的iptables已经限制的死死的了,但怕iptables出意外,所以用hosts加固一下
允许需要访问ip
- 这里以sshd服务为例,配置完成后,只允许配置允许的IP才能ssh连接本机服务器,其他IP拒绝
注:一定要先允许在拒绝所有 - 编辑hosts.allow配置文件
vi /etc/hosts.allow
- 1
- 2
- 允许1个或多个ip
末尾添加允许的IP远程登录本机服务器,如果有多个IP,以逗号隔开连续写即可
sshd:111.2.3.4,111.6.7.8.9
- 1
- 以段添加
添加允许的111.2.3网段的IP远程登录本机服务器
sshd:111.2.3.
- 1
内网地址出公网hosts放开地址说明
-
假如你现在用的内网ip地址访问的公网,你在虚拟机上放开你现在用的ip地址是没用的
如,我现在用的内网ip绑定的路由器,我把内网地址和我路由器地址都放开了,依然无法访问,放开ALL就能访问
-
如何看内网地址转换后访问过来的地址?
先放开all,正常登录上虚拟机,然后虚拟机里面执行lastlog
【这个命令会记录登录信息】
如下,可以看到我这公网出口地址是70.92结尾的ip
-
现在回到虚拟机内部,放开这个70.92的ip地址,注释ALL,即可正常访问了
拒绝所有
- 编辑hosts.deny配置文件
vi /etc/hosts.deny
- 1
- 拒绝所有所有IP远程登录本机服务器
末尾添加下面内容即可
sshd:ALL
- 1
- 我有控制台,为了验证生效,我先做的拒绝,再放开
脚本检测日志异常并自动执行封堵
- 可以动态封锁ip的,脚本如下,如果怕死循环影响虚拟机性能,可以把死循环去掉,用定时任务执行,比如每分钟、每小时执行一次这样。
#!/bin/bash
while true; do
# 读取系统日志文件进行监测
grep -E "sgdifi|wa/xzwas|wa/higehfd|wa" /var/log/system.log | while read -r log; do
# 解析日志行,获取用户信息和相关IP地址
username=$(echo "$log" | grep -oE "sgdifi|wa/xzwas|wa/higehfd|wa")
ip_address=$(echo "$log" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b")
# 锁定用户账户
lock_user_account "$username"
# 实施IP封堵
block_ip_address "$ip_address"
done
sleep 300 # 暂停5分钟后再次监测
done
lock_user_account() {
# 锁定用户账户的实际操作,这里作为示例,将用户添加到黑名单
echo "$1" >> /etc/blacklist.txt
}
block_ip_address() {
# 封堵IP地址的实际操作,这里作为示例,使用iptables命令封堵IP
iptables -A INPUT -s "$1" -j DROP
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 因为放开了攻击的ip,根据需求,还是需要采集用户和ip,所以就根据登录失败的信息,模拟处理方法
上面代码是GPT生成的,不好使,而且代码还有点问题不能直接使用,但思路是好的,我根据上面的思路,去掉了死循环,每分钟执行了一次
函数调用的形式写一个动态监控secure日志文件的sh脚本、过滤出secure日志异常用户名的ip并用iptables限制
评论记录:
回复评论: