iptables相关

一般只需设置filter表,filter表分为INPUT,OUTPUT,FORWARD,其中FORWARD表示只流经本机。
默认三个链都为ACCEPT,在这种情况下,任何设定为允许的规则都会失效。一定要在最后面加上以下规则

iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p udp -j REJECT --reject-with udp-reset
#或者
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
#或者
iptables -A INPUT -j REJECT --reject-with icmp-net-prohibited

至于为什么icmp-host-prohibited与icmp-net-prohibited都可用,这两者有什么不同等等,作者已经承认是自己的错误

这条规则会禁止所有TCP连接,所以一定要放在末尾,所以新的规则不能采用添加的方式而要采取插入的方式。

较为安全的预设:

iptables -p INPUT DROP
iptables -p OUTPUT ACCEPT
iptables -p FORWARD DROP

对流入数据包进行限制,对流出不限制

只需设置入站规则即可。

更为安全的预设:

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

对入站与出站都需要设定规则,此种设定会导致不能上网

命令格式:

iptables命令格式

常用参数:

-L, --list	查看规则,后面接链名称 一般和-n --numeric一并使用
-t --table	选定要设置的表,默认为filter 可选关键字:filter,nat,Mangle
-A --append	添加规则,后面接链名,filter表关键字:INPUT,OUTPUT,FORWARD
-D --delete	删除规则,后面接链名,然后接完整的规则,或直接指定规则编号。
-p 协议,后面接协议名,可选关键字:tcp,udp,icmp等
-s 源IP地址
-d 目标IP地址
--dport目的端口
--sport来源端口
-j --jump target一般为ACCEPT和DROP ,如果需要跳到自定义链,后面接自定义链的名称
-m multiport 指定多端口号(连续用: 非连续用,)
      --sports
      --dports
-m iprange 指定IP段(连续)
      --src-range ip-ip
      --dst-range ip-ip
-R --replace替换规则,后面接链名,然后接完整的规则,或直接指定规则编号。
-I --insert	插入规则,后面接规则标号,原本该位置上的规则将会往后移动一个顺位。
-F --flush	清空规则,后面接链名表示清空链,不接关键字清空所有预设规则
-X --delete-chain	清空自定义规则,面接链名表示清空链,不接关键字清空所有自定义规则
-N --new-chain		新建自定义规则连

#NAT
SNAT target options:
 --to-source [ipaddr[-ipaddr]][:port[-port]]    更改报文来源IP与端口

DNAT target options:
 --to-destination [ipaddr[-ipaddr]][:port[-port]]    更改报文目的IP与端口

其它:

#允许ping:
#入站规则:
iptables -A INPUT -p icmp -j ACCEPT
#出站规则:
iptables -A OUTPUT -p icmp -j ACCEPT

#允许loopback!:(不然会导致DNS无法正常关闭等问题)
#入站规则:
iptables -A INPUT -i lo -p all -j ACCEPT
#出站规则:
iptables -A OUTPUT -o lo -p all -j ACCEPT

#允许接受本机请求之后的返回数据 RELATED
iptables -A INPUT -m state --state  RELATED,ESTABLISHED -j ACCEPT

#禁止其他数据包通过(当INPUT为ACCEPT时有效)
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

数据包状态

State(状态) Explanation(注释)
NEW NEW说明这个包是我们看到的第一个 包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在 我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。
ESTABLISHED ESTABLISHED已经注意到两个方向上 的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容 易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我 们所发出的信息的应答。
RELATED RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应 答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。
INVALID INVALID说明数据包不能被识别属于 哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。

示例:

#打开22端口
#入站规则:
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
#出站规则:
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

#指定多个端口
#连续端口
iptables -A INPUT -p tcp --dport 388:390 -j ACCEPT
#不连续端口
iptables -A INPUT -p tcp -m multiport --dports 110,80,25,445,1863,5222 -j ACCEPT

#指定多个IP
iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.1-192.168.1.255 -j ACCEPT

#指定域名访问
iptables -A INPUT -p tcp --dport 29700 -s domain.com -j ACCEPT

#插入规则示例
iptables -I INPUT 8 -s 127.0.0.1 -p tcp --dport 6379 -j ACCEPT

