当前位置:   article > 正文

1 Linux防火墙设置_echo-reply,2024年最新阿里P8大佬亲自讲解

echo-reply

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

#iptables -A INPUT -i ppp0 -p udp -sport 53 -j ACCEPT

让Linux服务器的80端口对外开放,执行如下规则即可

#iptables -A INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT

仅仅允许来自222.91.99.0/28的1024:65535端口范围的主机可以连接Linux代理服务器,其他来源的IP全部拒绝

#iptables -A INPUT -i ppp0 -p tcp -s 222.91.99.0/28 \

–sport 1024:65535 --dport 22 -j ACCEPT

#iptables -A INPUT -i ppp0 -p tcp --dport 22 -j DROP

在这里插入图片描述
iptables脚本自动拒绝恶意IP脚本

#!/bin/sh
#auto drop ssh failed IP address
#wugk 2013-1-2
#定义变量
SEC_FILE=/var/log/secure
#如下为截取secure文件恶意ip 远程登录22端口,大于等于4次就写入防火墙,禁止以后再登录服务器的22端口
IP_ADDR=tail -n 1000 /var/log/secure |grep "Failed password"| egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort -nr | uniq -c |awk ' $1>=4 {print $2}'
IPTABLE_CONF=/etc/sysconfig/iptables
echo
cat <<EOF
++++++++++++++welcome to use ssh login drop failed ip+++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++±-----------------------------------++++++++++++++++++
EOF
echo -n "请等待5秒后开始执行 "
for ((j=0;j<=4;j++)) ;do echo -n “----------”;sleep 1 ;done
echo
for i in echo $IP_ADDR
do
#查看iptables配置文件是否含有提取的IP信息
cat $IPTABLE_CONF |grep $i >/dev/null
if
[ $? -ne 0 ];then
#判断iptables配置文件里面是否存在已拒绝的ip,如何不存在就不再添加相应条目
sed -i “/lo/a -A INPUT -s $i -m state --state NEW -m tcp -p tcp --dport 22 -j DROP” $IPTABLE_CONF
else
#如何存在的话,就打印提示信息即可
echo “This is $i is exist in iptables,please exit …”
fi
done
#最后重启iptables生效
/etc/init.d/iptables restart

自动封/解封ip
需求背景:
discuz论坛,每天有很多注册机注册的用户,然后发垃圾广告帖子。虽然使用了一些插件但没有效果。分析访问日志,发现有几个ip访问量特别大,所以想到可以写个shell脚本,通过分析访问日志,把访问量大的ip直接封掉。
但是这个脚本很有可能误伤,所以还需要考虑到自动解封这些ip。
思路:
1 可以每分钟分析1次访问日志,设定一个阈值,把访问量大的ip用iptables封掉80端口
2 每20分钟检测一次已经被封ip的请求数据包数量,设定阈值,把没有请求的或者请求量很小的解封

#! /bin/bash

To block the ip of bad requesting.

Writen by aming 2017-11-18.

log=“/data/logs/www.xxx.com.log”
tmpdir=“/tmp/badip”
#白名单ip,不应该被封
goodip=“27.133.28.101”

[ -d $tmpdir ] || mkdir -p $tmpdir

t=date -d "-1 min"  +%Y:%H:%M

#截取一分钟以前的日志
grep “$t:” $log > $tmpdir/last_min.log

#把一分钟内日志条数大于120的标记为不正常的请求
awk ‘{print $1}’ $tmpdir/last_min.log |sort -n |uniq -c |sort -n |tail |awk '$1>120 {print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲'|grep -v "good_ip"> $tmpdir/bad.ip

d3=date +%M

#每隔20分钟解封一次ip
if [ $d3 -eq “20” ] || [ $d3 -eq “40” ] || [ $d3 -eq “00” ]
then
/sbin/iptables -nvL INPUT|grep ‘DROP’ |awk '$1<10 {print KaTeX parse error: Expected 'EOF', got '}' at position 2: 8}̲'>tmpdir/good.ip
if [ -s $tmpdir/good.ip ]
then
for ip in cat $tmpdir/good.ip
do
/sbin/iptables -D INPUT -p tcp --dport 80 -s i p − j D R O P d 4 = ‘ d a t e + e c h o " ip -j DROP d4=`date +%Y%m%d-%H:%M` echo " ipjDROPd4=date+echo"d4 i p u n b l o c k " > > ip unblock" >> ipunblock">>tmpdir/unblock.ip
done
fi

#解封后,再把iptables的计数器清零
/sbin/iptables -Z INPUT
fi

