CentOS 7.0关闭默认防火墙启用iptables防火墙

操作系统环境:CentOS Linux release 7.0.1406(Core) 64位
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤。

1. 关闭firewall:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

2. iptables防火墙(这里iptables已经安装,下面进行配置)

  • 编辑防火墙配置文件
vi /etc/sysconfig/iptables

这里使用80和8080端口为例。

    # sampleconfiguration for iptables service
    # you can edit thismanually or use system-config-firewall
    # please do not askus to add additional ports/services to this default configuration
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT[0:0]
    :OUTPUT ACCEPT[0:0]
    -A INPUT -m state--state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -jACCEPT
    -A INPUT -i lo -jACCEPT
    -A INPUT -p tcp -mstate --state NEW -m tcp --dport 22 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -jACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 8080-j ACCEPT
    -A INPUT -j REJECT--reject-with icmp-host-prohibited
    -A FORWARD -jREJECT --reject-with icmp-host-prohibited
    COMMIT
  • 保存退出
    :wq!

备注:

一般添加到“-A INPUT -p tcp -m state –state NEW -m tcp–dport 22 -j ACCEPT”行的上面或者下面,切记不要添加到最后一行,否则防火墙重启后不生效。

systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动

添加iptables规则,防止s[]s回源国内

添加以下规则后,ss服务器将不能对国内IP建立连接。
只禁止出口连接,也就是服务器主动连接,ftp会受影响,入口连接正常,小鸡不会失联

iptables -A OUTPUT -m geoip --dst-cc CN  -j REJECT

TIPS:
使用上面命令前,请先按照下面教程为iptables添加geoip模块

https://daenney.github.io/2017/01/07/geoip-filtering-iptables.html

如果是debian或ubuntu,就是直接执行下面命令

apt install xtables-addons-common xtables-addons-dkms libtext-csv-xs-perl
/usr/lib/xtables-addons/xt_geoip_dl
mkdir /usr/share/xt_geoip
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip GeoIPCountryWhois.csv GeoIPv6.csv

记得保存和开机自动恢复iptables规则。

操作完成后,s[]s服务器就不会再访问国内服务器了。高墙也不会知道你是一台代理服务器了。

本教程需要一定的linux知识。且各个linux发行版操作方式不尽相同。责任自负。

iptables 的limit模块

Limit模块的功能是限制单位时间内进入数据包的数量。

Limit的工作原理及令牌桶算法朱双印大佬介绍的生动明晰,此地不再赘述,只用实例进一步加深Limit模块的理解。

iptables -t filter -R INPUT 1 -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT

--limit 10/minute表示一分钟产生10个令牌即6秒一个,--limit-burst 5表示令牌桶最多可以放5个令牌,此项默认值就是5。Ping本机的响应信息如下:

64 bytes from 192.168.80.133: icmp_seq=0 ttl=64 time=21.3 ms

64 bytes from 192.168.80.133: icmp_seq=1 ttl=64 time=0.564 ms

64 bytes from 192.168.80.133: icmp_seq=2 ttl=64 time=0.559 ms

64 bytes from 192.168.80.133: icmp_seq=3 ttl=64 time=0.478 ms

64 bytes from 192.168.80.133: icmp_seq=4 ttl=64 time=0.488 ms

From 192.168.80.133 icmp_seq=5 Destination Port Unreachable

64 bytes from 192.168.80.133: icmp_seq=6 ttl=64 time=0.096 ms

From 192.168.80.133 icmp_seq=7 Destination Port Unreachable

From 192.168.80.133 icmp_seq=8 Destination Port Unreachable

From 192.168.80.133 icmp_seq=9 Destination Port Unreachable

From 192.168.80.133 icmp_seq=10 Destination Port Unreachable

From 192.168.80.133 icmp_seq=11 Destination Port Unreachable

64 bytes from 192.168.80.133: icmp_seq=12 ttl=64 time=0.710 ms

From 192.168.80.133 icmp_seq=13 Destination Port Unreachable

From 192.168.80.133 icmp_seq=14 Destination Port Unreachable

From 192.168.80.133 icmp_seq=15 Destination Port Unreachable

From 192.168.80.133 icmp_seq=16 Destination Port Unreachable

From 192.168.80.133 icmp_seq=17 Destination Port Unreachable

64 bytes from 192.168.80.133: icmp_seq=18 ttl=64 time=1.22 ms