#指定IP地址
#入站规则:
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
#出站规则:
iptables -A OUTPUT -s 192.168.0.3 -p tcp --sport 22 -j ACCEPT

#删除规则
#入站规则:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
#出站规则:
iptables -D OUPUT -p tcp --sport 22 -j ACCEPT

#浏览器不能上网问题
#入站规则:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#出站规则:
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

#域名过滤
iptables -I INPUT -p tcp -m string --string "qq.com" --algo bm -j DROP

#端口转发
##外部主机访问本机(10.4.68.86:2222)转发到(10.4.68.87:22)
###方向:外部主机→本机→10.4.68.87
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 2222 -j DNAT --to-destination 10.4.68.87:22
###方向:10.4.68.87→本机→外部主机
iptables -t nat -A POSTROUTING -j MASQUERADE

启动iptables后登录ssh变慢的解决方法

原因分析:
ssh的配置文件sshd_config中开启了UserDNS yes选项。

UseDNS 选项打开状态下,当客户端试图登录SSH服务器时,服务器端先根据客户端的IP地址进行DNS PTR反向查询出客户端的主机名,然后根据查询出的客户端主机名进行DNS正向A记录查询,验证与其原始IP地址是否一致,这是防止客户端欺骗的一种措施。

解决方法:
编辑/etc/ssh/sshd_config文件,将#UseDNS yes改成UseDNS no

其它:
转自csdn@killapper

不允许接受icmp数据包到本地  
iptables -A INPUT -p icmp --icmp-type 8 -j DROP  
  
不允许发送未知数据包到本地  
iptables -A INPUT -p all -m state --state INVALID -j DROP  
  
允许已经允许过的连接和被动请求数据包发送到本地  
iptables -A INPUT all -m state --state ESTABLISHED,RELATED -j ACCEPT  
  
检查该连接中第一个数据包,并检查该数据包是否包含syn标记,符合两项条件才允许进入。  
iptables -A INPUT -p tcp --syn --dport 22 -m state --state NEW -j ACCEPT  
  
使用Multiport模块一次添加多个端口  
iptables -A INPUT -p tcp --syn -m state --state NEW -m multiport --dport 21,22,23,24,25 -j ACCEPT  
  
检查所有 TCP-Flags,但只有syn及fin两个标记同时为1时,数据包才会被筛选出来  
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP  
  
检查所有 TCP-Flags中syn及fin两个标记同时为1时,数据包才会被筛选出来  
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP  
  
数据批量添加  
cat /root/mac_list.txt | while read MAC  
do  
     MAC=$( echo $MAC | awk '{print $1}' )  
  
     iptables -t filter -A FORWARD -i eth1 -o eth0 -m mac --mac-source $MAC -j ACCEPT  
done  
  
  
mangle表用法 MRAK模块匹配(单数据包)  
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 80  
iptables -A FORWARD -p all -m mark --mark 80 -j DROP  
  
管理用户或组模块  
iptables -A OUTPUT -p tcp -m owner --uid--owner tom --dport 80 -j ACCEPT  
iptables -A OUTPUT -p udp -m owner --uid--owner tom --dport 53 -j ACCEPT  
iptables -A OUTPUT -p all -m owner --uid--owner tom -j DROP  
  
使用iprange模块添加ip范围  
iptables -A INPUT -m iprange --src-range 192.168.0.2-192.168.0.61 -j DROP  
iptables -A INPUT -m iprange --dst-range 192.168.0.2-192.168.0.61 -j DROP  
  
ttl值匹配模块  
iptables -A INPUT -m ttl --ttl-eq 64 -j REJECT  
--ttl-eq 等于  
--ttl-lt 小于  
--ttl-gt 大于  
  
数据包状态 发送 接受   
TCP        NEW  ESTABLISHED  
UDP        NEW ESTABLISHED  
ICMP       NEW  RELATED  
  
IPSEC SPI 值控制模块  
iptables -A FORWARD -p ah -m ah --ahspi 300 -j ACCEPT  
iptables -A FORWARD -p esp -m esp --espspi 200 -j ACCEPT  
  