if [ -s $tmpdir/bad.ip ]
then
for ip in cat $tmpdir/bad.ip
do
/sbin/iptables -A INPUT -p tcp --dport 80 -s i p − j D R O P d 4 = ‘ d a t e + e c h o " ip -j DROP d4=`date +%Y%m%d-%H:%M` echo " ipjDROPd4=date+echo"d4 i p b l o c k " > > ip block" >> ipblock">>tmpdir/block.ip
done
fi

  1. 允许进来的(incoming)HTTP

iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

  1. 多端口(允许进来的 SSH、HTTP 和 HTTPS)

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

  1. 允许出去的(outgoing)SSH

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

  1. 允许外出的(outgoing)SSH,但仅访问某个特定的网络

#iptables -A OUTPUT -o eth0 -p tcp -d 192.168.101.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

  1. 允许外出的(outgoing) HTTPS

iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

  1. 对进来的 HTTPS 流量做负载均衡

#iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
#iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
#iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

在这里插入图片描述
12. 从内部向外部 Ping

iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

  1. 从外部向内部 Ping

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

丢弃来自192.168.233.131的协议数据,使其他服务器ping不通192.168.233.131这台主机
ps : 如果不-s指定ip源的话,系统会默认所有网卡ip
ps : 如果增加规则不生效,有可能是被其他优先级较高的规则覆盖了;将规则iptables -F临时删除该生效了

iptables -A INPUT -s 192.168.233.131 -p icmp -j DROP

  1. 允许环回(loopback)访问

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

  1. 允许 packets 从内网访问外网

if eth1 is connected to external network (internet)

if eth0 is connected to internal network (192.168.1.x)

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

  1. 允许外出的 DNS

iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

  1. 允许 NIS 连接

rpcinfo -p | grep ypbind ; This port is 853 and 850

#iptables -A INPUT -p tcp --dport 111 -j ACCEPT
#iptables -A INPUT -p udp --dport 111 -j ACCEPT
#iptables -A INPUT -p tcp --dport 853 -j ACCEPT
#iptables -A INPUT -p udp --dport 853 -j ACCEPT
#iptables -A INPUT -p tcp --dport 850 -j ACCEPT
#iptables -A INPUT -p udp --dport 850 -j ACCEPT

  1. 允许某个特定网络 rsync 进入本机

#iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

  1. 仅允许来自某个特定网络的 MySQL 的链接

#iptables -A INPUT -i eth0 -p tcp -s 192.168.200.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

  1. 允许 Sendmail 或 Postfix

iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

  1. 允许 IMAP 和 IMAPS

#iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
#iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

  1. 允许 POP3 和 POP3S

#iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
#iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT

  1. 防止 DoS 攻击

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

  1. 设置 422 端口转发到 22 端口

#iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
#iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

将代理服务器的80端口重定向到8009端口

#iptables -t nat -A PREROUTING -p tcp --dport 80

-j REDIRECT --to-ports 8009

  1. 为丢弃的包做日志(Log)

iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
iptables -A LOGGING -j DROP

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5、Linux之iptables端口转发:外网访问内网

0 背景
考虑一种网络拓扑应用情景,一个内部局域网中有多台服务器提供不同的服务,如web服务、FTP服务、ssh、telnet等,通过服务器(或网关、防火墙)连接外部网络,如果外部网络上的主机需要访问这些服务器,则需要在网关上实现转发。
再转述成另一种应用场合,多台设备连接到一台服务器,服务器有2个网卡,分别连接内外网。外网无法直接访问设备上的数据、服务。在服务器上实现转发后,则可达到目的。
网络拓扑如下:
在这里插入图片描述
比如,可以通过服务器的8081端口访问1号设备的web服务,8082端口访问2号设备web,这样可以在外部网络对内网设备进行参数配置、调整。类似地,通过2321访问1号设备的telnet服务,2322访问2号设备telnet,以方便登陆设备系统,进行设备状态监控,日志处理,等等。
本文将直接引用此网络拓扑图中的名称及IP地址。实际使用配置根据实际情况修改。另外说明一下,不必拘泥于本文给出的名称。像拓扑图中的“设备”,可以使用一台安装linux的服务器替换。其它的类似。

