iptables使用
## iptables规则导出与导入
```bash
iptables-save > xxxx.rule
iptables-restore < xxxx.rule
iptables -nvL -t nat
```
小例子:
--sport iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22:25 -j REJECT iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT --dport iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT --tcp-flags iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT -syn iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT 相当于使用 --tcp-flags SYN,RST,ACK,FIN SYN # 拒绝从外网接口eth0直接访问防火墙本机的TCP请求,但允许其他主机发给防火墙的TCP等响应数据包请求 iptables -P INPUT DROP #修改默认策略为DROP iptables -I INPUT -i eth0 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP#同步请求丢弃 iptables -I INPUT -i eth0 -p tcp --tcp-flags ! --syn -j ACCEPT #非syn包放行 #只想ping 通他人,别人ping不通本机 iptables -A INPUT -p icmp --icmp-type 8 -j DROP (只有此一条也行) iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #接受icmp回复 iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #接受icmp不可达回复 iptables -A INPUT -p icmp -j DROP ICMP类型匹配:--icmp-type ICMP类型 使用字符串或数字代码表示: Echo-Request 代码为8-----表示ICMP请求 Echo-Reply 代码为0-----ICMP回显 Destination-Unreachable 代码为3——ICMP目标不可达 #构建vsftpd服务器时,开放20、21端口,以及用于被动模式的端口范围24500~24600: iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT #允许为网段192.168.1.0/24转发DNS查询数据包 iptables -A FORWARD -s 192.168.1.0/24 -p udp --dport 53 -j ACCEPT iptables -A FORWARD -d 192.168.1.0/24 -p udp --sport 53 -j ACCEPT #添加防火墙规则封锁来自172.16.16.0/24网段的频繁扫描、登录穷举等不良企图: iptables -I INPUT -s 172.16.16.0/24 -j DROP iptables -I FORWARD -s 172.16.16.0/24 -j DROP #拒绝转发源地址为192.168.10.100的数据、允许转发源地址位于192.168.1.0/24网段的数据 iptables -A FORWARD -s 192.168.10.100 -j REJECT iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT #允许本机开放25、80、110、143端口,以便提供电子邮件服务 iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT #禁止转发源IP地址位于192.168.1.10与192.168.1.20之间的TCP数据包,ip范围 iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.10-192.168.1.20 -j ACCEPT #根据MAC地址封锁主机,禁止其访问本机的任何应用 iptables -A INPUT -m mac --mac-source 00:01:02:03:04:cc -j DROP -m state --state 连接状态 常见的连接状态包括NEW(与任何连接无关的)、ESTABLISHED(响应请求或者已建立连接的)、RELATED(与已有连接有相关性的,eg:FTP数据连接) #禁止转发与正常TCP连接无关的非“--syn”请求数据包(如伪造的一些网络攻击数据包) iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP #新建连接不为--syn请求 #只开放本机的web服务(80端口),但对发给本机的TCP应答数据包予以放行,其他入站数据包均丢弃 iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT iptables -P INPUT DROP 拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据 iptables -A FORWARD -s 192.168.1.11 -j REJECT iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT 说明:注意一定要把拒绝的放在前面不然就不起作用 允许防火墙转发除ICMP协议以外的所有数据包 iptables -A FORWARD -p ! icmp -j ACCEPT 丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包 iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP 封堵网段(192.168.1.0/24),两小时后解封 # iptables -I INPUT -s 10.20.30.0/24 -j DROP # iptables -I FORWARD -s 10.20.30.0/24 -j DROP # at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1 只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机 iptables -A INPUT -s 202.13.0.0/16 -p tcp -m tcp -m state --state NEW --dport 22 -j ACCEPT 运行本机的3306端口(mysql服务)被访问 iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT 或者只运行本机的3306端口被192.168.1.0/24网段机器访问 iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT 允许本机开放从TCP端口20-1024提供的应用服务 iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 20:1024 -j ACCEPT 允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包 iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT 屏蔽环回(loopback)访问 iptables -A INPUT -i lo -j DROP iptables -A OUTPUT -o lo -j DROP 防止DDOS攻击 iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT -m limit: 启用limit扩展,限制速度。 --limit 25/minute: 允许最多每分钟25个连接 --limit-burst 100: 当达到100个连接后,才启用上述25/minute限制 --icmp-type 8 表示 Echo request——回显请求(Ping请求)。下面表示本机ping主机192.168.1.109时候的限速设置: iptables -I INPUT -d 192.168.1.109 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEP
iptables /netfilter 网络防火墙
1,充当网关
2,使用filter表的FORWORD 链
注意:
(1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性
(2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行
连接跟踪:内网多台主机访问不同的网站,记录数据的往来 connection track
端口转换:不同内网服务器访问同一服务器的源端口不同,在 Track Table 里加入端口信息分辨,如果源端口相同, SNAT 和 DNAT 的同时对源端口也要做相应的转换
NAT实现的功能
数据包伪装、平衡负载、端口转发和透明代理
1,数据伪装: 可以将内网数据包中的地址信息更改成统一的对外地址信息,不让内网主机直接暴露在因特网上,保证内网主机的安全。同时,该功能也常用来实现共享上网
2,端口转发: 当内网主机对外提供服务时,由于使用的是内部私有IP地址,外网无法直接访问。因此,需要在网关上进行端口转发,将特定服务的数据包转发给内网主机
3,负载平衡: 目的地址转换 NAT 可以重定向一些服务器的连接到其他随机选定的服务器
4,失效终结: 目的地址转换NAT可以用来提供高可靠性的服务。如果一个系统有一台通过路由器访问的关键服务器,一旦路由器检测到该服务器当机,它可以使用目的地址转换NAT透明的把连接转移到一个备份服务器上
5,透明代理: NAT 可以把连接到因特网的 HTTP 连接重定向到一个指定的 HTTP 代理服务器以缓存数据和过滤请求。一些因特网服务提供商就使用这种技术来减少带宽的使用而不用让他们的客户配置他们的浏览器支持代理连接
数据包状态机制 数据包在用户空间的四种状态 连接跟踪记录 TCP / UDP / ICMP 连接 缺省的连接操作 复杂协议和连接跟踪 用户空间四种状态
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 这个状态的任何东西。
UNTRACKED
简单的说,若一个包在 raw 表中被表记为 NOTRACK target,那么在状态机制中就会显示 UNTRACKED。这也意味着所有 RELATED 连接不会被看到。因此当处理 UNTRACKED 连接时候,有些东西已定要小心,因为像依赖于 ICMP 等的信息不会在状态机制中显示
连接跟踪模块
tail /proc/net/net_conntrack 查看连接跟踪信息
/proc/sys/net/nf_conntrack_max 调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/netfilter/ 不同的协议的连接追踪时长
conntrack helper
modprobe nf_conntrack #centos 7
# iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超
时链接会从表中删除;当模板满载时,后续连接可能会超时
解决方法两个:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout时间
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
开放被动模式的ftp
1,装载ftp连接追踪的专用模块
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=“nf_conntrack_ftp"
modproble nf_conntrack_ftp
2,放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
iptables –I INPUT -d LocalIP -p tcp -m state --state ESTABLISHED,RELATED -j
ACCEPT
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
3,放行响应报文:
iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
yum install vsftpd
systemctl start vsftpd
modprobe nf_conntrack_ftp
iptables -F
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -vnL
SNAT和DNAT
SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机。
DNAT就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B 因为,路由是按照目的地址来选择的。
因此DNAT是在PREROUTING链上来进行的,而SNAT是在数据包发送出去的时候才进行,所以是在POSTROUTING链上进行的。 通过SNAT和DNAT可以使内网和外网进行相互通讯
SNAT策略概述:
SNAT策略的典型应用环境:
局域网主机共享单个公网IP地址接入Internet
SNAT策略的原理:
根据指定规则修改数据包的源ip地址
实验分析:
a:只开启路由转发,未做地址转换的情况:
分析:
从局域网PC机访问Internet的数据包经过网关转发后其源IP地址保持不变;
当Internet中的主机收到这样的请求数据包后,响应数据包将无法正确返回,从而导致访问失败。
b:开启路由转发,并设置SNAT转换的情况:
分析:
局域网PC机访问Internet的数据包到达网关服务器时,会先进行路由选择;
如果该数据包需要从外网接口eth0向外转发,则将其源IP地址192.168.10.2修改为网关的外网接口地址210.106.46.151,然后发送给目标主机。
这种访问方式的优点:
Internet中的服务器并不知道局域网PC机的实际IP地址,中间的转换完全由网关主机完成,起到了保护内部网络的作用。
SNAT策略的应用:
前提条件
局域网各主机正确设置IP地址/子网掩码
局域网各主机正确设置默认网关地址
Linux网关支持IP路由转发
实现方法:
编写SNAT转换规则
SNAT共享固定IP地址上网
实验环境描述:
1, Linux网关服务器两块网卡eth0:210.106.46.151连接Internet、eth1:192.168.10.1连接局域网,开启IP路由功能
2,局域网PC机的默认网关设为192.168.10.1,并设置正确的DNS服务器。
3,内网和外网分别新建客户机,分别指定对应的网关地址,在外网客户机上开启httpd服务,在内网客户机中访问httpd服务,最后查看httpd客户机的访问记录;
要求:192.168.10.0/24网段的PC机能够通过共享方式正常访问internet。
实验步骤:
1:打开网关的路由转发(IP转发是实现路由功能的关键所在):
打开路由转发的两种方式:
永久打开(修改/proc文件系统中的ip_forward,当值为1时表示开启,为0表示关闭):
临时开启,临时生效:
2:正确设置SNAT策略(若要保持SNAT策略长期有效,应将相关命令写入rc.local中):
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 210.106.46.151
3:测试SNAT共享接入的结果:
上诉操作完成后,使用局域网PC就可以正常访问Internet中的网站。
对于被访问的网站服务器,在日志文件中将会记录以网关主机210.106.46.151访问。
共享动态ip地址上网: MASQUERADE —— 地址伪装 适用于外网IP地址非固定的情况 对于ADSL拨号连接,接口通常为ppp0、ppp1 将SNAT规则改为MASQUERADE即可
示例:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j MASQUERADE
如果网关使用固定的公网IP地址,建议选择SNAT策略而不是MASQUERADE策略,以减少不必要的系统开销
DNAT策略概述
DNAT策略的原理:目标地址转换,Destination Network Address Translation,是Linux防火墙的另一种地址转换操作,也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标IP地址、目标端口。
SNAT用来修改源IP地址,而DNAT用来修改目标IP地址、目标端口;SNAT只能用在nat表的POSTROUTING链,而DNAT只能用在nat表的PREROUTING链和OUTPUT链(或被其调用的链)中。
数据流向
目的为本机的报文
报文以本机为目的地址时,其经过iptables的过程为:
1.数据包从network到网卡
2.网卡接收到数据包后,进入raw表的PREROUTING链。这个链的作用是在连接跟踪之前处理报文,能够设置一条连接不被连接跟踪处理。(注:不要在raw表上添加其他规则)
3.如果设置了连接跟踪,则在这条连接上处理。
4.经过raw处理后,进入mangle表的PREROUTING链。这个链主要是用来修改报文的TOS、TTL以及给报文设置特殊的MARK。(注:通常mangle表以给报文设置MARK为主,在这个表里面,千万不要做过滤/NAT/伪装这类的事情)
5.进入nat表的PREROUTING链。这个链主要用来处理 DNAT,应该避免在这条链里面做过滤,否则可能造成有些报文会漏掉。(注:它只用来完成源/目的地址的转换)
6.进入路由决定数据包的处理。例如决定报文是上本机还是转发或者其他地方。(注:此处假设报文交给本机处理)
7.进入mangle表的 INPUT 链。在把报文实际送给本机前,路由之后,我们可以再次修改报文。
8.进入filter表的 INPUT 链。在这儿我们对所有送往本机的报文进行过滤,要注意所有收到的并且目的地址为本机的报文都会经过这个链,而不管哪个接口进来的或者它往哪儿去。
9. 进过规则过滤,报文交由本地进程或者应用程序处理,例如服务器或者客户端程序。
本机发出的报文
数据包由本机发出时,其经过iptables的过程为:
1.本地进程或者应用程序(例如服务器或者客户端程序)发出数据包。
2.路由选择,用哪个源地址以及从哪个接口上出去,当然还有其他一些必要的信息。
3.进入raw表的OUTPUT链。这里是能够在连接跟踪生效前处理报文的点,在这可以标记某个连接不被连接跟踪处理。
4.连接跟踪对本地的数据包进行处理。
5.进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤(以避免副作用)。
6.进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做目的NAT(DNAT) 。
7.进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
8.再次进行路由决定,因为前面的 mangle 和 nat 表可能修改了报文的路由信息。
9.进入 mangle 表的 POSTROUTING 链。这条链可能被两种报文遍历,一种是转发的报文,另外就是本机产生的报文。
10.进入 nat 表的 POSTROUTING 链。在这我们做源 NAT(SNAT),建议你不要在这做报文过滤,因为有副作用。即使你设置了默认策略,一些报文也有可能溜过去。
11.进入出去的网络接口。
转发报文
报文经过iptables进入转发的过程为:
1.数据包从network到网卡
2.网卡接收到数据包后,进入raw表的PREROUTING链。这个链的作用是在连接跟踪之前处理报文,能够设置一条连接不被连接跟踪处理。(注:不要在raw表上添加其他规则)
3.如果设置了连接跟踪,则在这条连接上处理。
4.经过raw处理后,进入mangle表的PREROUTING链。这个链主要是用来修改报文的TOS、TTL以及给报文设置特殊的MARK。(注:通常mangle表以给报文设置MARK为主,在这个表里面,千万不要做过滤/NAT/伪装这类的事情)
5.进入nat表的PREROUTING链。这个链主要用来处理 DNAT,应该避免在这条链里面做过滤,否则可能造成有些报文会漏掉。(注:它只用来完成源/目的地址的转换)
6.进入路由决定数据包的处理。例如决定报文是上本机还是转发或者其他地方。(注:此处假设报文进行转发)
7.进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
8.进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。
9.进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
10.进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
11.进入出去的网络接口。
NAT转发配置
访问本机(192.168.1.7)的8088端口转发到192.168.1.160的80端口;访问本机的33066端口转发到192.168.1.161的3306端口
准备工作:
本机打开ip_forword路由转发功能;
192.168.1.160/161的内网网关要和本机网关一致!
如果没有内网网关,就将网关设置成本机内网ip,并且关闭防火墙(防火墙要是打开了,就设置对应端口允许本机访问)
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80
iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306
iptables -t nat -A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT
iptables save
cat /etc/sysconfig/iptables
实验snat
1,A 可Ping通B,B不能pingA
A 192.168.36.72
iptables -A INPUT -s 192.168.36.1 -j ACCEPT #允许远程主机访问
iptables -A INPUT -p icmp --icmp-type 8 -j DROP #禁止icmp 请求
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #放行icmp 应答
iptables -A INPUT -j DROP #INPUT链默认接受,所有不匹配的丢弃
B 192.168.36.73
2,禁止第一次同步请求(隐式调用扩展模块)
iptables -A INPUT -p tcp --syn -j DROP #第一次握手拒绝
3, iptables -A INPUT -s ip -p tcp -m multiport --deports 22,80 -j DROP
4, iptables -A OUPUT -s localip -d 0/0 -p tcp --sport 80 -m string --algo bn --string "google" -j DROP #拒绝本机发出的含有字符串的网页请求
5,限制并发
iptables -A INPUT -d localip -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
6,匹配规则最多的放置前面,防止消耗资源在检测第一条上
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
7 ,AC两网段主机通过主机B互相可ping
A 172网段
172.22.149.234
gw 172.22.149.233
设置A主机的gateway 为B机 172网段地址
B
开启转发
cat /proc/sys/net/ipv4/ip_forward
1
或
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p 写入内存
172.22.149.233
192.168.36.73
C 192.168网段
设置C主机的gateway 为B机192网段地址
192.168.36.74
gw 192.168.36.73
AC 可互相ping通为前提
A ping不通C(内网),C可PING通A(外网)
方法1
iptables -A FORWARD -d 192.168.36.0/24 -p icmp --icmp-type 0 -j ACCEPT
iptables -A FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -j REJECT
方法2
iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 因为默认策略为接受,最后需要拒绝,那么前2条记录应该接受,可知目的地址为内网的icmp应答需接受,源地址为内网的icmp请求需接受
在以上环境下,即
iptables -A FORWARD -d 192.168.36.0/24 -p icmp --icmp-type 0 -j ACCEPT
iptables -A FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
下,局域网可访问外网 172网页
iptables -I FORWARD 2 -s 192.168.36.0/24 -p tcp -m multiport --dports 80,443 -j ACCEPT
外网可访问内网网页邮件
iptables -I FORWARD 3 -d 192.168.36.0/24 -p tcp -m multiport --dports 80,443 -j ACCEPT
自定义链的使用(在某时间段)
iptavles -N CLASS
SNAT
C通过snat 访问A
在已有上述环境下(外网ping 不通内网,内网可ping通外网)
#在filter链允许内网的tcp包通过
iptables -I FORWARD 2 -s 192.168.36.0/24 -p tcp -j ACCEPT
#做源地址转换
iptables -t nat -A POSTROUTING -s 192.168.36.0/24 ! -d 192.168.36.0/24 -j SNAT --to-source 172.22.149.233
DNAT
外网可访问内网网页(在以上环境下)
# 转发链设置有过滤规则,放行到目标网段的tcp包
iptables -I FORWARD 2 -d 192.168.36.0/24 -p tcp -j ACCEPT
#添加在NAT表 prerouting 链 改变目标源地址
iptables -t nat -A PREROUTING -s 0/0 -d 172.22.149.233 -p tcp --dport 80 -j DNAT --to-destination 192.168.36.74
转发
注重在本机内做端口重定向,在转发路由前即表nat prerouting 链做端口转换
iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j
REDIRECT --to-ports 8080
练习题
说明:以下练习INPUT和OUTPUT默认策略均为DROP
环境设置:
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #放行ssh-client
iptables -P INPUT DROP # 默认drop
iptables -A OUPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #已建立的连接放行
iptables -P OUTPUT DROP # 默认drop
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100
个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允
许响应报文离开本机
iptables -I INPUT -p tcp --dport 80 -m time --weekdays 1 -j DROP
iptables -R INPUT 2 -d 172.22.149.234 -p tcp -m multiport --dports 80,22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -p tcp --sport 80 -m string --algo bm --string "admin" -j REJECT # amin禁止访问
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0
网络中的主机访问;数据下载请求的次数每分钟不得超过5个
iptables -A INPUT -p tcp --dport 21 -m limit --limit 5/minute -j DROP
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED,RELATED -m time --starttime 0:30 --stoptime 10:00 --weekdays 1,2,3,4,5 -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的学号,新
请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机
iptables -A INPUT -m connlimit --connlimit-above 2 -j DROP
iptables -A INPUT -m iprange --src-range 172.16.95.1-172.16.95.100 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
5、允许本机ping别的主机;但不开放别的主机ping本机
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
1)规则概念
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。
规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept),拒绝(reject)和丢弃(drop)等。
配置防火墙的主要工作是添加,修改和删除等规则。
其中:
匹配(match):符合指定的条件,比如指定的 IP 地址和端口。
丢弃(drop):当一个包到达时,简单地丢弃,不做其它任何处理。
接受(accept):和丢弃相反,接受这个包,让这个包通过。
拒绝(reject):和丢弃相似,但它还会向发送这个包的源主机发送错误消息。这个错误消息可以指定,也可以自动产生。
目标(target):指定的动作,说明如何处理一个包,比如:丢弃,接受,或拒绝。
跳转(jump):和目标类似,不过它指定的不是一个具体的动作,而是另一个链,表示要跳转到那个链上。
规则(rule):一个或多个匹配及其对应的目标。
2)iptables和netfilter的关系:
Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道 netfilter。
其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。
3)iptables的规则表和链
表(tables):提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains):是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。
当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。
如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,
如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型] 参数
-P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,icmp
--dport num 匹配目标端口号
--sport num 匹配来源端口号
1.删除已有规则
iptables -F
(or)
iptables –flush
2.设置链的默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
当INPUT链和OUTPUT链都设置成DROP时,对于每一个防火墙规则,我们都应该定义两个规则。
例如:一个传入另一个传出。在下面所有的例子中,由于我们已将DROP设置成INPUT链和OUTPUT链的默认策略,
每种情况我们都将制定两条规则。当然,如果你相信你的内部用户,则可以省略上面的最后一行。例如:默认不丢弃所有出站的数据包。
在这种情况下,对于每一个防火墙规则要求,你只需要制定一个规则——只对进站的数据包制定规则。
3. 阻止指定IP地址
iptables -A INPUT -s x.x.x.x -j DROP
iptables -A INPUT -i eth0 -s x.x.x.x -j DROP
iptables -A INPUT -i eth0 -p tcp -s x.x.x.x -j DROP
4. 允许所有SSH的连接请求
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
6.允许http和https的连接请求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
7. 使用multiport 将多个规则结合在一起
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
8允许从本地发起的SSH
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
请注意,这与允许ssh连入的规则略有不同。本例在OUTPUT链上,我们允许NEW和ESTABLISHED状态。在INPUT链上
,我们只允许ESTABLISHED状态。ssh连入的规则与之相反。
9. 仅允许从本地发起到一个指定的网络域的SSH请求
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
10. 允许从本地发起的HTTPS连接请求
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
11. 负载平衡传入的网络流量
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
12. 允许外部主机ping内部主机
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
13. 允许内部主机ping外部主机
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
14. 允许回环访问
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
15. 允许内部网络域外部网络的通信
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
16. 允许出站的DNS连接
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
17. 允许NIS连接
如果你使用NIS管理用户帐户,你需要允许NIS连接。如果你不允许NIS相关的ypbind连接请求,即使SSH连接请求已被允许,
用户仍然无法登录。NIS的端口是动态的,先使用命令rpcinfo –p来知道端口号,此例中为853和850端口。
rpcinfo -p | grep ypbind 例:允许来自111端口以及ypbind使用端口的连接请求
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 853 -j ACCEPT
iptables -A INPUT -p udp --dport 853 -j ACCEPT
iptables -A INPUT -p tcp --dport 850 -j ACCEPT
iptables -A INPUT -p udp --dport 850 -j ACCEPT
当你重启ypbind之后端口将不同,上述命令将无效。有两种解决方案:1)使用你NIS的静态IP
2)编写shell脚本通过“rpcinfo - p”命令自动获取动态端口号,并在上述iptables规则中使用。
18. 允许来自指定网络的rsync连接请求
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
19. 允许来自指定网络的MySQL连接请求
MySQL数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
20. 允许Sendmail, Postfix邮件服务
Sendmail和postfix都使用了25端口,因此我们只需要允许来自25端口的连接请求即可。
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
21. 允许IMAP和IMAPS
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
22. 允许POP3和POP3S
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
23. 防止DoS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
上述例子中:
-m limit: 启用limit扩展
–limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。
–limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制
24. 端口转发
将来自422端口的流量全部转到22端口。 这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
除此之外,还需要允许连接到422端口的请求
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
25. 记录丢弃的数据表
第一步:新建名为LOGGING的链
iptables -N LOGGING
第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中
iptables -A INPUT -j LOGGING
第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped”
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
第四步:丢弃这些数据包
iptables -A LOGGING -j DROP
假如有数据包从Network IN要通过iptables,数据包流向如下:
1.Network IN数据包到达服务器的网络接口
2.进入raw表的 PREROUTING 链,这个链的作用是决定数据包是否被状态跟踪。
进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
进入 nat 表的 PREROUTING 链,可以在此做DNAT(目标地址转换)
3.决定路由,查看目标地址是交给本地主机还是转发给其它主机。
4.到这里分两种情况,一种情况是数据包要转发给其它主机(一般情况下它是在担任网关服务器),数据包会依次经过:
5.进入 mangle 表的 FORWARD 链,
进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。
6.进入 mangle 表的 POSTROUTING 链
进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT (源地址转换)
7.数据包流出网络接口,发往network out。
8.另一种情况,数据包的目标地址就是发给本地主机的,它会依次穿过:
9.进入 mangle 表的 INPUT 链,
进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,
数据包交给本地主机的应用程序进行处理。
10.应用程序处理完毕后发送的数据包进行路由发送决定。
11.进入 raw 表的 OUTPUT 链。
进入 mangle 表的 OUTPUT 链,
进入 nat 表的 OUTPUT 链,
进入 filter 表的 OUTPUT 链。
12.进入 mangle 表的 POSTROUTING 链,
进入 nat 表的 POSTROUTING 链。
13.进入出去的网络接口,发送往network out。

浙公网安备 33010602011771号