pkttype模块  
unicast:数据包发送的对象时特定的,如主机A传输给主机B即为unicast类型  
broadcast:数据包传送的对象为广播地址,如192.168.0.255  
multicast:通常应用于网络的“音频”或“视频”广播,而Multicast数据包的特点是,其Source IP一定介于224.0.0.0/24之间。  
iptables -A FORWARD -i eth0 -p icmp -m pkttype --pky-type broadcast -j DROP  
  
length模块  
MTU=(IP包+ICMP包+DATA)  
iptables -A INPUT -p icmp --icmp -type 8 -m length --length 92 -j ACCEPT  
iptables -A INPUT -p icmp --icmp -type 8 -j DROP  
  
--length 50 匹配MTU值刚好为50字节的数据包  
--length :100 匹配MTU值小于100个字节的数据包  
--length 50:100 匹配MTU值介于50-100个字节的数据包  
  
limit数据包重复率匹配  
一分钟进入10个数据包以上,就会限制一分钟进入6个数据包,直到6*10s内没有收到数据包,将会解除  
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/m --limit-burst 10 -j ACCEPT  
iptables -A INPUT -p icmp --icmp-type 8 -j DROP  
  
recent模块  
--name 设置跟踪数据库的文件名  
[!]--set将符合条件的来源数据添加到数据库中,但如果来源端数据已经存在,则更新数据库中的记录信息  
[!]--rcheck只进行数据库中信息的匹配,并不会对已存在的数据做任何变更操作  
[!]--update如果来源端的数据已存在,则将其更新;若不存在,则不做任何处理  
[!]--remove如果来源端数据已存在,则将其删除,若不存在,则不做任何处理  
[!]--seconds seconds当事件发生时,只会匹配数据库中前“几秒”内的记录,--seconds必须与--rcheck或--update参数共用  
[!]--hitcount hits匹配重复发生次数,必须与--rcheck或--update参数共用  
iptables -A INPUT -p icmp --icmp-type 8 -m recent --name icmp_db --rcheck --second 60 --hitcount 6 -j DROP  
iptables -A INPUT -p icmp --icmp-type 8 -m recent --set --name icmp_db  
cat /proc/net/xt_recent/icmp_db  
modprobe xt_recent ip_list_tot=1024 ip_pkt_list_tot=50  
ip_list_tot设置ip上限条数,默认100  
ip_pkt_list_tot设置数据存储空间,默认20  
  
string模块 匹配字符串  
--algo 字符串匹配算法的选择,string模块提供了两种不同的算法,分别是bm(Boyer-Moore)及kmp(Knuth-Pratt-Morris),其中bm算法平均速度会比kmp快,不过,你也不必太在意,因为我们匹配的对象不会太大,因此用哪种都差不多  
--from、--to设置匹配字符串的范围,我们可以使用--from来设置匹配的起点,并以--to来设置匹配的终点,其单位为字节,如--from 10意为从第10个字符串开始匹配,如果没有设置这个参数,那么匹配的范围将是整个数据包  
[!]--string匹配条件,如--string "system32"是指要匹配的字符串为system32  
[!]--hex-string匹配条件,但不同于--string参数的地方在于--hex-string是以16进制的方式进行匹配,特别适合用于非ascii字符串的匹配,其匹配条件的表示方法为--hex-string "|2e2f303132333435|",请注意实际匹配条件为2e2f303132333435,但其左右要使用"|"符号  
iptables -A FORWARD -i eth0 -o eth1 -p tcp -d $WEB_SERVER --dport 80 -m string --algo bm --string "system32" -j DROP  
  
  
connlimit模块 匹配连接数  
iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn -d $Web_Server --dport 80 -m connlimit --connlimit-above 30 --connlimit-mask 32 -j DROP  
[!]--connlimit-above 指定最大连接数量  
--connlimit-mask 此参数为子网络掩码,用于匹配范围,例如 8A 16B 24C 25 1/2个c 32代表单一个IP  
  