一、原理
在Linux系统使用iptables实现防火墙、数据转发等功能。iptables有不同的表(tables),每个tables有不同的链(chain),每条chain有一个或多个规则(rule)。本文利用NAT(network address translation,网络地址转换)表来实现数据包的转发。iptables命令要用-t来指定表,如果没有指明,则使用系统缺省的表“filter”。所以使用NAT的时候,就要用“-t nat”选项了。
NAT表有三条缺省的链,它们分别是PREROUTING、POSTROUTING和OUTPUT。
先给出NAT结构,如下图:
在这里插入图片描述
1、PREROUTING:在数据包传入时,就进到PREROUTIING链。该链执行的是修改数据包内的目的IP地址,即DNAT(变更目的IP地址)。
PREROUTING只能进行DNAT。因为进行了DNAT,才能在路由表中做判断,决定送到本地或其它网口。
2、POSTROUTING:相对的,在POSTROUTING链后,就传出数据包,该链是整个NAT结构的最末端。执行的是修改数据包的源IP地址,即SNAT。POSTROUTING只能进行SNAT。
3、OUTPUT:定义对本地产生的数据包的目的NAT规则。
每个数据包都会依次经过三个不同的机制,首先是PREROUTING(DNAT),再到路由表,最后到POSTROUTING(SNAT)。下面给出数据包流方向:
在这里插入图片描述
文中的网络拓扑图所示的数据包,是从eth0入,eth1出。但是,无论从eth0到eth1,还是从eth1到eth0,均遵守上述的原理。就是说,SNAT和DNAT并没有规定只能在某一个网口(某一侧)。
顺便给出netfilter的完整结构图:
在这里插入图片描述
二、实现
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。
配置Linux系统的ip转发功能,首先保证硬件连通,然后打开系统的转发功能
cat /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1。可使用命令echo “1” > /proc/sys/net/ipv4/ip_forward 修改文件内容,重启网络服务或主机后效果不再。若要其自动执行,可将命令echo “1” > /proc/sys/net/ipv4/ip_forward 写入脚本/etc/rc.d/rc.local 或者在/etc/sysconfig/network脚本中添加 FORWARD_IPV4=“YES”
但在我的系统中没有这两个文件,因此可以修改/etc/sysctl.conf文件,将net.ipv4.ip_forward=1的注释取消即可
根据拓扑图,一一实现不同IP、不同端口的映射,如下命令为一种示例形式:

第一台设备的telnet服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 23 -j SNAT --to 100.100.100.44

第二台设备的telnet服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 23 -j SNAT --to 100.100.100.44

第一台设备的web服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 80 -j SNAT --to 100.100.100.44

第二台设备的web服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 80 -j SNAT --to 100.100.100.44

以第一台设备转发命令为例,用白话解释一下。

  • 第一条是PREROUTING链,只能进行DNAT,该命令对从eth0进入且目的IP为172.18.44.44(注:可以用-s指明数据包来源地址,但这时无法知道来源IP是多少,虽然可以用网段的做法,但用-d则指定必须一定唯一的是本机的eth0地址,相对好一点),端口号为2321的数据包进行目的地址更改,更改为100.100.100.101,端口为23,亦即此包的目的地为第一台设备的telnet服务。
  • 第二条是POSTROUTING链,只能进行SNAT,即对先前已经DNAT过的数据包修改源IP地址。这样,这个数据包达到第一台设备时,源IP地址、目的IP地址,均为100.100.100.0/24网段了。

上述命令的SNAT有些冗余,可以做简化,命令如下:

第一台设备的telnet、web服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80

第二台设备的telnet、web服务

iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80

源IP地址SNAT

iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.0/24 -j SNAT --to 100.100.100.44

实际中使用的命令可能还有变化(简化),本文不再展示。

三、测试
为了保证文中所述的正确性,本节列出操作结果,以及实验过程的信息。服务器(网关)上的路由表如下:

root@latelee:test# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
100.100.100.0 * 255.255.255.0 U 0 0 0 eth1
172.18.0.0 * 255.255.0.0 U 0 0 0 eth0

可以看到服务器上有2个网卡,网段都不相同。iptables的NAT表如下:

root@latelee:~# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp – anywhere 172.18.44.44 tcp dpt:2324 to:100.100.100.101:23
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all – anywhere 100.100.100.0/24 to:100.100.100.44

可以看到,PREROUTING和POSTROUTING各有一条规则,这些规则由上文命令所产生。对应的,在第一号设备上查看路由信息,如下:

root@latelee:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
100.100.100.0 * 255.255.255.0 U 0 0 0 eth0
172.18.0.0 * 255.255.0.0 U 0 0 0 eth1
default 100.100.100.44 0.0.0.0 UG 0 0 0 eth0

可以看到这台设备有2个网卡,默认网关为服务器的IP地址。但是,其中一个网卡eth1竟然和PC所在网段相同!如果没有进行源IP地址修改(伪装),会匹配到eth1这个网口,无法匹配eth0。

在外网的PC上对设备进行telnet,设备抓包信息如下:

IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 1:4, ack 16, win 256, length 3
IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3
IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 4:25, ack 19, win 256, length 21
IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 19:34, ack 25, win 2190, length 15

