iptables -A INPUT -s 192.168.109.10 -j DROP:拒绝192.168.109.10主机访问本服务器;
注意:-A:添加一条规则,默认是加在最后。
注意:"拒绝给192.168.109.10主机提供服务",最好使用INPUT链。使用PREROUTING,也可以满足要求,但是如果用户的要求是让服务器提供转发功能,添加到PREROUTING链中,"转发"功能也将被拒绝掉。
注意:链名要大写;
注意:-s:指定源地址,可以是IP地址,也可以是网段"192.168.109.10/24";"-s 为空",表示拒绝所有;
注意:-j:指定所需要的操作;
注意:拒绝有两种方式,一种是"REJECT",还有一种是"DROP";DROP是不回应,REJECT是拒绝;
注意:iptables -A INPUT -j DROP,表示拒绝所有。不过加规则的时候,不要将自己的ssh给拒绝掉。
iptables -nvL -t mangle:查看mangle表中的防火墙规则;
注意:-t:指定表名,默认情况下是"fliter"表;
注意:-v:查看详细信息;
pkts:被本机报文所匹配的个数;
prot:放行哪种协议;
opt:额外的选项,--表示没有;
target:处理机制;
注意:选项中"v"和"L"的顺序(V只能在L的前面);
iptables -nvL --line-numbers:查看fliter表中规则的顺序;
注意:--line-numbers:查看指定表中的规则的顺序;
注意:不指定表,默认情况下就是"fliter"表;
注意:表中的规则是有执行顺序的,编号(num)越小,越先执行。只要匹配到结果,就不会往下执行了;
iptables -F:清空"fliter"表中的所有的规则;
注意:-F:表示清空指定表中的所有链中的规则;
iptables -I INPUT -s 1.1.1.1 -j DROP:在"fliter"表中的INPUT链中,链首插入一条规则;
注意:-I:表示在指定的链中插入一条规则,可以指定编号;
iptables -R INPUT 1 -s 2.2.2.2 -j REJECT:表示替换第一条规则;
注意:-R,replace,替换指定的规则;
iptables -S:以iptables-save命令格式显示fliter链上的规则;
iptables -A INPUT -s 192.168.109.10 -d 192.168.109.4 -j REJECT:拒绝来自192.168.109.10的主机访问192.168.109.4的ip地址;
注意:-d:指定目标地址,使规则更加详细;
iptables -A INPUT -s 192.168.109.10 -d 192.168.109.4,192.168.109.5 -j REJECT:拒绝192.168.109.10的主机访问192.168.109.4,192.168.109.5这两个ip地址。
注意:一条命令添加两条规则;
注意:源地址也可以使用这种方式,快速添加规则;
注意:该命令在规则中的语义的含义,-s、-d属于并且的关系,即:拒绝源是192.168.109.10的ip,且源是192.168.109.4的访问;而192.168.109.4和192.168.109.5在逻辑上属于或者的关系。
iptables -A INPUT -s 192.168.109.10 -p tcp --dport 22 -j REJECT:拒绝192.168.109.10主机使用tcp协议访问我的所有ip的22端口。
注意:-p:指定协议;可以通过"/etc/protocols"文件查看协议类型;
注意:--dport:指定目标主机的端口号;(拒绝别人链接我。)
注意:--sport:指定源主机的端口号;(拒绝我链接别人。)
注意:此处,注意区分dport和sport;
iptables -A INPUT -s 192.168.109.10 -p icmp -j REJECT:拒绝来自192.168.109.10主机发来的ping包。
注意:icmp协议没有端口号,即不属于tcp也不属于udp。由于icmp协议的特性,这条命令的结果会造成,192.168.109.10无法ping通自己,自己也无法ping通192.168.109.10主机。
注意:如果要想实现别人无法ping通自己,自己可以ping通别人,需要根据state来判断。0表示回应包,8表示请求包。
iptables -A INPUT -s 192.168.109.10 -i eth0 -j REJECT:拒绝192.168.109.10主机访问我的eth0网卡。
注意:-i:加上网卡名,表示报文流入的接口;
注意:-o:加上网卡名,表示报文流出的接口;
iptables -A INPUT ! -s 192.168.109.4 -p tcp --dport 80 -j REJECT:除了192.168.109.4的主机可以访问我的tcp的80端口,其他的主机全部拒绝;
注意:!:表示"非";一般情况下,很少使用该方式。
iptables -A INPUT -s 192.168.109.4 -p icmp --icmp-type 8 -j REJECT:拒绝来自192.168.109.10主机发送来的icmp的请求包。即192.168.109.10主机无法ping通我,我可以ping通它。
注意:icmp协议中,ping通需要满足两个条件,首先源主机向目标主机发送一个请求包(8),目标主机收到之后,便会返回一个回应包(0)。
注意:-p:指定协议;
注意:--icmp-type:指定ping包的类型。(code可以省略;)
iptables -A INPUT -s 192.168.109.10 -p tcp -m multiport --dports 20:22,80 -j REJECT:拒绝来自192.168.109.10主机发送来的访问我的20-22,80端口的包。
注意:-m:后面跟模块名,multiport:以离散形式表示的多端口(最多可以跟15个端口);
注意:--dports:目标端口是多个端口;
注意:使用samba服务测试多端口的话,可能存在问题。想要抓包测试的话,可以使用"tcpdump -i eth0 -nn host 192.168.109.4";
iptables -A INPUT -m iprange --src-range 192.168.109.1-192.168.109.10 -j REJECT:拒绝192.168.109.1~192.168.109.10范围内的所有主机的访问。
注意:iprange:ip范围的模块;
注意:--src-range:源地址范围;
注意:--dsc-range:目标地址的范围;
iptables -A INPUT -m mac --mac-source 00:0c:29:2f:b1:d6 -j REJECT:拒绝该mac地址的主机访问本主机的资源。
注意:mac:mac地址模块;
注意:--mac-source:源主机的mac地址;
iptables -A OUTPUT -p tcp -m string --algo bm --string "han" -j REJECT:拒绝所有主机访问访问我的有"han"字符串的报文。
注意:string:字符串模块;
注意:--algo:指定匹配算法,bm、kmp算法,两个随便选一个;
注意:--string:指定要匹配的字符串;
注意:--from offset:开始偏移,--to offset:结束偏移;
注意:添加的是OUTPUT链;
iptables -F OUTPUT:清空OUTPUT链中的规则;
iptables -A INPUT -m time --weekdays 1,2,3,4,5 --timestart 9:00 --timestop 10:00 -j REJECT:拒绝所有的主机在周一到周五的九点~十点之间,访问本主机的所有资源;
注意:time:时间模块;
注意:--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss] 时间
--timestop hh:mm[:ss]
--monthdays day[,day...] 每个月的几号
--weekdays day[,day...] 星期几
注意:centos7中,使用的是UTC时间(北京时间转化成UTC时间是减8);centos6中使用的是本地时间;
iptables -A INPUT -m connlimit --connlimit-above 2 -j REJECT:并发连接的数量大于两条的时候,就拒绝;
注意:connlimit:并发连接数量的模块;
注意:--connlimit-upto n:连接的数量小于等于n时匹配;
注意:--connlimit-above n:连接的数量大于n时匹配;
注意:可以使用ssh服务测试;
iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT:对于icmp协议,ping通5个包后,便会以每分钟接收十个的速度匹配。
注意:--limit-burst 5:达到5个之后,便会限制速度;
注意:--limit 10/minute:以每分钟通过10个的速度匹配;
注意:需要"iptables -A INPUT -p icmp -j REJECT"配合使用。
iptables -N ACCOUNT:在"fliter表中,"创建一个自定义链,命名为ACCOUNT;
注意:-N:创建一条链;建议,将一些常用的规则放在自定义的链中,当使用的时候,将自定义的链关联到INPUT链中。
注意:可以将自定义链的操作,理解为函数的声明。将关联操作,理解为函数的调用;
iptables -A ACCOUNT -s 192.168.109.10,192.168.109.220 -j REJECT:在自定义链ACCOUNT中添加一条规则;
iptables -D INPUT 2:删除INPUT链中的第二条;
iptables -A INPUT -j ACCOUNT:将ACCOUNT链关联到INPUT链中;
iptables -F ACCOUNT:清空"fliter"表中的ACCOUNT链中的规则;
iptables -X ACCOUNT:删除"fliter"表中ACCOUNRT链;
注意:-X:删除指定的自定义的链
iptables -A INPUT -p icmp -m state --state NEW -j REJECT:拒绝使用icmp第一次连接的请求包;
注意:state:state模块;
注意:NEW:第一连接(注意此处并不是三次握手中的状态);
iptables -A INPUT -s 192.168.109.10 -j LOG --log-prefix "FROM .10~~":当192.168.109.10主机访问我时,将他记录到/var/log/messige日志文件中,并且,日志中的记录的前缀的"FROM .10~~"
注意:LOG,记录日志的target;
注意:--log-prefix:定义日志文件中的记录的前缀;
iptables -A FORWARD -s 192.168.109.4/24 -d 172.17.253.120/16 -m state --state NEW -j ACCEPT:在FORWARD表中添加一条规则,当源192.168.109.0网段中的主机,目标是172.17.0.0网段中的主机时,状态是NEW(第一条连接)时,就允许连接;
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT:对于状态是ESTABLISHED的连接,允许通过。
iptables -A FORWARD -j REJECT:拒绝所有连接;
以上三条规则结合起来,可以实现允许192.168.109.0网段中的主机ping通172.17.0.0的主机,但是反过来,ping不通。实现网络防火墙的功能。
可以通过实验来验证:
四台机器,两台192的地址(A、B),一台172的地址(D),还有一台充当路由器(C),既有172的地址,又有192的地址。设置好四台主机的路由表,并开启C主机的路由转发功能。然后,执行iptables的命令,添加规则,即可实现功能。
iptables -t nat -R POSTROUTING 1 -s 192.168.109.0/24 -j SNAT --to-source 172.17.250.111:在nat表中的POSTROUTING链中,添加一策略,当收到192.168.109.0/24网段的主机访问的目标地址是任意地址的时候,就将该包的源地址改成172.17.250.111,发送。(SNAT)
注意:要保证防火墙主机上的路由表,有到达目标地址的路径。
注意:在实验中的C主机上,执行了该规则后,A主机通过C主机,到达C主机的POSTROUTING链的时候,将包的源地址改成C主机的公网地址,然后,发送给D主机。实验的时候,将D主机上的默认路由删掉。确保返回的包是将C主机的公网地址,作为目标地址的。
注意:可以在D主机上,安装一个httpd服务,A访问D之后,通过查看日志(/var/log/httpd/access_log),来验证结果。
iptables -t nat -A PREROUTING -d 172.17.250.111 -dport 80 -j DNAT --to-destination 192.168.109.4:8080:当访问172.17.250.111主机的80端口的时候,将目标端口改成192.168.109.4主机的8080端口。(DNAT)
注意:将192.168.109.4主机上的httpd服务监听的端口改成8080;