因为--limit-burst 是5,所以前5个包顺利拿到令牌进入本机,第6个ping包到来时令牌桶空了,直接被拒绝。此时6秒时间已到,系统便生成一个令牌并放入桶中,此时第7个请求包到达,拿到令牌后进入本机ping成功了。第8,9,10,11,12个ping包请求时,令牌桶空,这5个包直接被拒绝。当到达6秒时又产生一个令牌,这时正好第13个ping包请求,便成功了。以后便如此反复。

把ping的间隔调到2秒,ping -i 2 192.168.80.133

64 bytes from 192.168.80.133: icmp_seq=0 ttl=64 time=51.5 ms

64 bytes from 192.168.80.133: icmp_seq=1 ttl=64 time=0.852 ms

64 bytes from 192.168.80.133: icmp_seq=2 ttl=64 time=0.630 ms

64 bytes from 192.168.80.133: icmp_seq=3 ttl=64 time=0.383 ms

64 bytes from 192.168.80.133: icmp_seq=4 ttl=64 time=0.612 ms

64 bytes from 192.168.80.133: icmp_seq=5 ttl=64 time=0.497 ms

From 192.168.80.133 icmp_seq=6 Destination Port Unreachable

64 bytes from 192.168.80.133: icmp_seq=7 ttl=64 time=1.35 ms

From 192.168.80.133 icmp_seq=8 Destination Port Unreachable

From 192.168.80.133 icmp_seq=9 Destination Port Unreachable

64 bytes from 192.168.80.133: icmp_seq=10 ttl=64 time=0.110 ms

From 192.168.80.133 icmp_seq=11 Destination Port Unreachable

From 192.168.80.133 icmp_seq=12 Destination Port Unreachable

64 bytes from 192.168.80.133: icmp_seq=13 ttl=64 time=0.567 ms

刚开始令牌桶中有5个令牌,所以前5个包可以顺利ping通,于此同时系统时间过了10秒,期间系统产生了第1个令牌,第6个包也可以ping通。第7个ping包到达时还没产生第2个令牌,icmp_seq=6包被拒绝。以后便如此反复。

把ping的间隔调到3秒,4秒,5秒等,又会如何?

--limit 10/minute的值调大或调小,又会出现什么情况,只有不断尝试不断探索才能不断进步。

浅谈iptables防SYN Flood攻击和CC攻击

————————本文为自己实践所总结,概念性的东西不全,这里粗劣提下而已,网上很多,本文主要说下目前较流行的syn洪水攻击和cc攻击————————————-

何为syn flood攻击:

SYN Flood是一种广为人知的DoS(拒绝服务攻击)是DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式(TCP协议的缺陷,所以没办法根除,除非重做TCP协议,目前不可能)。

正常原理是:

  1. TCP三次握手,客户端向服务器端发起连接的时候发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号

  2. 服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgment),夹带也发送一个SYN包给客户端,并且服务器分配资源给该连接。

  3. 客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。

syn flood攻击利用TCP三次握手的缺陷,在TCP连接的第三次握手中,当服务器收到客户端的SYN包后并且返回客户端ACK+SYN包,由于客户端是假冒IP,对方永远收不到包且不会回应第三个握手包。导致被攻击服务器保持大量SYN_RECV状态的“半连接”,并且会有重试默认5次回应第二个握手 包,塞满TCP等待连接队列,资源耗尽(CPU满负荷或内存不足),让正常的业务请求连接不进来。通常SYN Flood会和ARP欺骗一起使用,这样就造成了SYN攻击。

何为CC攻击:

CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡(被黑客黑的电脑)向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。CC主要是用来攻击页面的,每个人都有这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,CC就是模拟多个用户(多少线程就是多少用户)不停地进行访问那些需要大量数据操作(就是需要大量CPU时间)的页面,造成服务器资源的浪费,CPU长时间处于100%,永远都有处理不完的连接直至就网络拥塞,正常的访问被中止。

攻击检测:

当你发现发服务器很卡,web访问很慢 甚至连SSH操作都开始有点卡的时候,你就要非常注意了。

检测可以这样做:

top 查看CPU使用率和CPU负载情况

负载一般小于CPU核数*0.7算正常,负载内等于或者稍大于核数。说明CPU负载开始严重了,如果超过,说明有问题。

看看哪些程序CPU使用率较高,是否为正常占用,可以使用 pidof 进程名 查看该进程名的所有进程号,然后ll /proc/进程号/exe、fd查看是否为正常信息。

netstat查看端口状态

netstat -n | grep "^tcp" | awk '{print $6}' | sort  | uniq -c | sort -n