可见,所有包的IP段都相同。在服务器上对内网eth1进行抓包,由于进行了DNAT和SNAT,此网卡数据包IP地址还是100.100.100.0/24网段,如下:

IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [.], ack 1, win 256, length 0
IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 1:16, ack 1, win 2190, length 15
IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [P.], seq 1:4, ack 16, win 256, length 3
IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3

但是,在服务器eth0抓包,将会是172.18.0.0/16的网段数据包:

IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [P.], seq 18:20, ack 154, win 255, length 2
IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [P.], seq 154:156, ack 20, win 2190, length 2
IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [F.], seq 156, ack 20, win 2190, length 0
IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [.], ack 157, win 255, length 0
IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [F.], seq 20, ack 157, win 255, length 0
IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [.], ack 21, win 2190, length 0

从抓包分析,本文所用命令已经能正确进行DNAT和SNAT了。

四、其它
建议在使用iptabls指令时,使用root用户进行操作,否则容易失败
保存iptables配置方法:

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

配置iptables开机加载

iptables-save > /etc/iptables.up.rules
echo -e ‘#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules’ > /etc/network/if-pre-up.d/iptables
chmod +x /etc/network/if-pre-up.d/iptables

本地测试指令

iptables -t nat -A PREROUTING -i wlan0 -d 192.168.11.100 -p tcp --dport 8081 -j DNAT --to 192.168.10.101:80

iptables -t nat -A POSTROUTING -o eth0 -d 192.168.10.101 -p tcp --dport 80 -j SNAT --to 192.168.10.52

6、iptables相关服务器高并发调优实战

如非必须,关掉或卸载iptables防火墙,并阻止kernel加载iptables模块。这些模块会影响并发性能。

单进程最大打开文件数限制

一般的发行版,限制单进程最大可以打开1024个文件,这是远远不能满足高并发需求的,调整过程如下:

在#号提示符下敲入:

ulimit –n 65535

将root启动的单一进程的最大可以打开的文件数设置为65535个。如果系统回显类似于“Operationnotpermitted”之类的话,说明上述限制修改失败,实际上是因为在中指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制。因此,就需要修改Linux系统对用户的关于打开文件数的软限制和硬限制。

第一步,修改limits.conf文件,并添加:

vim /etc/security/limits.conf

* soft nofile 65535

* hard nofile 65535

想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。

第二步,修改/etc/pam.d/login文件,在文件中添加如下行:

vim /etc/pam.d/login

sessionrequired /lib/security/pam_limits.so

这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。

第三步,查看Linux系统级的最大打开文件数限制,使用如下命令:

cat/proc/sys/fs/file-max

32568

这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)32568个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。修改此硬限制的方法是修改/etc/sysctl.conf文件内fs.file-max= 131072

这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为131072。修改完后保存此文件。

完成上述步骤后重启系统,一般情况下就可以将Linux系统对指定用户的单一进程允许同时打开的最大文件数限制设为指定的数值。如果重启后用ulimit-n命令查看用户可打开文件数限制仍然低于上述步骤中设置的最大值,这可能是因为在用户登录脚本/etc/profile中使用ulimit-n命令已经将用户可同时打开的文件数做了限制。由于通过ulimit-n修改系统对用户可同时打开文件的最大数限制时,新修改的值只能小于或等于上次ulimit-n设置的值,因此想用此命令增大这个限制值是不可能的。所以,如果有上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查找是否使用了ulimit-n限制了用户可同时打开的最大文件数量,如果找到,则删除这行命令,或者将其设置的值改为合适的值,然后保存文件,用户退出并重新登录系统即可。

通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。

内核TCP参数方面

Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。

下面介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:

netstat-n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

这个命令会输出类似下面的结果:

LAST_ACK16

SYN_RECV348

ESTABLISHED70

FIN_WAIT1229

FIN_WAIT230

我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。

编辑配置文件:/etc/sysctl.conf,在这个文件中,加入下面的几行内容:

vim /etc/sysctl.conf

net.ipv4.tcp_syncookies= 1

net.ipv4.tcp_tw_reuse= 1

net.ipv4.tcp_tw_recycle= 1

net.ipv4.tcp_fin_timeout= 30

输入下面的命令,让内核参数生效:

sysctl-p

简单的说明上面的参数的含义:

net.ipv4.tcp_syncookies= 1

表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse= 1

表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle= 1

表示开启TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭

net.ipv4.tcp_fin_timeout

修改系統默认的TIMEOUT 时间。

在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击。

此外,如果你的连接数本身就很多,我们可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:

net.ipv4.tcp_keepalive_time= 1200

net.ipv4.ip_local_port_range= 1024 65535

net.ipv4.tcp_max_syn_backlog= 8192

net.ipv4.tcp_max_tw_buckets= 5000

