1、(ubuntu)从 iptables 过渡到 nftables

当前,有一个与 nftables 兼容的 iptables-nft 后端,但是很快,即使是它也不再提供了。另外,正如 Red Hat 开发人员所指出的那样,有时它可能会错误地转换规则。我们需要知道如何构建自己的 nftables,而不是依赖于 iptables 到 nftables 的转换器。

在 nftables 中,所有地址族都遵循一个规则。与 iptables 不同,nftables 在用户空间中运行,iptables 中的每个模块都运行在内核(空间)中。它很少需要更新内核,并带有一些新功能,例如映射、地址族和字典。
地址族

地址族确定要处理的数据包的类型。在 nftables 中有六个地址族,它们是:

  • ip
  • ipv6
  • inet
  • arp
  • bridge
  • netdev

在 nftables 中,ipv4 和 ipv6 协议可以被合并为一个称为 inet 的单一地址族。因此,我们不需要指定两个规则:一个用于 ipv4,另一个用于 ipv6。如果未指定地址族,它将默认为 ip 协议,即 ipv4。我们感兴趣的领域是 inet 地址族,因为大多数家庭用户将使用 ipv4 或 ipv6 协议。

nftables

典型的 nftables 规则包含三个部分:表、链和规则。

表是链和规则的容器。它们由其地址族和名称来标识。链包含 inet/arp/bridge/netdev 等协议所需的规则,并具有三种类型:过滤器、NAT 和路由。nftables 规则可以从脚本加载,也可以在终端键入,然后另存为规则集。

对于家庭用户,默认链为过滤器。inet 系列包含以下钩子:

  • Input
  • Output
  • Forward
  • Pre-routing
  • Post-routing

使用脚本还是不用?

最大的问题之一是我们是否可以使用防火墙脚本。答案是:这是你自己的选择。这里有一些建议:如果防火墙中有数百条规则,那么最好使用脚本,但是如果你是典型的家庭用户,则可以在终端中键入命令,然后(保存并在重启时)加载规则集。每种选择都有其自身的优缺点。在本文中,我们将在终端中键入它们以构建防火墙。

nftables 使用一个名为 nft 的程序来添加、创建、列出、删除和加载规则。确保使用以下命令将 nftables 与 conntrackd 和 netfilter-persistent 软件包一起安装,并删除 iptables:

apt-get install nftables conntrackd netfilter-persistent
apt-get purge iptables

nft 需要以 root 身份运行或使用 sudo 运行。使用以下命令分别列出、刷新、删除规则集和加载脚本。

nft list ruleset
nft flush ruleset
nft delete table inet filter
/usr/sbin/nft -f /etc/nftables.conf

输入策略

就像 iptables 一样,防火墙将包含三部分:输入(input)、转发(forward)和输出(output)。在终端中,为输入(input)策略键入以下命令。在开始之前,请确保已刷新规则集。我们的默认策略将会删除所有内容。我们将在防火墙中使用 inet 地址族。将以下规则以 root 身份添加或使用 sudo 运行:

nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; counter \; policy drop \; }

你会注意到有一个名为 priority 0 的东西。这意味着赋予该规则更高的优先级。挂钩通常赋予负整数,这意味着更高的优先级。每个挂钩都有自己的优先级,过滤器链的优先级为 0。你可以检查 nftables Wiki 页面以查看每个挂钩的优先级。

要了解你计算机中的网络接口,请运行以下命令:

ip link show

它将显示已安装的网络接口,一个是本地主机、另一个是以太网端口或无线端口。以太网端口的名称如下所示:enpXsY,其中 X 和 Y 是数字,无线端口也是如此。我们必须允许本地主机的流量,并且仅允许从互联网建立的传入连接。

nftables 具有一项称为裁决语句的功能,用于解析规则。裁决语句为 accept、drop、queue、jump、goto、continue 和 return。由于这是一个很简单的防火墙,因此我们将使用 accept 或 drop 处理数据包。

nft add rule inet filter input iifname lo accept
nft add rule inet filter input iifname enpXsY ct state new, established, related accept

接下来,我们必须添加规则以保护我们免受隐秘扫描。并非所有的隐秘扫描都是恶意的,但大多数都是。我们必须保护网络免受此类扫描。第一组规则列出了要测试的 TCP 标志。在这些标志中,第二组列出了要与第一组匹配的标志。