1 SYN_RECV

13 FIN_WAIT1

64 TIME_WAIT
149 ESTABLISHED

     
可以查看当前连接状态的数量,从而进行判断。

还有vmstat、sar、等检测命令,网上有使用方法!

Syn Flood 一般的防御:
    
第一种:缩短SYN Timeout时间,由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 x SYN Timeout,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间。

第二种:设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被丢弃。

(缺陷:缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效,SYN Cookie更依赖于对方使用真实的IP地址,如果攻击者以数万/秒的速度发送SYN报文,同时利用ARP欺骗随机改写IP报文中的源地址,以上的方法将毫无用武之地。)

vim /etc/sysctl.conf

    
增加或者修改如下:(修改保存后记得sysctl -p 使之生效)

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_fin_timeout = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_max_syn_backlog = 262144

net.core.netdev_max_backlog = 262144

net.ipv4.tcp_max_orphans = 262144

net.ipv4.tcp_keepalive_time = 30

iptables性质防御:

限制syn的请求速度(这个方式需要调节一个合理的速度值,不然会影响正常用户的请求)

iptables -N syn-flood   (新建一条链)

iptables -A INPUT -p tcp --syn -j syn-flood 

iptables -A syn-flood  -p tcp -m limit --limit 2/s --limit-burst 50 -j RETURN

iptables -A syn-flood -j DROP

  
Tips:攻击这东西只能防御不能完全根除!只能缓解,降低到最低的风险。有钱可以上第三方公司的产品服务!嘿嘿。

CC攻击一般防御:

  1. 一般而言,CC攻击都是真实的IP,所以一般的做法通俗点就是封IP

  2. 更改web端口,默认CC攻击都是攻击服务器的80端口  

  3. 域名欺骗,我们可以使用cdn等加速工具代理我们的服务器,从而实现防御,(网上有人说把域名解析到127.0.0.1 让攻击者自己攻击自己,不知道有没有用,没试过。而且正式业务,你怎么可能去做这样的解析,那业务怎么办?)

使用抓包命令,抓取访问服务器80的IP数

tcpdump -tnn dst port 80 -c 100 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -n -r |head -20

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
100 packets captured
101 packets received by filter
  0 packets dropped by kernel
78 IP 221.239.28.142
17 IP 124.65.101.82
13 IP 14.123.162.69
 7 IP 183.238.49.188
 7 IP 120.234.19.186

可以看到221.239.28.142的包最多,所以我们进行封IP处理。

iptables -I INPUT -s 221.239.28.142 -j REJECT 

iptabes 其他限制规则:

防御太多DOS攻击连接,可以允许外网每个IP最多15个初始连接,超过的丢弃,第二条是在第一条的基础上允许已经建立的连接和子连接允许

iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP  (--connlimit-mask 32为主机掩码,32即为一个主机ip,也可以是网段)
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

抵御DDOS ,允许外网最多24个初始连接,然后服务器每秒新增12个,访问太多超过的丢弃,第二条是允许服务器内部每秒1个初始连接进行转发

iptables -A INPUT  -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

允许单个IP访问服务器的80端口的最大连接数为 20

iptables -I INPUT -p tcp --dport 80 -m connlimit  --connlimit-above 20 -j REJECT 

对访问本机的22端口进行限制,每个ip每小时只能连接5次,超过的拒接,1小时候重新计算次数

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT

(上面recent规则只适用于默认规则为DROP中,如果要适用默认ACCEPT的规则,需要–set放前面 并且无-j ACCEPT)

【Docker】启动container的时候出现iptables: No chain/target/match by that name

问题

Error response from daemon: driver failed programming external connectivity
 on endpoint jenkins (a8ea15bf9b3dbed599d059d638f79f9dd5e875556c39bfb41e6563d3feedb81b):
  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 50000 -j DNAT
 --to-destination 172.18.0.6:50000 ! -i br-031aa3930383: iptables: No chain/target/match
 by that name.

光看这个报错: iptables: No chain/target/match by that name,就能够看出是跟iptables有关

原因(猜测)

如果再启动docker service的时候网关是关闭的,那么docker管理网络的时候就不会操作网管的配置(chain docker),然后网关重新启动了,导致docker network无法对新container进行网络配置,也就是没有网管的操作权限,做重启处理

处理

service docker restart
或
systemctl docker restart