这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。

net.ipv4.tcp_keepalive_time= 1200

表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

ip_local_port_range= 1024 65535

表示用于向外连接的端口范围。缺省情况下很小,改为1024到65535。

net.ipv4.tcp_max_syn_backlog= 8192

表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets= 5000

表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000,改为5000。此项参数可以控制TIME_WAIT的最大数量,只要超出了。

内核其他TCP参数说明

net.ipv4.tcp_max_syn_backlog= 65535

记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.core.netdev_max_backlog= 32768

每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

net.core.somaxconn= 32768

例如web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

net.core.wmem_default= 8388608

net.core.rmem_default= 8388608

net.core.rmem_max= 16777216 #最大socket读buffer,可参考的优化值:873200

net.core.wmem_max= 16777216 #最大socket写buffer,可参考的优化值:873200

net.ipv4.tcp_timestsmps= 0

时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

net.ipv4.tcp_synack_retries= 2

为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries= 2

在内核放弃建立连接之前发送SYN包的数量。

#net.ipv4.tcp_tw_len= 1

net.ipv4.tcp_tw_reuse= 1

开启重用。允许将TIME-WAITsockets重新用于新的TCP连接。

net.ipv4.tcp_wmem= 8192 436600 873200

TCP写buffer,可参考的优化值:8192 436600 873200

net.ipv4.tcp_rmem = 32768 436600 873200

TCP读buffer,可参考的优化值:32768 436600 873200

net.ipv4.tcp_mem= 94500000 91500000 92700000

同样有3个值,意思是:

net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。

net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。

net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。
上述内存单位是页,而不是字节。可参考的优化值是:7864321048576 1572864

net.ipv4.tcp_max_orphans= 3276800

系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。

如果超过这个数字,连接将即刻被复位并打印出警告信息。

这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,

更应该增加这个值(如果增加了内存之后)。

net.ipv4.tcp_fin_timeout= 30

如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

同时还涉及到一个TCP 拥塞算法的问题,你可以用下面的命令查看本机提供的拥塞算法控制模块:

sysctlnet.ipv4.tcp_available_congestion_control

对于几种算法的分析,详情可以参考下:TCP拥塞控制算法的优缺点、适用环境、性能分析,比如高延时可以试用hybla,中等延时可以试用htcp算法等。

如果想设置TCP 拥塞算法为hybla

net.ipv4.tcp_congestion_control=hybla

额外的,对于内核版高于于3.7.1的,我们可以开启tcp_fastopen:

net.ipv4.tcp_fastopen= 3

将本地的 80 端口的请求转发到 8080 端口,本机地址 10.0.0.254,写出命令

iptables -t nat -A PRETOUTING -d 10.0.0.254 -p tcp --dprot 80 -j NDAT --to-destination 10.0.0.254:8080

7、禁止 192.168.0.0/24 网段访问服务器

iptables -I INPUT -s 192.168.0.0/24 -j DROP

8、linux DDos & CC防护之(二)实用的iptables规则集

完整的IPtables Anti-DDoS规则

1: 丢弃无效的数据包

#/sbin/iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP

/sbin/iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
#阻止不是SYN的新数据包,
#这将阻止所有不使用SYN标志的新数据包(不属于已建立的连接)。此规则类似于“阻止无效数据包”,但我们发现它捕获了其他数据包未捕获的一些数据包。此规则将阻止所有不是SYN数据包并且不属于已建立的TCP连接的数据包

2: 丢弃新的非SYN的TCP数据包

/sbin/iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

3: 丢弃具有可疑MSS值的SYN数据包

/sbin/iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

4: 阻止带有虚假TCP标志的数据包

#iptables -t mangle -A PREROUTING -m conntrack –ctstate INVALID -j DROP 如果使用这条命令,就不需要下面的命令
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
#上面的规则集阻止使用伪造的TCP标志的数据包。合法数据包不会使用的TCP标志。

5: 阻止欺骗性数据包

#这些规则将阻止源自私有(本地)子网的欺骗性数据包。在您的公共网络接口上,您通常不希望接收来自私有源IP的数据包。
#仅前面五组规则就已经以很高的数据包速率阻止了许多基于TCP的DDoS攻击,使用前文提到的内核设置和规则,您将能够以线速过滤ACK和SYN-ACK攻击
/sbin/iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP
/sbin/iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP

6: 删除ICMP(您通常不需要此协议)

#/sbin/iptables -t mangle -A PREROUTING -p icmp -j DROP

7: 掉落所有链条中的碎片

/sbin/iptables -t mangle -A PREROUTING -f -j DROP

8: 限制每个源IP的连接