nft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|fin\) == \(syn\|fin\) drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|rst\) == \(syn\|rst\) drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(fin\|rst\) == \(fin\|rst\) drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|fin\) == fin drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|psh\) == psh drop
nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|urg\) == urg drop

记住,我们在终端中键入这些命令。因此,我们必须在一些特殊字符之前添加一个反斜杠,以确保终端能够正确解释该斜杠。如果你使用的是脚本,则不需要这样做。

关于 ICMP 的警告

互联网控制消息协议(ICMP)是一种诊断工具,因此不应完全丢弃该流量。完全阻止 ICMP 的任何尝试都是不明智的,因为它还会导致停止向我们提供错误消息。仅启用最重要的控制消息,例如回声请求、回声应答、目的地不可达和超时等消息,并拒绝其余消息。回声请求和回声应答是 ping 的一部分。在输入策略中,我们仅允许回声应答、而在输出策略中,我们仅允许回声请求。

nft add rule inet filter input iifname enpXsY icmp type { echo-reply, destination-unreachable, time-exceeded } limit rate 1/second accept
nft add rule inet filter input iifname enpXsY ip protocol icmp drop

最后,我们记录并丢弃所有无效数据包。

最后,我们记录并丢弃所有无效数据包。

转发和输出策略

在转发和输出策略中,默认情况下我们将丢弃数据包,仅接受已建立连接的数据包。

nft add chain inet filter forward { type filter hook forward priority 0 \; counter \; policy drop \; }
nft add rule inet filter forward ct state established, related accept
nft add rule inet filter forward ct state invalid drop
nft add chain inet filter output { type filter hook output priority 0 \; counter \; policy drop \; }

典型的桌面用户只需要端口 80 和 443 即可访问互联网。最后,允许可接受的 ICMP 协议并在记录无效数据包时丢弃它们。

nft add rule inet filter output oifname enpXsY tcp dport { 80, 443 } ct state established accept
nft add rule inet filter output oifname enpXsY icmp type { echo-request, destination-unreachable, time-exceeded } limit rate 1/second accept
nft add rule inet filter output oifname enpXsY ip protocol icmp drop
nft add rule inet filter output oifname enpXsY ct state invalid log flags all level info prefix \”Invalid-Output: \”
nft add rule inet filter output oifname enpXsY ct state invalid drop

现在我们必须保存我们的规则集,否则重新启动时它将丢失。为此,请运行以下命令:

sudo nft list ruleset. > /etc/nftables.conf

我们须在引导时加载 nftables,以下将在 systemd 中启用 nftables 服务:

sudo systemctl enable nftables

接下来,编辑 nftables 单元文件以删除 Execstop 选项,以避免在每次引导时刷新规则集。该文件通常位于 /etc/systemd/system/sysinit.target.wants/nftables.service。现在重新启动nftables:

sudo systemctl restart nftables

在 rsyslog 中记录日志

当你记录丢弃的数据包时,它们直接进入 syslog,这使得读取该日志文件非常困难。最好将防火墙日志重定向到单独的文件。在 /var/log 目录中创建一个名为 nftables 的目录,并在其中创建两个名为 input.log 和 output.log 的文件,分别存储输入和输出日志。确保系统中已安装 rsyslog。现在转到 /etc/rsyslog.d 并创建一个名为 nftables.conf 的文件,其内容如下:

:msg,regex,”Invalid-Input: “ -/var/log/nftables/Input.log
:msg,regex,”Invalid-Output: “ -/var/log/nftables/Output.log & stop

现在,我们必须确保日志是可管理的。为此,使用以下代码在 /etc/logrotate.d 中创建另一个名为 nftables 的文件:

