一般只需设置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
对入站与出站都需要设定规则,此种设定会导致不能上网
命令格式:
常用参数:
-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