#该iptables规则有助于抵御连接攻击。它拒绝来自拥有111多个已建立连接的主机的连接。如果遇到任何问题,则应提高该限制,因为这可能会给建立大量TCP连接的合法客户端造成麻烦。
/sbin/iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset

9: 限制RST报文 (作用不大)###

#限制客户端每秒可以建立的新TCP连接。这对于抵御连接攻击很有用,但对于SYN泛洪却没有太大帮助,因为通常使用无数种不同的欺骗源IP。
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 10/s --limit-burst 2 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP

10: 每秒限制每个源IP的新TCP连接

/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP

此规则阻止分段的数据包。通常,您不需要这些,阻塞片段将减轻UDP片段泛滥。但是大多数时候UDP碎片洪泛使用大量带宽,可能会耗尽网卡的容量,这使此规则成为可选规则,可能不是最有用的规则。
iptables -t mangle -A PREROUTING -f -j DROP

11: 在所有端口上使用SYNPROXY(禁用连接限制规则)

隐藏-解锁以上“使用SYNPROXY缓解SYN Floods”部分中的内容

虽然我们上面提供的iptables规则已经可以阻止大多数基于TCP的攻击,但是如果足够复杂,攻击类型仍然可以通过SYN泛滥。
重要的是要注意,如果我们找到要阻止的特定模式或签名,例如包长度(-m length),TOS(-m tos),TTL(-m ttl)或字符串,则规则的性能将始终更好。
和十六进制值(-m字符串和-m u32用于更高级的用户)。
但是在极少数情况下,这是不可能的,或者至少不容易实现。因此,在这些情况下,您可以使用SYNPROXY。
这是iptables SYNPROXY规则,可帮助缓解绕过其他规则的SYN泛洪:
这些规则适用于所有端口。如果您只想在活动的某些TCP端口上使用SYNPROXY(建议–还应使用mangle表和PREROUTING链来阻止所有未使用的TCP端口),则只需在每个规则中添加–dport 80如果只想在端口80上使用SYNPROXY。
iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack
iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

要验证SYNPROXY是否正常运行,您可以观看watch -n1 cat /proc/net/stat/synproxy。
如果在与使用SYNPROXY的端口建立新的TCP连接时值更改,则该值有效。

以下是一些其他iptables规则,这些规则可用于提高Linux服务器的整体安全性

SSH暴力保护

/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set
/sbin/iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

防止端口扫描

/sbin/iptables -N port-scanning
/sbin/iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN
/sbin/iptables -A port-scanning -j DROP

允许SSH和CIPE客户端的连接

#iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#iptables -A INPUT -p udp --sport 22 -j ACCEPT

firewalld 常见操作

firewall-cmd --state ##查看防火墙的状态
firewall-cmd --list-service # 查看开放的服务
firewall-cmd --get-service # 查看全部支持的服务
firewall-cmd --zone=public --list-ports # 查看开放的端口

firewall-cmd --reload ##重载防火墙规则,不会中断连接,清除临时配置,加载配置文件中的永久配置
firewall-cmd --complete-reload ##重载防火墙,中断用户的连接(清除规则,重建规则,在更新之前首先会将策略设置为DROP,等更新完成之后再恢复为ACCEPT)
firewall-cmd --panic-on ##紧急模式,强制关闭所有网络连接,–panic-off是关闭紧急模式
firewall-cmd --query-panic # 查看是否为应急模式

firewall-cmd --get-active-zones # 查看激活的域
firewall-cmd --zone=public --list-rich-rules # 查看添加的规则
firewall-cmd --set-default-zone=work ##更改默认的区域,

firewalld的区域zone介绍(默认共有9个)

#不同的区域之间的差异是其对待数据包的默认行为不同,firewalld的默认区域为public;
public(公开)
block(拒绝)
dmz(非军事化)
drop(丢弃)
external(外部)
home(家庭)
internal(内部)
trusted(信任)
work(工作区)

firewalld判断次序

#对于一个接收到的请求具体使用哪个zone,firewalld是通过三种方式来判断的:
1、source,来源地址
2、Interface,接收请求的网卡
3、firewalld配置的默认区域(zone)
这三个方式的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去找,如果前两个都找不到才会使用第三个默认区域。

#查询drop区域是否允许请求ssh和https服务的流量
firewall-cmd --zone=drop --query-service=ssh
firewall-cmd --zone=drop --query-service=https

配置文件介绍

#对端口的操作,如开放端口等信息,所以直接修改此文件也是可以的
/etc/firewalld/zones/public.xml

#配置文件结构(非常简单,主要有两个文件和三个目录)
文件:firewalld.conf、lockdown-whitelist.xml
目录:zones、services、icmptypes