/var/log/nftables/* { rotate 5 daily maxsize 50M missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog rotate > /dev/null endscript }

重新启动 nftables。现在,你可以检查你的规则集。如果你觉得在终端中键入每个命令很麻烦,则可以使用脚本来加载 nftables 防火墙。我希望本文对保护你的系统有用。

2、 iptables 和 firewalld 常见操作

防火墙

防火墙是一组规则。当数据包进出受保护的网络区域时,进出内容(特别是关于其来源、目标和使用的协议等信息)会根据防火墙规则进行检测,以确定是否允许其通过。下面是一个简单的例子:

firewalld

# firewall-cmd --state
running

打开 HTTP 和 HTTPS 端口
按照惯例,这两个端口分别被指定为 80 和 443。firewalld 提供了两种方法来实现这个功能。一个是通过 –add-port 参数,该参数直接引用端口号及其将使用的网络协议(在本例中为TCP)。 另外一个是通过 –permanent 参数,它告诉 firewalld 在每次服务器启动时加载此规则:

# firewall-cmd --permanent --add-port=80/tcp
# firewall-cmd --permanent --add-port=443/tcp

–reload 参数将这些规则应用于当前会话:

# firewall-cmd --reload

查看当前防火墙上的设置,运行 –list-services:

# firewall-cmd --list-services
dhcpv6-client http https ssh

假设您已经如前所述添加了浏览器访问,那么 HTTP、HTTPS 和 SSH 端口现在都应该是和 dhcpv6-client 一样开放的 —— 它允许 Linux 从本地 DHCP 服务器请求 IPv6 IP 地址。

使用 iptables 配置锁定的客户信息亭

需要允许下载软件包更新。最后,您还希望只允许从本地工作站访问 SSH,并阻止其他人登录。下图说明了它将如何工作:
脚本

以下是 Bash 脚本内容:

规则 -A 开始分析,它告诉 iptables 我们要添加规则。OUTPUT 意味着这条规则应该成为输出链的一部分。
-p 表示该规则仅使用 TCP 协议的数据包,
-d 告诉我们的,目的地址是 bigmart.com。
-j 参数的作用是当数据包符合规则时要采取的操作是 ACCEPT。
第一条规则表示允许(或接受)请求。但,往下的规则你能看到丢弃(或拒绝)的请求。

chmod +X scriptname.shsudo ./scriptname.sh

你可以使用 cURL 命令行测试防火墙。请求 ubuntu.com 奏效,但请求 manning.com 是失败的 。

curl ubuntu.comcurl manning.com

配置 iptables 以在系统启动时加载

如何让这些规则在每次信息亭启动时自动加载?
第一步是将当前规则保存。使用 iptables-save 工具保存规则文件。这将在根目录中创建一个包含规则列表的文件。
管道后面跟着 tee 命令,是将我的sudo 权限应用于字符串的第二部分:将文件实际保存到否则受限的根目录。

在我的 Linux 机器上,我将安装一个名为 anacron 的程序,该程序将在 /etc/ 目录中为我们提供一个名为 anacrontab 的文件。我将编辑该文件并添加这个 iptables-restore 命令,告诉它加载那个 .rule 文件的当前内容。当引导后,规则每天(必要时)01:01 时加载到 iptables 中(LCTT 译注:anacron 会补充执行由于机器没有运行而错过的 cron 任务,因此,即便 01:01 时机器没有启动,也会在机器启动会尽快执行该任务)。我会给该任务一个标识符(iptables-restore),然后添加命令本身。如果你在家和我一起这样,你应该通过重启系统来测试一下。

我希望这些实际例子已经说明了如何使用 iptables 和 firewalld 来管理基于 Linux 的防火墙上的连接问题。

3、SSH原理与运用(2):远程操作与端口转发

远程操作

SSH不仅可以用于远程主机登录,还可以直接在远程主机上执行操作。

上一节的操作,就是一个例子:

$ ssh user@host ‘mkdir -p .ssh && cat >> .ssh/authorized_keys’ < ~/.ssh/id_rsa.pub

单引号中间的部分,表示在远程主机上执行的操作;后面的输入重定向,表示数据通过SSH传向远程主机。

这就是说,SSH可以在用户和远程主机之间,建立命令和数据的传输通道,因此很多事情都可以通过SSH来完成。

下面看几个例子。

【例1】
将HOME/src/目录下面的所有文件,复制到远程主机的HOME/src/目录下面的所有文件,复制到远程主机的HOME/src/目录下面的所有文件,复制到远程主机的HOME/src/目录。

$ cd && tar czv src | ssh user@host ‘tar xz’

【例2】
将远程主机$HOME/src/目录下面的所有文件,复制到用户的当前目录。

$ ssh user@host ‘tar cz src’ | tar xzv

【例3】
查看远程主机是否运行进程httpd。

$ ssh user@host ‘ps ax | grep [h]ttpd’

绑定本地端口

既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性。

假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写:

$ ssh -D 8080 user@host

SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。可以想象,如果8080端口原来是一个不加密端口,现在将变成一个加密端口。

本地端口转发

有时,绑定本地端口还不够,还必须指定数据传送的目标主机,从而形成点对点的”端口转发”。为了区别后文的”远程端口转发”,我们把这种情况称为”本地端口转发”(Local forwarding)。

假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。

我们在host1执行下面的命令:

$ ssh -L 2121:host2:21 host3

命令中的L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。

这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口。

$ ftp localhost:2121

“本地端口转发”使得host1和host3之间仿佛形成一个数据传输的秘密隧道,因此又被称为”SSH隧道”。

下面是一个比较有趣的例子。

$ ssh -L 5900:localhost:5900 host3

它表示将本机的5900端口绑定host3的5900端口(这里的localhost指的是host3,因为目标主机是相对host3而言的)。

另一个例子是通过host3的端口转发,ssh登录host2。

$ ssh -L 9001:host2:22 host3

这时,只要ssh登录本机的9001端口,就相当于登录host2了。

$ ssh -p 9001 localhost

上面的-p参数表示指定登录端口。

远程端口转发

既然”本地端口转发”是指绑定本地端口的转发,那么”远程端口转发”(remote forwarding)当然是指绑定远程端口的转发。

还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,”本地端口转发”就不能用了,怎么办?

解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。

我们在host3执行下面的命令:

$ ssh -R 2121:host2:21 host1

R参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口”。这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为”远程端口绑定”。

绑定之后,我们在host1就可以连接host2了:

$ ftp localhost:2121

这里必须指出,”远程端口转发”的前提条件是,host1和host3两台主机都有sshD和ssh客户端。

SSH的其他参数

SSH还有一些别的参数,也值得介绍。

N参数,表示只连接远程主机,不打开远程shell;T参数,表示不为这个连接分配TTY。这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作。

$ ssh -NT -D 8080 host

f参数,表示SSH连接成功后,转入后台运行。这样一来,你就可以在不中断SSH连接的情况下,在本地shell中执行其他操作。

$ ssh -f -D 8080 host

要关闭这个后台连接,就只有用kill命令去杀掉进程。

4、25 个常用的 Linux iptables 规则

  • 删除所有现有规则
iptables -F
  • 这里清空的只是当前iptables中设置的规则,不会清空以及保存的规则。重启iptables服务即可恢复保存过的规则

查看现有规则

iptables -nvL

选项说明:
n : 数字输出。IP地址和端口会以数字的形式打印
v :详细输出。这个选项让list显示接口地址、规则选项等信息
L -list:显示所选链的所有规则。 如果没有选择链,则会显示所有链的所有规则
保存iptables规则

service iptables -save

数据包清零

#iptables -Z

-Z选项可以清空所有规则相关的数据包数量

  1. 设置默认的 chain 策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
  1. 阻止某个特定的 IP 地址
#BLOCK_THIS_IP="x.x.x.x"
#iptables -A INPUT -s "$BLOCK_THIS_IP" -j DRO

删除一条规则
方法一:(需要指定添加这一条规则的完整命令,通过-D删除)

#iptables -D INPUT -s 192.168.233.131 -p icmp -j DROP

方法二 :(通过规则编号来删除规则)
查看规则编号的选是 --line-numbers
iptables -nvL (链名) --line-numbers
查询规则中的指定链名的规则编号
iptables -D (链名) (规则编号) #删除指定链名的规则

添加默认规则
如果先添加默认规则,然后添加新的规则,新规则则会把默认规则覆盖,所以默认规则最后生效 (默认规则优先级最低)

iptables -P [链名] [动作选项]

例子 : 只能访问服务器的22端口


4. 允许全部进来的(incoming)SSH

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
  1. 只允许某个特定网络进来的 SSH
#iptables -A INPUT -i eth0 -p tcp -s 192.168.200.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

对局域网内进行设置
允许局域网内192.168.60.0/24的所有主机访问代理服务器,除了192.168.60.3这台主机

#iptables -A INPUT -i eth0 -s 192.168.60.3 -j DROP
#iptables -A INPUT -i eth0 -s 192.168.60.3 -j ACCEPT

将来自网络接口lo的数据包全部接受

#iptables -A INPUT -i lo -j ACCEPT

让局域网内主机连接Internet

#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 $tmpdirt=`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 $2}'|grep -v "$good_ip"> $tmpdir/bad.ipd3=`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 $8}'>$tmpdir/good.ipif [ -s $tmpdir/good.ip ]thenfor ip in `cat $tmpdir/good.ip`do/sbin/iptables -D INPUT -p tcp --dport 80 -s $ip -j DROPd4=`date +%Y%m%d-%H:%M`echo "$d4 $ip unblock" >>$tmpdir/unblock.ipdonefi#解封后,再把iptables的计数器清零/sbin/iptables -Z INPUT
fiif [ -s $tmpdir/bad.ip ]
thenfor ip in `cat $tmpdir/bad.ip`do/sbin/iptables -A INPUT -p tcp --dport 80 -s $ip -j DROPd4=`date +%Y%m%d-%H:%M`echo "$d4 $ip block" >>$tmpdir/block.ipdone
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:80iptables -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/loginsessionrequired /lib/security/pam_limits.so

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

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

# cat/proc/sys/fs/file-max32568

这表明这台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_ACK16SYN_RECV348ESTABLISHED70FIN_WAIT1229FIN_WAIT230

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

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

# vim /etc/sysctl.confnet.ipv4.tcp_syncookies= 1net.ipv4.tcp_tw_reuse= 1net.ipv4.tcp_tw_recycle= 1net.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= 1200net.ipv4.ip_local_port_range= 1024 65535net.ipv4.tcp_max_syn_backlog= 8192net.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= 8388608net.core.rmem_default= 8388608net.core.rmem_max= 16777216 #最大socket读buffer,可参考的优化值:873200net.core.wmem_max= 16777216 #最大socket写buffer,可参考的优化值:873200net.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= 1net.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=sshfirewall-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# 添加服务,添加httpsfirewall-cmd --add-service=https --permanent# 移除端口firewall-cmd --zone=public --remove-port=80/tcp --permanentRich规则示例:
#拒绝从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‘
##开启SNATfirewall-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端口,需要开启masqueradefirewall-cmd --zone=drop --add-masqueradefirewall-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-masqueradefirewall-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
# firewall-cmd --zone=MyZone--add-service=https
# firewall-cmd --zone=MyZone--permanent --add-service=https
# firewall-cmd --reload

假如 -–zone 被忽略,则使用默认的区域(你可以使用 firewall-cmd –get-default-zone来查看)。

若要移除这些规则,可以在上面的命令中将 add 替换为 remove。

IP 转发或端口转发
首先,你需要查看在目标区域中,伪装(masquerading)是否被开启:

# firewall-cmd --zone=MyZone--query-masquerade
















参考链接:

从 iptables 过渡到 nftables
https://mp.weixin.qq.com/s/h-m2RW2HyDIE9cWy2_BSSA

编译:linux中国-lujun9972,作者:Vijay Marcel D
https://linux.cn/article-11513-1.html

Linux服务器高并发调优实战 :https://mp.weixin.qq.com/s/4A2PG7-62XhYK0ntHpOYEw

Linux 防火墙:关于 iptables 和 firewalld 的那些事
https://mp.weixin.qq.com/s/8-P5WI-ufPlCyVHUl146pg

Linux之iptables端口转发:外网访问内网 :https://mp.weixin.qq.com/s/viwZov-hX3kuup7Htrcg0A

25 个常用的 Linux iptables 规则 : https://mp.weixin.qq.com/s/uAPzh9_D4Qk6a3zBh7Jq5A

Firewalld基本使用方法 :https://www.wsfnk.com/archives/1195.html

https://www.wsfnk.com/archives/872.html

1 Linux防火墙设置相关推荐

  1. linux 防火墙文件路径,linux防火墙设置

    手机评站网今天精心准备的是<linux防火墙设置>,下面是详解! linux如何关闭防火墙 一.Linux下开启/关闭防火墙命令 1) 永久性生效,重启后不会复原 开启: chkconfi ...

  2. linux防火墙设置命令,linux防火墙设置命令是什么

    之前我们介绍了Windows如何开启关闭防火墙,那么对于Linux就相对复杂一点,需要用到命令实现.若是需要对linux防火墙设置需要什么命令吗?具体怎么设置? linux防火墙设置命令: 1.永久性 ...

  3. linux防火墙在哪个位置,linux防火墙设置在哪

    linux防火墙设置位置在哪里呢?你找不找的到?下面由学习啦小编给你做出详细的linux防火墙设置方法介绍!希望对你有帮助! linux防火墙设置方法一: 首先你要知道你的linux系统的版本是属于哪 ...

  4. Linux防火墙设置黑白名单

    本章内容基于CentOS6.5(32位) 切换到root用户 只有root账号可以查看防火墙,所以要先切换到root用户 su root 然后输入root账号的密码,就可以成功切换到root用户 查看 ...

  5. linux还原防火墙设置,Linux防火墙设置

    Linux防火墙操作 1.重启后生效 ​ 开启: chkconfig iptables on ​ 关闭: chkconfig iptables off 2.即时生效 开启: service iptab ...

  6. CentOS7防火墙设置;Linux防火墙设置;systemctl -- firewalld.service;firewall;firewall-cmd

    1.查看firewall服务状态 systemctl status firewalld 2.查看firewall的状态 firewall-cmd --state 3.开启.重启.关闭.firewall ...

  7. linux 防火墙设置ftp端口,CentOS 配置防火墙操作实例(启、停、开、闭端口)CentOS Linux-FTP/对外开放端口(接口)TomCat相关...

    CentOS 配置防火墙操作实例(启.停.开.闭端口): 注:防火墙的基本操作命令: 查询防火墙状态: [root@localhost ~]# service   iptables status 停止 ...

  8. linux 查看本地防火墙设置,Linux防火墙设置命令的几种方法

    iptables防火墙 1.基本操作 # 查看防火墙状态 service iptables status # 停止防火墙 service iptables stop # 启动防火墙 service i ...

  9. Linux防火墙设置详解

    1.介绍 在CentOS里有几种防火墙共存:firewalld.iptables.ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables ...

最新文章

  1. R语言glmnet拟合lasso回归模型实战:lasso回归模型的模型系数及可视化、lasso回归模型分类评估计算(混淆矩阵、accuracy、Deviance)
  2. 广西高考成绩查询2021,2021年广西高考个人排名怎么查询,广西高考成绩排名查询方法...
  3. poj 3256(DFS)
  4. vuex Payload 荷载
  5. Android 功耗(24)---功耗相关因子
  6. UML---(1)一张图看懂UML 类图
  7. 查看gpio状态_基于Arduino开发,借助blinker平台,让NodeMCU实现8路继电器APP端状态监视和控制...
  8. 将Maven创建的web Servlet2.3工程改为Servlet3.0
  9. 挺起基础软件自主创新的脊梁 锐易特软件荣获2008中国软件信息化创新奖
  10. kibana安装与基础用法
  11. html网站地图在线生成,网站地图(sitemap)在线制作工具
  12. Tomcat SSL Configuration
  13. selenium+webdriver+java(基本小例子及初始化三种浏览器)---------------
  14. 【科研论文】找到中文论文的英文引用格式
  15. c语言选择结构程序设计实验总结,C语言程序设计,选择结构程序设计实验
  16. 超链接 qq群一键添加
  17. docker镜像完全卸载
  18. 智能机器人 迪姆人工_艾美迪迪姆智能故事机
  19. MySQL Workbench报错说 seems to be a different OS
  20. 10以内转大写汉字java_1.输入一个0-10之间的阿拉伯数字,将其转换成中文大写数...

热门文章

  1. 转行算法,90%的人还没开始就错在了这1步
  2. 帮内推 | 免费送50个推荐算法工程师的高薪offer!
  3. 百度Apolloscapes,亚马逊评论,最强数据集50个最佳机器学习公共数据
  4. 基于多搜索引擎和深度学习技术的自动问答
  5. 『HTML5挑战经典』是英雄就下100层-开源讲座(一)从天而降的英雄
  6. Kubernetes之Pod生命周期详解
  7. 机器学习算法 --- SVM (Support Vector Machine)
  8. Shell脚本(函数,shell中的数组)
  9. Presenter层如何高度的复用
  10. 将图片的二进制字节字符串在HTML页面以图片形式输出