使用的centos7服务器,在部署docker的过程中,因端口问题有启停firewalld服务,在centos7里使用firewalld代替了iptables。在启动firewalld之后,iptables还会被使用,属于引用的关系。所以在docker run的时候,iptables list里没有docker chain,重启docker engine服务后会被加入到iptables list里面。(有必要深入研究一下docker network)

另一个方法

关闭网关(不建议)

systemctl stop firewalld

systemctl stop iptables

Linux 配置防火墙详细步骤 (iptables 命令使用方法)

如果您使用的是 ssh 远程,而又不能直接操作本机,那么建议您慎重,慎重,再慎重!
无论如何,iptables 是一个需要特别谨慎设置的东西,万一服务器不在你身边,而你贸然设置导致无法 SSH,那就等着被老板骂吧!!!

通过 iptables 我们可以为我们的 Linux 服务器配置有动态的防火墙,能够指定并记住为发送或接收信息包所建立的连接的状态,是一套用来设置、维护和检查 Linux 内核的 IP 包过滤规则的命令包。iptables 定义规则的方式比较复杂,本文对 Linux 防火墙 Iptables 规则写法进行详细介绍。

概览

未分类

未分类

未分类

未分类

未分类

未分类

[root@ppl ~]# iptables -h
iptables v1.4.21

Usage: iptables -[ACD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

介绍

1.Iptables 规则写法的基本格式是:
  

iptables [-t table] COMMAND chain CRETIRIA -j ACTION   

2.Iptables 规则相关参数说明:

  • -t table:3 个:filter nat mangle ;定义如何对规则进行管理

  • chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的;

  • CRETIRIA: 指定匹配标准;

  • -j ACTION: 指定如何进行处理;   

3.Iptables 规则其他写法及说明:
 
iptables -L -n -v #查看定义规则的详细信息

 [root@ppl ~]# iptables -L -n
 Chain INPUT (policy ACCEPT)
 target     prot opt source               destination         
 ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
 ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
 INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0           
 INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0           
 INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0           
 DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
 REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

 Chain FORWARD (policy ACCEPT)
 target     prot opt source               destination         
 ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
 ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
 FORWARD_direct  all  --  0.0.0.0/0            0.0.0.0/0           
 FORWARD_IN_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0           
 FORWARD_IN_ZONES  all  --  0.0.0.0/0            0.0.0.0/0           
 FORWARD_OUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0           
 FORWARD_OUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0           
 DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
 REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

 Chain OUTPUT (policy ACCEPT)
 target     prot opt source               destination         
 OUTPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0 

iptables 是 Linux 服务器上防火墙配置必备的设置工具,是我们在做好服务器安全及部署大型网络时,常会用到的重要工具,很好的掌握 iptables,可以让我们对 Linux 服务器整个网络的结构有一个比较透彻的了解,更能够很好的掌握 Linux 服务器的安全配置技巧。

配置

我们来配置一个 filter 表的防火墙.

1.首先介绍一下指令和相关配置文件

  • 启动指令:service iptables start
  • 重启指令:service iptables restart
  • 关闭指令:service iptables stop

2.然后是相关配置

/etc/sysconfig/iptables     
vim /etc/sysconfig/iptables

然后进去修改即可,修改完了怎么办?这里很多人会想到 /etc/rc.d/init.d/iptables save 指令,但是一旦你这么干了你刚才的修改内容就白做了。。。

具体方法是:
只修改 /etc/sysconfig/iptables, 使其生效的办法是修改好后先 service iptables restart,然后才调用 /etc/rc.d/init.d/iptables save
因为 /etc/rc.d/init.d/iptables save 会在 iptables 服务启动时重新加载,要是在重启之前直接先调用了 /etc/rc.d/init.d/iptables save 那么你 的 /etc/sysconfig/iptables 配置就回滚到上次启动服务的配置了,这点必须注意!!!

3.下面介绍一些指令用法(主要还是 man iptables 看下相关资料才行)

   -A:指定链名   
   -p:指定协议类型   
   -d:指定目标地址
   -s:IP地址
   --dport:指定目标端口(destination port 目的端口)   
   --sport:指定源端口(source port 源端口)   
   -j:指定动作类型 

4.如果我不像修改文件直接打命令可以吗,当然没问题,步骤如下:

例如我给 SSH 加放行的语句:
添加 input 记录: iptables -A INPUT -p tcp --dport 22 -j ACCEPT
添加 output 记录: iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
最后注意需要再执行一下 /etc/init.d/iptables save,这样这两条语句就保存到刚才那个 /etc/sysconfig/iptables 文件中了。

5.接下来说明一下步骤,如果机器不在我身边,我只能 SSH 进去做 iptables 规则,那么我必须注意每一步,千万别搞错了,否则就 SSH 链接不上都有可能!

首先要做的是给咱的 SSH 进行 ACCEPT 配置,以免直接无法连接的情况发生:
如果 SSH 端口是 22(这里不建议用默认端口最好改掉 SSH 端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
注意要 /etc/rc.d/init.d/iptables save,以下每一步都最好执行一遍此语句,以下不再累述。

6.cat /etc/sysconfig/iptables 确定是否已经加入配置,可以的话执行 service iptables restart 重启后生效.

示例

拒绝某 IPSSH 链接我的 Linux

iptables -t filter -A INPUT -s 192.168.12.12 -p tcp --dport 22 -j DROP

Linux的铜墙铁壁:防火墙之iptables

未分类

来源

所谓防火墙,实质上是指由软硬件组合成的一个在内外网之间构造的一种保护屏障,它是一种隔离技术。因此从物理上区分,可以分为软件和硬件防火墙,从逻辑上区分,可以分为主机和网络防火墙,而我们现在要讲到的iptables,是属于防火墙中的软件防火墙的范畴,但它只是一个命令行工具或者说是一种客户端代理,并不是真正的防火墙,用户通过这个代理,把安全设定执行到真正的防火墙框架中,这个框架叫做Netfilter

原理

Netfilter是Linux中的一个子项目,它的主要功能是进行数据包过滤、连接跟踪、地址转换等,而iptables则是netfilter提供的对用户数据包进行过滤、修改等操作的一种命令行工具,当数据包通过网卡进入进入内核时,它得先经过iptables的五条链,这些链都有相应的处理数据包的规则,而我们正是通过在这些链上设置规则来控制管理数据包,从而达到防火墙的功能。每当数据包到达一个链时,iptables就会从链中的所有规则逐一开始校验该数据包是否符合规则中限定的条件。若满足,系统就会根据每个规则定义的方法来处理该数据包;若不满足,iptables则继续检查下一条规则,如果该数据包不符合链中的任意规则,iptables则会该链的默认策略去处理该数据包。

四个表

iptables的结构是由tables组成,而tables是由链组成,链又是由具体的规则组成。因此我们在编写iptables的规则时,通过要先指定表,再指定链。tables的作用是区分不同功能的规则,并且存储这些规则。

tables的类型分别有:

未分类

五条链

链,也称为钩子函数,它是一系列规则的一个组合,当数据包经过这些狗子函数时,她必须完全匹配每一个钩子函数中的所有规则,方能进入下一个钩子函数。

钩子函数的类型分别有:

未分类

语法规则

语法:iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]

1)常用的命令选项:

  • -t:指定要操纵的表(四个表);

  • -A:向规则链中添加条目;

  • -D:从规则链中删除条目;

  • -i:向规则链中插入条目;

  • -R:替换规则链中的条目;

  • -L:显示规则链中已有的条目;

  • -F:清楚规则链中已有的条目;

  • -Z:清空规则链中的数据包计算器和字节计数器;

  • -N:创建新的用户自定义规则链;

  • -P:定义规则链中的默认目标;

  • -h:显示帮助信息;

  • -p:指定要匹配的数据包协议类型;

  • -s:指定要匹配的数据包源

