Iptables是位于用户空间,是linux系统上的防火墙管理配置规则的工具,主要用于添加、删除、管理netfilter的规则,
Netfilter是位于内核中真正的防火墙,由5个钩子组成,也叫五个规则链。 Netfilter的作用:起到过滤封包,转换与映射IP地址和端口,拆分和修改封包内容,追踪封包等功能
Iptables的四表五链
功能:(四表) filter: 过滤,防火墙; nat: network address translation, 网络地址转换; mangle:拆解报文,做出修改,封装报文; raw:关闭nat表上启用的连接追踪机制; 功能的优先级次序:raw<---mangle<---nat<----filter
链(内置)(五链): PREROUTING:在路由之前 INPUT:到本机 FORWARD:由本机转发 OUTPUT:由本机发出 POSTROUTING:路由之后 流入:PREROUTING --> INPUT 流出:OUTPUT --> POSTROUTING 转发:PREROUTING --> FORWARD --> POSTROUTING
各功能(四表)的实现:
filter:在INPUT,FORWAD,OUTPUT nat:PREROUTING(DNAT),OUTPUT,POSROUTING mangle:PERROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING raw:PREROUTING,OUTPUT
iptables四表五链添加规则的注意项
添加规则时的考量点: 要实现哪种功能,判断添加在哪张表上 报文流经的路径,判断添加在哪个链上 链:链上规则次序,即为检查的次序,因此隐含一定的法则: 同类规则,匹配范围小的放上面; 不同类规则,匹配需求频率大的放在上面,匹配需求小的放下面 将那些可由一条规则描述的多个规则合并为一个; 默认规则(策略):
规则的组成部分:
组成部分:报文的匹配条件,匹配到之后处理动作 匹配条件:根据协议报文特征指定:基本匹配条件、扩展匹配条件 处理动作:内建处理机制、自定义处理机制 注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效;
iptables命令:
格式: iptables [-t table] {-A|-D} chain_name rule-specification 添加或删除指定链上的规则,添加时默认为添加到链尾 iptables [-t table] -I chain_name [rulenum] rule-specification 插入规则到指定链上,默认插入到链首 iptables [-t table] -R chain_name rulenum rule-specification 修改指定链上的规则 iptables [-t table] -D chain_name rulenum 删除指定链上的规则 iptables [-t table] -S [chain_name [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] -L显示规则、-Z清零规则上的统计数、-F清空指定表的规则 iptables [-t table] -N chain_name 添加指定表上的自定义链 iptables [-t table] -X [chain_name] 删除自定义链 iptables [-t table] -P chain_name target 指定链的默认规则 iptables [-t table] -E old-chain-name new-chain-name rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options]
匹配条件:
基本匹配: -s\--src\--source IP|Netaddr :匹配源地址 !-s\--src\--source IP|Netaddr :匹配此源地址之外的其他源地址 -d\--dst\--destionation IP|Netaddr:匹配目标地址 !-d\--dst\--destionation IP|Netaddr:匹配此目标地址之外的其他目标地址 -p\--protocol {tcp|udp|icmp}:检查报文中的协议,即IP首部中的protocol所标识的协议 -i\--in-interface interface_name :数据报文的流入接口,仅能用于PREROUTING\INPUT\FORWARD链上 -o\--out-interface interface_name:数据报文的流出接口,仅能用于FORWARD\OUTPUT\POSTROUTING链上
扩展匹配
隐形扩展匹配:使用-p 指定的协议进行扩展,可省略-m选项
-p tcp|udp 注意:UDP只有--dport与--sport --dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口 --sport PORT[-PORT]:源端口,可以是单个或连续多个端口 tcp-flags(TCP的标识位)LIST1 LIST2 检查LIST1所指明的所有标记位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没有在LIST1中指明的,不作检查{SYN,ACK,FIN,RST,PSH,URG共6种标记位} --tcp-flag SYN,ACK,FIN,RST SYN 匹配TCP三次握手中的SYN,ACK,FIN,RST标记位,其中SYN必须为1,其他为0.即匹配三次握手的第一次握手 --syn:检查是否为新建TCP连接的第一次请求
-p igmp --igmp-type:(可用数字代表其类型)常见的0和8 0:echo-reply回送应答 8:echo-request请求答应
匹配条件的显示扩展
显式扩展 :必须使用-m选项指定使用扩展,可扩展模块可通过rpm –ql iptables | grep "\.so$" 查看
-m的选项(常见) multiport扩展(多端口匹配) 以离散方式定义多端口,最多可定义15个端口 [!] --source-ports,--sports port[,port|,port:port]... 若加[!],则是非的意思 源端口 [!] --destination-ports,--dports port[,port|,port:port]... 目标端口 [!] --destination-ports,--dports port[,port|,port:port]... 放开22、80、8080端口 iptables -I INPUT -s 192.168.0.0/24 -d 192.168.1.11 -p tcp -m multiport --dports 22,80,8080 -j ACCEPT iptables -I OUTPUT -s 192.168.1.11 -d 192.168.0.0/24 -p tcp -m multiport --sports 22,80,8080 -j ACCEPT iprange扩展(IP范围) 指明连续的IP范围时使用(但一般是不能扩展为整个网络) [!] --src-range from[-to] 源IP地址范围 [!] --dst-range from[-to] 目标IP地址范围 放开192.168.1.1-200访问22,80,8080端口 iptables -I INPUT -d 192.168.1.11 -p tcp -m multiport --dport 80,22,8080 -m iprange --src 192.168.1.1-192.168.1.200 -j ACCEPT iptables -I OUPUT -s 192.168.1.11 -p tcp -m multiport --sport 80,22,8080 -m iprange --dst 192.168.1.1-192.168.1.200 -j ACCEPT string扩展(字符串扩展) 检查报文中出现的字符串 --algo {bm|kmp} 指定匹配字符串的算法 [!] --string pattern 基于匹配模式进行检查 [!] --hex-string pattern 基于十六进制检查 iptables -I OUTPUT -m string -algo bm --string 'mover' -j REJECT \\拒绝访问‘mover’字符串的内容 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...] 每周的周期 iptables -I INPUT -d 192.168.1.11 -p tcp --dport 80 -m time --timestart 8:00 --timstop 17:00 -j REJECT \\拒绝8点到17点之间访问80端口 connlimit扩展(连接限制) 根据每个客户IP做并发连接数匹配 --connlimit-above n:连接的数量大于n --connlimit-upto n:连接的数量小于等于n iptables -I INPUT -D TCP --dport 22 -m connlimit --connlimit-above 3 -j REJECT;\\设置22端口的并发连接数量不能大于3个,大于的拒绝 limit扩展 基于收发报文包的速率做检查 令牌桶过滤器 --limit-burst number 一开始只是最多允许的报文数量 --limit rate[/second|/minute|/hour|/day] 当达到--limit-bust 指定的数量后,设置的速率,有秒、分钟、小时、天 iptables -A INPUT -d 192.168.1.11 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT \\设置开始时最多5个ping,然后每分钟30个 iptables -A INPUT -s 192.168.1.11 -p icmp --icmp-type 0 -j ACCEPT state扩展(状态扩展) 根据连接追踪机制,检查连接间的关系,记录的时长为半小时 调整连接追踪功能所能够容纳的最大连接数量: /proc/sys/net/nf_conntrack_max 已经追踪到并记录下的连接: /proc/net/nf_conntrack 不同协议或连接类型追的时长: /proc/sys/net/netfilter/ 可追踪的连接状态: NEW:新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求; ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态; RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系; INVALIED:无法识别的连接; --state STATE1,STATE2,... 对22、80端口进行连接追踪 iptables -I INPUT -d 192.168.1.11 -p tcp -m multiport --dport 22,80 state --state NEW,ESTABLISHED -j ACCEPT iptables -I OUTPUT -s 192.168.1.11 -p tcp -m multiport --sport 22,80 state --state ESTABLEISHED -j ACCEPT iptables -I OUTPUT -m state --state ESTABLEISHED -j ACCEPT \\对IN方向允许进来的所有连接追踪,都在out方向放开
处理动作:
-j TARGET:jump,跳转到指定的TARGET,TARGET如下: ACCEPT:接受 DROP:丢弃 REJECT:拒绝 RETURN:返回调用链 REDIRECT:端口重定向 LOG:记录日志 MARK:做防火墙标记 DNAT:目标地址转换 SNAT:源地址转换 MASQUERADE:地址伪装
练习依照以下图片
说明: SER1配置默认路由指向192.168.90.128 练习内容: 1、通过iptables拒绝SER1访问SER2的ssh\web, 2、SER3配置192.168.90.0路,让SER1连通SER3 3、在SER2上启用NAT,SER3不配置192.168.90.0路由,让SER1连通SER3 4、把SER2的192.168.10.128的22端口映射给SER1 192.168.90.129的22端口
SER1的配置
[root@SER1 ~]# ifconfig eth2 Link encap:Ethernet HWaddr 00:0C:29:1D:8D:A8 inet addr:192.168.90.129 Bcast:192.168.90.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe1d:8da8/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:86 errors:0 dropped:0 overruns:0 frame:0 TX packets:84 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:9529 (9.3 KiB) TX bytes:10126 (9.8 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:108 errors:0 dropped:0 overruns:0 frame:0 TX packets:108 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:7256 (7.0 KiB) TX bytes:7256 (7.0 KiB) [root@SER1 ~]# route add default gw 192.168.90.128 [root@SER1 ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.90.0 * 255.255.255.0 U 1 0 0 eth2 default 192.168.90.128 0.0.0.0 UG 0 0 0 eth2
SER2的配置
[root@SER2 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:76:31:7B inet addr:192.168.10.128 Bcast:192.168.10.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe76:317b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:613 errors:0 dropped:0 overruns:0 frame:0 TX packets:157 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:57414 (56.0 KiB) TX bytes:13174 (12.8 KiB) eth1 Link encap:Ethernet HWaddr 00:0C:29:76:31:85 inet addr:192.168.90.128 Bcast:192.168.90.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe76:3185/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:672 errors:0 dropped:0 overruns:0 frame:0 TX packets:149 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:62895 (61.4 KiB) TX bytes:15431 (15.0 KiB)
测试SER1与SER2的连通性,以下测试的结果说明SER1与SER2的连通性没有问题
[root@SER1 ~]# ping 192.168.90.128 PING 192.168.90.128 (192.168.90.128) 56(84) bytes of data. 64 bytes from 192.168.90.128: icmp_seq=1 ttl=64 time=0.691 ms 64 bytes from 192.168.90.128: icmp_seq=2 ttl=64 time=1.15 ms ^C --- 192.168.90.128 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1262ms rtt min/avg/max/mdev = 0.691/0.924/1.158/0.235 ms [root@SER1 ~]# curl 192.168.90.128 test [root@SER1 ~]# [root@SER1 ~]# ssh 192.168.90.128 root@192.168.90.128's password: Last login: Sat Jul 2 02:24:28 2016 from 192.168.90.129 [root@SER2 ~]# [root@SER2 html]# iptables -L \\SER2的iptables表 Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@SER2 html]#
一、通过iptables拒绝SER1访问SER2的ssh\web
1、把SER2的filter表的规则清空
[root@SER2 ~]# iptables -F [root@SER2 ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@SER2 ~]#
2、拒绝SER1 ping SER2 和SER1 访问SER2 的SSH
[root@SER2 ~]# iptables -A INPUT -s 192.168.90.129 -p tcp --dport 80 -j DROP [root@SER2 ~]# iptables -A INPUT -s 192.168.90.129 -p tcp --dport 22 -j DROP [root@SER2 ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 192.168.90.129 anywhere tcp dpt:http DROP tcp -- 192.168.90.129 anywhere tcp dpt:ssh Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@SER2 ~]# [root@SER1 ~]# curl 192.168.90.128 curl: (7) couldn't connect to host [root@SER1 ~]# ssh 192.168.90.128 ssh: connect to host 192.168.90.128 port 22: Connection timed out [root@SER1 ~]#
3、拒绝SER1访问SER2的192.168.90.128的80端口及ping,但可以访问SER2的192.168.10.128的80端口与ping
先清空SER2的现在的filter的规则表 [root@SER2 ~]# iptables -F [root@SER2 ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@SER2 ~]#
把 filter表的INPUT和OUTPUT默认策略修改为DROP
修改INPUT及OUPUT的规则
[root@SER1 ~]# curl 192.168.90.128 curl: (7) couldn't connect to host [root@SER1 ~]# curl 192.168.10.128 test [root@SER1 ~]# ping 192.168.90.128 PING 192.168.90.128 (192.168.90.128) 56(84) bytes of data. ^C --- 192.168.90.128 ping statistics --- 7 packets transmitted, 0 received, 100% packet loss, time 6907ms [root@SER1 ~]# ping 192.168.10.128 PING 192.168.10.128 (192.168.10.128) 56(84) bytes of data. 64 bytes from 192.168.10.128: icmp_seq=1 ttl=64 time=1.48 ms 64 bytes from 192.168.10.128: icmp_seq=2 ttl=64 time=0.438 ms ^C --- 192.168.10.128 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1495ms rtt min/avg/max/mdev = 0.438/0.961/1.485/0.524 ms [root@SER1 ~]#
二、SER3配置192.168.90.0路,让SER1连通SER3
1、打开SER2的核心转发功能
临时开启:把 /proc/sys/net/ipv4/ip_forward 修改为 1 永久开启,需要修改:/etc/sysct.conf ---> net.ipv4.ip_forward = 1
[root@SER2 ~]# cat /proc/sys/net/ipv4/ip_forward 0 [root@SER2 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@SER2 ~]# cat /proc/sys/net/ipv4/ip_forward 1 [root@SER2 ~]#
2、在SER3上添加192.168.90.0的路由,指向192.168.10.128
[root@SER3 ~]# route add -net 192.168.90.0/24 gw 192.168.10.128 [root@SER3 ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.10.0 * 255.255.255.0 U 1 0 0 eth2 192.168.90.0 192.168.10.128 255.255.255.0 UG 0 0 0 eth2 default 192.168.10.2 0.0.0.0 UG 0 0 0 eth2 [root@SER3 ~]#
3、在SER1上测试与SER3的连通性
[root@SER1 ~]# ping 192.168.10.130 PING 192.168.10.130 (192.168.10.130) 56(84) bytes of data. 64 bytes from 192.168.10.130: icmp_seq=1 ttl=63 time=3.59 ms 64 bytes from 192.168.10.130: icmp_seq=2 ttl=63 time=0.877 ms ^C --- 192.168.10.130 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 5467ms rtt min/avg/max/mdev = 0.685/1.675/3.592/1.034 ms [root@SER1 ~]#
三、在SER2上启用NAT,SER3不配置192.168.90.0路由,让SER1连通SER3
1、SER3删除192.168.90.0的路由
[root@SER3 ~]# route del -net 192.168.90.0/24 [root@SER3 ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.10.0 * 255.255.255.0 U 1 0 0 eth2 default 192.168.10.2 0.0.0.0 UG 0 0 0 eth2 [root@SER3 ~]#
修改SER2之前SER1的连通性是不通的
[root@SER1 ~]# ping 192.168.10.130 PING 192.168.10.130 (192.168.10.130) 56(84) bytes of data. ^C --- 192.168.10.130 ping statistics --- 25 packets transmitted, 0 received, 100% packet loss, time 24014ms
修改SER2的NAT
[root@SER2 ~]# iptables -t nat -A POSTROUTING -s 192.168.90.0/24 -d 192.168.10.0/24 -j SNAT --to-source 192.168.10.128 [root@SER2 ~]# iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 192.168.90.0/24 192.168.10.0/24 to:192.168.10.128 Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@SER2 ~]#
再测试SER1与SER3的连通性
[root@SER1 ~]# ping 192.168.10.130 PING 192.168.10.130 (192.168.10.130) 56(84) bytes of data. 64 bytes from 192.168.10.130: icmp_seq=1 ttl=63 time=2.25 ms 64 bytes from 192.168.10.130: icmp_seq=2 ttl=63 time=0.947 ms ^C --- 192.168.10.130 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1479ms rtt min/avg/max/mdev = 0.947/1.600/2.254/0.654 ms [root@SER1 ~]# curl 192.168.10.130 1234567890 [root@SER1 ~]#
三、把SER2的192.168.10.128的22端口映射给SER1 192.168.90.129的22端口
1、修改SER2的22端口映射到192.168.90.129
[root@SER2 ~]# iptables -t nat -A PREROUTING -d 192.168.10.128 -p tcp --dport 22 -j DNAT --to-destination 192.168.90.12 9[root@SER2 ~]# iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- anywhere 192.168.10.128 tcp dpt:ssh to:192.168.90.129 Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@SER2 ~]#
2、在SER3上使用SSH登陆到SER1
[root@SER3 html]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.10.0 * 255.255.255.0 U 1 0 0 eth2 default 192.168.10.2 0.0.0.0 UG 0 0 0 eth2 [root@SER3 html]# ssh 192.168.10.128 The authenticity of host '192.168.10.128 (192.168.10.128)' can't be established. RSA key fingerprint is cc:d2:aa:95:51:57:67:df:df:0a:3c:02:bb:0b:a2:bf. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.10.128' (RSA) to the list of known hosts. root@192.168.10.128's password: Last login: Sat Jul 2 02:20:32 2016 from 192.168.90.1
3、在SER1上查看SER3登陆的情况
[root@SER1 ~]# who root tty1 2016-07-02 02:20 root pts/0 2016-07-02 02:20 (192.168.90.1) root pts/1 2016-07-02 04:07 (192.168.10.130) \\SER3已成功登陆 [root@SER1 ~]#
原创文章,作者:Net20-deamon,如若转载,请注明出处:http://www.178linux.com/21420