#修改firewalld配置文件的方法(主要是三种)
1、firewall-config:是图形化工具
2、firewall-cmd: 命令行工具
3、直接编辑xml文件

动作中查看操作:

–get-icmptypes ##查看支持的所有ICMP类型
–get-zones ##查看所有区域
–get-default-zone ##查看当前的默认区域
–get-active-zones ##查看当前正在使用的区域
–get-services ##查看当前区域支持的服务
–list-services ##查看当前区域开放的服务列表
–list-all ##查看此区域内的所有配置,类似与iptables -L -n

新建–add或删除–remove规则:

–add-interface=eth0 ##将网络接口添加到默认的区域内
–add-port=12222/tcp --permanent ##添加端口到区域开放列表中
–add-port=5000-10000/tcp --permanent ##将端口范围添加到开放列表中;
–add-service=ftp --permanent ##添加服务到区域开放列表中(注意服务的名称需要与此区域支持的服务列表中的名称一致)
–add-source=192.168.1.1 ##添加源地址的流量到指定区域
–remove-source=192.168.1.1 ##删除源地址的流量到指定区域
–change-interface=eth1 ##改变指定的接口到其他区域
–remove-service=http ##在home区域内将http服务删除在开放列表中删除
–add-masquerade ##开启SNAT(源地址转换)
–query-masquerade ##查询SNAT的状态
–remove-interface=eth0 ##将网络接口在默认的区域内删除
–query-interface=eth0 ##确定该网卡接口是否存在于此区域
–add-forward-port=port=513:proto=tcp:toport=22:toaddr=192.168.100.101 ##端口转发

Rich规则选项:

–add-rich-rule=’rule’ ##新建rich规则
–remove-rich-rule=’rule’ ##删除rich规则
–query-rich-rule=’rule’ ##查看单条rich规则
–list-rich-rules ##查看rich规则列表

实例

开放单个端口(–permanent 表示永久生效,没有此参数重启后失效)

firewall-cmd --zone=public --add-port=80/tcp --permanent

开放端口范围

firewall-cmd --zone=public --add-port=8388-8389/tcp --permanent

添加服务,添加https

firewall-cmd --add-service=https --permanent

移除端口

firewall-cmd --zone=public --remove-port=80/tcp --permanent

Rich规则示例:
#拒绝从192.168.0.11的所有流量
firewall-cmd --permanent --zone=cla***oom --add-rich-rule=‘rule family=ipv4 source address=192.168.0.11/32 reject‘
#限制每分钟只有两个连接到ftp服务
firewall-cmd --add-rich-rule=’rule service name=ftp limitvalue=2/m accept’
#抛弃esp协议的所有数据包
firewall-cmd --permanent --add-rich-rule=‘rule protocol value=esp drop‘
#接受所有192.168.1.0/24子网端口范置7900-7905的TCP流量
firewall-cmd --permanent --zone=vnc --add-rich-rule=‘rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept‘
##开启SNAT
firewall-cmd --permanent --add-rich-rule=‘rule family=ipv4 source address=192.168.0.0/24 masquerade‘
##使用rule规则实现端口转发,to-addr选项如果不指定默认转发到本机
firewall-cmd --permanent --add-rich-rule=‘rule family=ipv4 source address=192.168.100.0/24 forward-port port=80 protocol=tcp to-port=8080 to-addr=192.168.100.100’

对 147.152.139.197 开放TCP 10000端口

firewall-cmd --permanent --zone=public --add-rich-rule=’
rule family=“ipv4”
source address=“147.152.139.197/32”
port protocol=“tcp” port=“10000” accept’

拒绝47.52.39.197 的TCP 10001端口:

firewall-cmd --permanent --zone=public --add-rich-rule=’
rule family=“ipv4”
source address=“47.52.39.197/32”
port protocol=“tcp” port=“10001” reject’

对192.168.0.1 这个IP全部放行

firewall-cmd --permanent --zone=public --add-rich-rule=’
rule family=“ipv4”
source address=“192.168.0.1/32” accept’;

开放所有权限给192.168.0.0/16 这个网段儿的主机

firewall-cmd --permanent --zone=public --add-rich-rule=’
rule family=“ipv4”
source address=“192.168.0.0/16” accept’;

#将原本访问本机888端口的流量转发到本机22端口
firewall-cmd --zone=drop --add-forward-port=port=888:proto=tcp:toport=22

#将原本访问本机888端口的流量转发到ip为192.168.2.208的主机的22端口,需要开启masquerade
firewall-cmd --zone=drop --add-masquerade
firewall-cmd --zone=drop --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.2.208