2)常用的处理动作:

  • ACCEPT:允许数据包通过

  • DROP:直接丢弃数据包,不给任何回应信息

  • REJECT: 拒绝数据包通过,必要时会给数据发送端一个响应的信息

  • LOG:在/var/log/messages文件中记录日志然后将数据包传递给下一条规则

  • REDIRECT: 端口映射

  • SNAT :源地址转换,修改包来源IP为某IP或IP范围,做内网和公网之间的转换

  • DNAT::目标地址转换。 修改数据包目的地IP为某 Ip 或 IP 范围

3)常用的条件匹配:

1、状态匹配:-m state –state 连接状态

  • NEW:与任何连接无关的

  • ESTABLISHED:响应请求或已建立连接的

  • RELATED:与已有连接有相关性的,如FTP数据连接

2、MAC地址匹配:-m mac –mac-source MAC地址

eg:iptables -A INPUT -m mac --mac-source f0:1b:12:12:22:4f -j DROP

3、IP范围匹配:-m iprange –src-range IP范围

eg:iptables -A FORWARD -p tcp -m iprange --src-range 192.168.0.1-192.168.0.10 -j ACCEPT

4、多端口匹配:-m multiport –sports 源端口列表 和 -m multiport –sports 目的端口列表

eg:iptables -A INPUT -p tcp -m multiport --dport 11,29,116,121 -j ACCEPT