connbytes模块限制每个连接中所能传输的数据量  
iptables -A FORWARD -p tcp -d $Web_Server --dport 80 -m connbytes --connbytes-dir reply --connbytes-mode bytes --connbytes 20971520: -j DROP  
[!]--connbytes-dir original来源方向 reply应答方向 both双向  
--connbytes-mode packets以数据包的数量来计算 bytes以数据量来计算  
--connbytes 10:匹配10个以上的单位量 :50匹配50个一下的单位量 10:50匹配10个-50个之间的单位量  
  
quota模块 匹配每个ip限制流量(不会清除纪录,要刷新纪录)  
iptables -A FORWARD -i eth0 -o eth1 -p tcp --sport 80 -m quota --quota 524288000 -j ACCEPT  
iptables -A FORWARD -i eth0 -o eth1 -p tcp --sport 80 -j DROP  
  
time模块 设置规则生效时间  
iptables -A FORWARD -o eth1 -d $SRV_FARM -m time --weekdays Mon,Tue,Wed,Thu,Fri --timestart 09:00 --timestop 21:00 -j ACCEPT  
iptables -A FORWARD -o eth1 -d $SRV_FARM -j DROP  
  
--datestart:YYYY[-MM[-DD[Thh[:mm[:ss]]]]]  
--datestop  
--timestart:hh:mm[:ss]  
--timestop  
[!]--monthdays:day[,day]...1,2,3,4,5,6,7,8,9,10,31  
[!]--weekdays:day[,day]...Mon,Tue,Wed,Thu,Fri,Sat,Sun  
  
connmark模块匹配mark值(整条连接)  
iptables -A INPUT -m connmark --mark 1 -j DROP  
  
conntrack模块匹配数据包状态,是state模块的加强版  
[!]--ctstate:匹配数据包的状态,状态列表分别为NEW,ESTABLISHED,RELATED,INVALID,DNAT,SNAT  
[!]--ctproto:用于匹配OSI七层中第四层的通信层,其功能与用法就如同iptables中的-p参数,如-p tcp,-p udp,-p 47等。  
[!]--ctorigsrc匹配连接发起方向的来源端IP  
[!]--ctorigdst匹配连接发起方向的目的端IP  
[!]--ctreplsrc匹配数据包应答方向的来源端IP  
[!]--ctrepldst匹配数据包应答方向的目的端IP  
[!]--ctorigsrcport  
[!]--ctorigdstport  
[!]--ctreplsrcport  
[!]--ctrepldstport  
[!]--ctexpire连接在Netfilter Conntrack数据库(/porc/net/nf_conntrack)的存活时间,使用方法如下:  
匹配特定的存活时间--ctexpire time  
匹配特定区间的存活时间--ctexpire time:time  
--ctdir设置要匹配那个方向的数据包,使用方法如下:  
只匹配连接发起方向的数据包--ctdir ORIGINAL  
只匹配数据包应答方向的数据包--ctdir REPLY  
若没有设置这个参数,默认会匹配双向的所有数据包  
#!/bin/bash  
iptables -F  
modprobe nf_conntrack_ftp  
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT  
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 21 -m state --state NEW -j ACCEPT  
iptables -A INPUT -p tcp --dport 21 -j DROP  
  
#!/bin/bash  
iptables -F  
modprobe nf_conntrack_ftp  
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT  
iptables -A INPUT -m conntrack --ctproto tcp --ctorigsrc 192.168.1.0/24 --ctorigdstport 21 --ctstate NEW -j ACCEPT  
iptables -A INTPU -p tcp --dport 21 -j DROP  
  
statistic模块进行比例匹配  
以随机方式丢弃50%的数据包  
iptables -A INPUT -p icmp -m statistic --mode random --probability 0.5 -j DROP  
按一定规律在每10个icmp包中丢弃1个icmp包  
iptables -A INPUT -p icmp -m statistic --mode nth --every 10 -j DROP  
--mode:random以随机方式丢弃数据包,nth按一定规律丢弃数据包  
--probability:此参数需结合random模式使用,例如--probability 0.4 即代表丢弃40%的数据,其中的数值为0-1  
--every此参数需结合nth模式使用,例如--every 10代表在每10个数据包中要丢弃1个数据包  
--packet此参数需要在nth模式与--every参数结合使用,例如--every 10 --packet5  

发表评论

电子邮件地址不会被公开。 必填项已用*标注