#伪装,将来自局域网192.168.2.0/24网段访问外网的流量映射为网络出口公网IP,即修改源IP地址
firewall-cmd --zone=drop --add-masquerade
firewall-cmd --zone=drop --add-rich-rule=“rule family=ipv4 source address=192.168.2.0/24 masquerade”

使用 firewalld 和 iptables 来控制网络流量

例 1:同时允许流入和流出的网络流量
TCP 端口 80 和 443 是 Apache web 服务器使用的用来处理常规(HTTP)和安全(HTTPS)网络流量的默认端口。你可以像下面这样在 enp0s3 接口上允许流入和流出网络流量通过这两个端口:

iptables -A INPUT -i enp0s3 -p tcp --dport 80-m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o enp0s3 -p tcp --sport 80-m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -i enp0s3 -p tcp --dport 443-m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o enp0s3 -p tcp --sport 443-m state --state ESTABLISHED -j ACCEPT

例 2:从某个特定网络中阻挡所有(或某些)流入连接
或许有时你需要阻挡来自于某个特定网络的所有(或某些)类型的来源流量,比方说 192.168.1.0/24:

iptables -I INPUT -s 192.168.1.0/24-j DROP

上面的命令将丢掉所有来自 192.168.1.0/24 网络的网络包,而

iptables -A INPUT -s 192.168.1.0/24–dport 22-j ACCEPT

将只允许通过端口 22 的流入流量。

例 3:将流入流量重定向到另一个目的地
假如你不仅使用你的 RHEL 7 机子来作为一个软件防火墙,而且还将它作为一个硬件防火墙,使得它位于两个不同的网络之间,那么在你的系统上 IP 转发一定已经被开启了。假如没有开启,你需要编辑 /etc/sysctl.conf 文件并将 net.ipv4.ip_forward 的值设为 1,即:

net.ipv4.ip_forward =1

接着保存更改,关闭你的文本编辑器,并最终运行下面的命令来应用更改:

#sysctl-p /etc/sysctl.conf

例如,你可能在一个内部的机子上安装了一个打印机,它的 IP 地址为 192.168.0.10,CUPS 服务在端口 631 上进行监听(同时在你的打印服务器和你的防火墙上)。为了从防火墙另一边的客户端传递打印请求,你应该添加下面的 iptables 规则:

iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 631-j DNAT --to 192.168.0.10:631

请记住 iptables 会逐条地读取它的规则,所以请确保默认的策略或后面的规则不会重载上面例子中那些规则。

FirewallD

要立刻生效且在随后重启后都可以让 http 和 https 网络流量通过防火墙,可以这样:

firewall-cmd --zone=MyZone–add-service=http

firewall-cmd --zone=MyZone–permanent --add-service=http

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ACCEPT

iptables -A OUTPUT -o enp0s3 -p tcp --sport 443-m state --state ESTABLISHED -j ACCEPT

例 2:从某个特定网络中阻挡所有(或某些)流入连接
或许有时你需要阻挡来自于某个特定网络的所有(或某些)类型的来源流量,比方说 192.168.1.0/24:

iptables -I INPUT -s 192.168.1.0/24-j DROP

上面的命令将丢掉所有来自 192.168.1.0/24 网络的网络包,而

iptables -A INPUT -s 192.168.1.0/24–dport 22-j ACCEPT

将只允许通过端口 22 的流入流量。

例 3:将流入流量重定向到另一个目的地
假如你不仅使用你的 RHEL 7 机子来作为一个软件防火墙,而且还将它作为一个硬件防火墙,使得它位于两个不同的网络之间,那么在你的系统上 IP 转发一定已经被开启了。假如没有开启,你需要编辑 /etc/sysctl.conf 文件并将 net.ipv4.ip_forward 的值设为 1,即:

net.ipv4.ip_forward =1

接着保存更改,关闭你的文本编辑器,并最终运行下面的命令来应用更改:

#sysctl-p /etc/sysctl.conf

例如,你可能在一个内部的机子上安装了一个打印机,它的 IP 地址为 192.168.0.10,CUPS 服务在端口 631 上进行监听(同时在你的打印服务器和你的防火墙上)。为了从防火墙另一边的客户端传递打印请求,你应该添加下面的 iptables 规则:

iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 631-j DNAT --to 192.168.0.10:631

请记住 iptables 会逐条地读取它的规则,所以请确保默认的策略或后面的规则不会重载上面例子中那些规则。

FirewallD

要立刻生效且在随后重启后都可以让 http 和 https 网络流量通过防火墙,可以这样:

firewall-cmd --zone=MyZone–add-service=http

firewall-cmd --zone=MyZone–permanent --add-service=http

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-bHGhy5Yf-1713265713657)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/920613
推荐阅读
相关标签
  

闽ICP备14008679号