iptables命令: iptables [-t table] {-A|-C|-D} chain rule-specification ip6tables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET -t table: filter ,nat,mangle,raw 默认为filter 链管理: -F :flush,清空规则链:省略链表示清空指定表上的所有的链 -N:new,创建新的自定义规则链: -X:drop,删除用户自定义的空的规则链: -Z:zero,清零,置零规则计数器 -P:policy,为指定链设置默认策略,对filter表中的链而言,默认策略通常有ACCEPT,DROP,REJECT; -E:rEname,重命名自定义链,引用计数不为0的自定义链,无法改名,也无法删除 规则管理: -A:append,将新的规则追加与指定链的尾部 -I:insert,将新规则插入至指定链的指定位置(需指定序号,默认为第一条): -D:delete,删除指定链上的指定规则: 两种指定方式: 1、指定匹配条件 2、指定规则编号 -R:replace,替换指定链上的指定规则。 查看: -L:list,列出指定链上的所有规则。 -n:numberic ,以数字格式显示地址和端口号 -v:verbose,显示详细信息 -vv,-vvv --line-numbers:显示规则编号 -x:exectly,显示计数器计数结果的精确值。 匹配条件: 基本匹配: [!] -s, --src,--source IP|Netaddr:检查报文中的源ip地址是否符合此处指定的地址范围 [!] -d,--dst,--destination IP|Netaddr:检查报文中的目标ip地址是否符合此处指定的地址范围 -p ,--protocal{tcp|udp|icmp}:检查报文中的协议,即ip首部中的protocol所标识的协议,8bit,6标识tcp.17表示udp -i,--in-inteface IFACE :数据报文的流入接口。仅能用于PREROUTING,INPUT,FORWARD链 -o,--out-inteface :数据报文的流出接口。仅能用于FORWARD,OUTPUT,POSTROUTING链上 扩展匹配:-m macth_name --spec_options eq: -m tcp --dport 22 表示使用tcp扩展的目标端口为22 隐式扩展:对-p protocal 指明的协议进行扩展,可省略-m选项: -p tcp --dport PORT[-PORT]:目标端口,可以是单个端口或者连续多个端口 --sport PORT[-PORT] --tcp-flags list1 list2 :检查list1所指明的所有标志位,且这其中,list2所表示出的所有标记必须为1,而余下的必须为0,没有list1中指明的,不做检查。 SYN,ACK,FIN,RST,PSH,URG, eq:--tcp-flags SYN,ACK,FIN,RST SYN ===== --syn: 检查三次握手的第一次握手 -p udp --dport --sport -p icmp --icmp-type 可用数字表示其类型: 0 echo-reply 8 echo-request 显示扩展: 目标: -j target:jump至指定的target ACCEPT:接收 DROP:丢弃 REJECT;拒绝 RETURN:返回调用链 REDIRECT:端口重定向 LOG:记录日志 MARK:做防火墙标记 DNAT:目标地址转换 SNAT:源地址转换 MASQUERADE:地址伪装 ... 自定义链:由自定义链上的规则进行匹配检查。 显示扩展:必须显示指明使用的扩展模块(rpm -ql iptables|grep "\.so") centos6 man iptables centos7 man iptbales-extensions 1、multiport扩展 以离散方式定义多端口匹配:最多匹配15个端口 [!] --source-ports,--sports port[,port|,port:port]... 指明多个源端口 [!] --destination-ports,--dports port[,port|,port:port]... 指明多个离散的目标端口 [!] --ports port[,port|,port:port]... 例子: # iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT # iptables -A OUTPUT -p tcp -m multiport --sports 22,80 -j ACCEPT 2、iprange扩展 指明连续的(但一般不能扩展为整个网络)ip地址范围 [!] --src-range from[-to] 匹配指明连续的源IP地址范围 [!] --dst-range from[-to] 指明连续的目标IP地址范围 # iptables -A INPUT -m iprange --src-range 172.18.11.0-172.18.11.100 -j DROP # iptables -A INPUT -p tcp -m multiport --dports 22,80 -m iprange --src-range 172.18.11.0-172.18.11.100 -j DROP 3、string扩展 检查报文中出现的字符串: --algo {bm|kmp}: [!] --string pattern [!] --hex-string pattern 16进制 iptables -I OUTPUT -m string --algo bm --string "movle" -j DROP 4、time扩展 根据报文到达的时间与指定的时间范围进行匹配 --datestart --datestop --timestart --timestop --monthdays --weekdays # iptables -I INPUT -d 172.18.11.7 -p tcp --dport 80 -m time --timestart 8:00 --timestop 10:00 -j DROP # 注意 centos7 使用的是UTC时间 5、connlimit扩展 根据每客户端ip(也可以是地址块)做并发连接数数量匹配: --connlimit-above n 连接数量大于n --connlimit-upto n 连接数量小于等于n # iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT # ssh连接大于3后链接被拒绝 6、limit扩展 基于收发报文速率做检查: 令牌桶过滤器: --limit rate[/second|/minute|/hour|/day] --limit-burst number # iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 6/minute -j ACCEPT # iptables -A INPUT -p icmp -j REJECT ##跳过5个包,然后没10秒钟一个回应一个ping包 7、state扩展 检查连接追踪机制检查连接的状态: 调整连接追踪功能所能容纳的最大连接数量: /proc/sys/net/nf_conntrack_max 已经追踪到并记录下的连接: /proc/net/nf_conntrack 不同协议或者连接类型追踪的时长 /proc/sys/net/netfilter/ 可追踪的连接状态: NEW:新发出的请求:连接追踪模板中不存在此连接相关的信息条目,因此,将其识别为第一次发出的请求 ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态。 RELATED:相关的连接:如ftp协议中的命令连接与数据连接之间的关系 INVALIED:无法识别的连接 --state state1 state2... 例子: # iptables -I INPUT -d 172.18.11.7 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -I OUTPUT -s 172.18.11.7 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 对新发起的http和ssh访问请求做控制, # iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -s 172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT 如何开放被动模式的FTP服务? (1) 装载ftp追踪时专用的模块 #modprobe nf_conntrack_ftp 路径 /lib/modules/3.10.0-514.el7.x86_64/kernel/net/netfilternf_conntrack_ftp.ko 模块信息 modinfo nf_conntrack_ftp.ko (2) 放行请求报文: 命令连接:NEW,ESTABLISHED 数据连接:RELATED,ESTABLISHED #iptables -A INPUT -d localIP -p tcp -dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A INPUT -d localIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT (3) 放行响应报文 ESTABLISHED #iptables -A OUTPUT -d localIP -p tcp -m state --state ESTABLISHED -j ACCEPT 如何保存及重载规则: 保存规则至指定文件: iptables-save > /path/to/somefile 从指定文件重载规则: iptables-restore < /path/from/somefile centos6: service iptables save iptable-save >/etc/sysconfig/iptables service iptables restart iptables-restore < /etc/sysconfig/iptables 网络防火墙: 核心转发配置:/proc/sys/net/ipv4/ip_forward /etc/sysctl.conf net.ipv4.ip_forward=1 nat: SNAT:只修改请求报文的源地址 DNAT:只修改请求报文的目标地址 nat表: PREROUTING: DNAT OUTPUT POSTROUTING: SNAT 源地址转换 iptables -t nat -A POSTROUTING -s local_net ! -d local_net -j SNAT --to-source public_ip 公网ip固定 iptables -t nat -A POSTROUTING -s local_net ! -d local_net -j MASQUERADE 公网ip不固定 目标地址转换 iptables -t nat -A POSTROUTING -d public_ip -p tcp|udp --dport PORT -j DNAT --to-destination local_ip:port |