4)常用的一些iptables策略:

1、拒绝转发来自192.168.2.33主机的数据

iptables -A FORWARD -s 192.168.2.33 -j REJECT 

2、允许转发来自192.168.2.1/99网段的数据

iptables -A FORWARD -s 192.168.2.1/99 -j ACCEPT

3、允许本机开放从TCP端口20-1024提供的应用服务。

iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT 

iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT

4、只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。

iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT 

iptables -A INPUT -p tcp --dport 22 -j DROP

5、 允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。

iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT 

iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT

6、屏蔽ip 110.1.1.1的访问

iptables -I INPUT -s 110.1.1.1 -j DROP

7、屏蔽从123.0.0.1到123.255.255.254iptables -I INPUT -s 123.0.0.0/8 -j DROP

8、屏蔽从从123.45.0.1到123.45.255.254iptables -I INPUT -s 124.45.0.0/16 -j DROP

9、屏蔽从从123.45.6.1到123.45.6.254iptables -I INPUT -s 123.45.6.0/24 -j DROP

10、允许所有本机向外的访问iptables -A OUTPUT -j ACCEPT

11、允许访问22端口iptables -A INPUT -p tcp –dport 22 -j ACCEPT

5)常用的iptables命令:

1、查看当前 IPTABLES 规则

service iptables status

2、 将所有iptables以序号标记显示

iptables -L -n --line-numbers

3、 比如要删除INPUT里序号为22的规则

iptables -D INPUT 22

Linux安全-使用iptables封掉所有邮件端口

说明:封掉邮件端口可以防止垃圾邮件

方法

1、直接封掉所有邮件协议端口

iptables -A INPUT -p tcp -m multiport --dport 25,110,465:587,993:995 -j DROP
iptables -A INPUT -p udp -m multiport --dport 25,110,465:587,993:995 -j DROP
iptables -A OUTPUT -p tcp -m multiport --dport 25,110,465:587,993:995 -j DROP
iptables -A OUTPUT -p udp -m multiport --dport 25,110,465:587,993:995 -j

2、保存iptables设置

iptables-save
service iptables save

iptables time 时间匹配规则

这两天受FortiGate启发,试了下iptables的时间控制规则,整理如下:

1、每天固定时间段匹配

iptables -I FORWARD -s 172.17.1.132 -d 192.168.1.119 -m time --timestart 09:40 --timestop 09:59 -j DROP

2、按周固定时间段匹配

iptables -I FORWARD -s 172.17.1.132 -d 192.168.1.119 -m time --timestart 09:40 --timestop 09:59 --weekdays Wed,Thu -j DROP

3、按固定日期匹配,注这里比较特殊,可以看见下面的时间是17点不是9点,是因为时区的原因,要差8小时。

iptables -I FORWARD -s 172.17.1.132 -d 192.168.1.119 -m time --datestart 2014-3-19T17:40:08 --datestop 2014-3-19T17:59:50 -j DROP

附上帮助说明:

time match options:
    --datestart time     Start and stop time, to be given in ISO 8601
    --datestop time      (YYYY[-MM[-DD[Thh[:mm[:ss]]]]])
    --timestart time     Start and stop daytime (hh:mm[:ss])
    --timestop time      (between 00:00:00 and 23:59:59)
[!] --monthdays value    List of days on which to match, separated by comma
                         (Possible days: 1 to 31; defaults to all)
[!] --weekdays value     List of weekdays on which to match, sep. by comma
                         (Possible days: Mon,Tue,Wed,Thu,Fri,Sat,Sun or 1 to 7
                         Defaults to all weekdays.)
    --localtz/--utc   

【Linux】执行 service iptables save 命令异常解决

遇到问题

  博主在 CentOS7 安装 Redis 的过程中,使用 iptables 命令添加完 iptables规则以后,需要保存规则永久生效,当执行 service iptables save 命令时提示以下错误信息:
  
未分类

问题原因

  遇到此问题是因为没有安装 iptables 服务,因此需要先安装 iptables 服务。

解决方案

1. 关闭防火墙

systemctl stop firewalld
systemctl mask firewalld

2. 安装 iptables 服务

yum install iptables-services

3. 设置 iptables 服务开机启动

systemctl enable iptables

 

4. 重启 iptables 服务

systemctl restart iptables

 

5. 执行保存配置命令

service iptables save