Loading... <h1>iptables</h1> <hr /> <ul class=" list-paddingleft-2"> <li> <p>简述</p> </li> <li> <p>基础知识</p> </li> <li> <p>命令使用</p> </li> </ul> <hr /> <h2>简述</h2> <h5>iptables是什么?netfilter又是什么?</h5> <p>iptables是位于用户控件的一个防火墙规则控制管理工具。netfilter是位于内核中的真正的防火墙,由五个钩子函数(hooks)而组成。</p> <h5>iptables的作用是什么?</h5> <p>用来添加,删除,管理netfilter规则。</p> <h5>netfilter的作用是什么?</h5> <p>起到过滤封包,转换与映射IP地址和端口,拆分和修改封包内容,追踪封包等功能,这些构成了四个功能表。</p> <h2>基础知识</h2> <h3>组成部分</h3> <pre>iptables:规则控制管理工具。 netfilter:位于内核空间的过滤器,实际上生效的部分。 四表:大致根据功能可以分为四个,也就是在内部维护了四个表。 五链:netfilter一共会在五个地方设置hooks,钩子函数,也就是说在五个地方会有关卡来过滤,依据不同的表,需要用到的链也是不同的。</pre> <h3>五链(five hooks)</h3> <pre>PREROUTING:进入路由前。 POSTROUTING:出路由前。 INPUT:进度内存空间前。 OUTPUT:出内存空间前。 FORWARD:转发链。 根据进入到出去的顺序为: PREROUTING -> INPUT -> OUTOUT -> POSTROUTING 进入本机用户空间处理。 PREROUTING -> FORWARD -> POSTROUTING 进入本机后直接转发处理。</pre> <p><img src="//cto.wang/usr/uploads/2016/07/20160703184413-15.png" alt="hooks" /></p> <h3>四表</h3> <pre>根据优先级从低到高为: filter:过滤。 INPUT OUTPUT FORWARD nat:网络地址转换。 PREROUTING POSTROUTING OUTPUT mangle:报文拆分已经重装,修改报文内容。 INPUT OUTPUT PREROUTING POSTROUTING FOEWARD raw:关闭NAT上启动的连接追踪机制。 PREROUTING OUTPUT</pre> <h3>协议类型</h3> <pre>tcp:传输控制协议,可建立的是可靠的连接。 udp:用户数据包协议,建立的为不可靠的连接。 icmp:网络控制报文协议,iptables中主要用来控制ping报文。</pre> <h3>常用的端口</h3> <pre>ftp: tcp/20,21 ssh: tcp/22 telnet: tcp/23 smtp:tcp/25 http: tcp/80,8080 dns: tcp,udp/53 portmapper: tcp,udp/111 samba: udp/137,138 tcp/139,445,901 https: tcp/443 nfs: tcp,udp/2049 mysql: tcp/3306 php-fpm: tcp/9000</pre> <h2>命令使用</h2> <h3>格式:</h3> <pre>iptables [-t tables] -A|I|R [chain [num]] -[par] [value] -p [protocol [value]] -m [option [value]] -j [active [value]]</pre> <h3>保存与重载:</h3> <pre>Cnetos6: iptables-save > /PATH/TO/FILE iptables-restore < /PATH/TP/FILE Centos7:引入了新的iptables管理工具,firewall。 firewalld-cmd firewalld-config *具体的使用方法可自行查阅官方文档。</pre> <h3>常用参数:</h3> <pre>iptables [-t table] {-A|-D} chain rule-specification -A:添加 iptables [-t table] -I chain [rulenum] rule-specification -I:插入 iptables [-t table] -R chain rulenum rule-specification -R:替换 iptables [-t table] -D chain rulenum -D:删除 iptables [-t table] -S [chain [rulenum]] -S:保存 iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] -F:清空规则 -L:列出规则 -Z:清零所有计数器 iptables [-t table] -N chain -N:创建一个新的用户自定义链 iptables [-t table] -X [chain] -X:删除用户自定义链 iptables [-t table] -P chain target -P:为一个链设定默认的策略,ACCEPT DROP REJECT iptables [-t table] -E old-chain-name new-chain-name -E:重命名一个自定义链</pre> <h3>通用匹配(-par [value])</h3> <pre>-i [intface] :指定作用的网卡。 -s [source-ip]:指定源地址。 -d [destination-ip]:指定目标地址。 -f:匹配包分片后的除了第一个包外的其他包。</pre> <h3>隐式扩展参数(-p protocol parm):</h3> <pre>-tcp --dport|sport port --tcp-flags LIST1 LIST2 表示在list1的标记列表中,list所指定的值为1即被标识的包。 例: -p tcp --tcp-flags ACK,SYN,FIN ACK :匹配ACK被设置,但是SYN和FIN没有被标识的包。 udp --dport|sport port 例: -p udp --dport 80 :标识匹配目标地址的80端口,所对应的如果为sport就为源地址的80端口。 icmp --icmp-type 0|8 0:响应报文 8:请求报文 例: -p icmp --icmp-type 0 :匹配icmp响应报文,详细的icmp code对照表会在最后附加。</pre> <h3>显示扩展参数(-m parm):</h3> <pre>mutilport --dports|sports|ports port1,port2... 例: -m mutilport --dports 22,80 :匹配目标地址端口22和80,可以指定一起指定多个端口,对应的sports源地址端口。 iprange [!] --src-range|--dst-range ipsfrom-toip 例: -m iprange --dst-range 192.168.1.1-192.168.1.10 :匹配目标地址为192.168.1.1-192.168.1.10范围内的主机。 -m iptange ! --src-range 192.168.1.100 :匹配源地址不是192.168.1.100的所有主机。 string --algo bm|kmp [!] --string 'parrern' --algo bm|kmp 指定字符串查找算法。 例: -m string --algo bm --string 'chrome' :匹配所有报文中出现了chrome字符的报文。 -m string --algo kmp --sring 'ie8' :匹配所有报文中除了ie8字符外的所有报文。 limit --limit rate[/second|/minute|/hour|/day] --limit-burst num 例: -m limit --limite 30/minute :报文传输速率为每分钟最多30封报文,即2秒一封最大速率 -m limit --limit-burst 100 :令牌桶允许存放100个令牌,如果存放的令牌超过100则开始丢弃令牌。 connlimit --connlimit-above num --conlimit-upto num 例: -m connlimit --connlimit-above 30 :允许并发连接数量要小于30. -m connlimit --connlimit-upto 10 : 允许并发连接数量大于10. recent --name #设定列表名称,默认DEFAULT。 --rsource:源地址,此为默认。 --rdest:目的地址 --seconds:指定时间内 --hitcount:命中次数 --set:将地址添加进列表,并更新信息,包含地址加入的时间戳。 --rcheck:检查地址是否在列表,以第一个匹配开始计算时间。 --update:和rcheck类似,以最后一个匹配计算时间。 --remove:在列表里删除相应地址,后跟列表名称及地址。 例: -m recent --name web --set -m recent --name web --update --seconds 300 -hitconut 10 -j DROP mac [!] --mac-source address 例: -m mac --mac-source 00:00:00:00:00:00 :匹配mac地址为00:00:00:00:00:00的报文。 time --datastart yyyy-mm-dd --datastop yyyy-mm-dd --timestart hh:mm[:ss] --timestop hh:mm[:ss] [!] --monthdays day1,day2... [!] --weekdays day1,day2... 例: -m time --datastart 2016-05-30 --datastop 2016-06-01 :匹配两个日期段内的报文。 -m time --timestart 10:00:00 --tiomestop 18:30:00 :匹配两个时间段内的报文。 -m time ! --monthdays 1-20 :匹配月除了1-20号外的所有天数。 -m time --monthdays 25- :匹配25号之后的所有天数。 -m time --weekdays 1-3 :匹配周的周一周二周三。 -m time ! --weekdays 3,5 :匹配除了周三与周五的所有天。 state [!] --state INVALID|ESTABLISHED|NEW|RELATED INVALID:无法识别的连接。 ESTABLISHED:建立新连接后,在此连接失效前的所有连接。 NEW:新连接。 RELATED:相关的连接,建立连接后产生的新连接等,如ftp协议第一次连接21命令通道后产生的20端口的数据通道连接。 例: -m state --state NEW,WSTABLISHED :新连接与ESTABLISHED连接。 -m state ! --state RELATED :除了无法识别的连接外的所有连接。</pre> <h3>动作(-j active):</h3> <pre>DROP:丢弃。 REJECT:允许。 ACCEPT:拒绝。 RETURN::结束在目前规则链中的过滤程序,返回主规则链继续过滤。 LOG:记录日志 --log-level NUM :日志等级。 --log-prefix STRING :日志前缀。 MASQUEARDE:不设置地址转换,而采用地址隐藏的策略来使的iptables自动取得转换地址。 MARK:防火墙标记,用来批量标识地址和端口。 --mark VALUE[/mask] SNAT:源地址转换。 --to-source IPADDR[:PORT] DNAT:目标地址转换。 --to-destination IPADDR[:PORT]</pre> <h3>保存和导入</h3> <pre>iptables-save [file] :保存规则到文件。 iptables-restore [file] :从文件导入规则。</pre> <h3>常用命令组合示例:</h3> <pre>iptables [-t filter] -L -n :显示指定的表规则状况,默认为filter表。 iptables -A INTPUT -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT 放开80端口的请求。 iptables -A OUTPUT -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT 放开80端口的响应。 iptables -t mangle -A PREROUTING -d 192.168.1.1 -p tcp -m mutilport --dports 22,80 -j MARK --mark 100 将22和80端口设置为一个防火墙标记100。 iptables -t NAT -A POSTROUTING -s 192.168.1.0 -p tcp -j SNAT --to-source 172.16.0.1 所有内网网段192.168.1.0的ip都将被映射为172.16.0.1这个ip iptables -t NAT -A PREROUTING -d 172.16.0.1 -p tcp -m mutilport --dports 22,80 -j DNAT --to-destination 192.168.1.1 所有目标ip 172.16.0.1的22,80请求都被转到192.168.1.1的相应端口上。 iptables -A INPUT -d 192.168.1.1 -p icmp --icmp-type 0 -j ACCEPT 允许icmp的响应报文。 iptables -A OUTPUT -s 192.168.1.1 -p icmp --icmp-type 8 -j ACCEPT 允许icmp的请求报文。 iptables -A FORWARD -d 192.168.1.3 -p tcp --dport 80 -j ACCEPT 允许目标地址为192.168.1.3的请求转发。</pre> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信