rpm -ql iptables 查看安装的模块
iptables -t filter -L –n iptables -L –n这两个命令的效果是一样的 iptables -t nat -L –n查nat表 iptables -t mangle -L –n查mangle表
==============================================
[root@localhost ~]# iptables -help Usage: iptables -[AD] chain rule-specification [options] iptables -I chain [rulenum] rule-specification [options] iptables -R chain rulenum rule-specification [options] iptables -D chain rulenum [options] iptables -[LS] [chain [rulenum]] [options] iptables -[FZ] [chain] [options] iptables -[NX] chain iptables -E old-chain-name new-chain-name iptables -P chain target [options] iptables -h (print this help information)
Commands: Either long or short options are allowed. --append -A chainAppend to chain --delete -D chainDelete matching rule from chain --delete -D chain rulenum Delete rule rulenum (1 = first) from chain --insert -I chain [rulenum] Insert in chain as rulenum (default 1=first) --replace -R chain rulenum Replace rule rulenum (1 = first) in chain --list -L [chain [rulenum]] List the rules in a chain or all chains --list-rules -S [chain [rulenum]] Print the rules in a chain or all chains --flush -F [chain]Delete all rules in chain or all chains --zero -Z [chain [rulenum]] Zero counters in chain or all chains --new -N chainCreate a new user-defined chain --delete-chain -X [chain]Delete a user-defined chain --policy -P chain target Change policy on chain to target --rename-chain -E old-chain new-chain Change chain name, (moving any references)
-----------------------------------------------------------------------------------
iptables -L –n iptables -L -n -t nat iptables -L -n -t mangle [root@localhost ~]# iptables -F [root@localhost ~]# iptables -X [root@localhost ~]# iptables –Z
以上三步只是临时清除,重启后原配置文件继续生效
[root@localhost ~]# iptables -L –n
对tcp协议的22端口做DROP动作
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
SSH工具连接立即失效
恢复
[root@localhost ~]# iptables -D INPUT -p tcp --dport 22 -j DROP
关闭所有,ping也ping不通
iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.1.4 -j DROP
恢复
iptables -F
关闭web服务
iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.1.4 -p tcp --dport 80 目标端口
别人ping不到我们
iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.1.4 -p icmp --icmp-type 8 -j DROP
【实验】1,给自己留一条路,其他全部被封杀!
iptables -A INPUT -d 192.168.1.4 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 192.168.1.4 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT [root@localhost ~]# iptables -P INPUT DROP [root@localhost ~]# iptables -P OUTPUT DROP
自己ping自己起码得可以吧?
[root@localhost ~]# iptables -I INPUT 1 -s 192.168.1.4 -d 192.168.1.4 -j ACCEPT [root@localhost ~]# iptables -I OUTPUT 1 -s 192.168.1.4 -d 192.168.1.4 -j ACCEPT
放行web服务
iptables -A INPUT -d 192.168.1.4 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 192.168.1.4 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
合并同样的规则
[root@localhost ~]# iptables -L -n Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 192.168.1.4 192.168.1.4 ACCEPT tcp -- 0.0.0.0/0 192.168.1.4 tcp dpt:22 state NEW,ESTABLISHED ACCEPT tcp -- 0.0.0.0/0 192.168.1.4 tcp dpt:80 state NEW,ESTABLISHED Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT all -- 192.168.1.4 192.168.1.4 ACCEPT tcp -- 192.168.1.4 0.0.0.0/0 tcp spt:22 state ESTABLISHED ACCEPT tcp -- 192.168.1.4 0.0.0.0/0 tcp spt:80 state ESTABLISHED
扩展匹配
[root@localhost ~]# iptables -I INPUT 2 -d 192.168.1.4 -p tcp -m state --state NEW,ESTABLISHED -m multiport --destination-ports 22,53,80 -j ACCEPT
一次性合并多条法则
先合并再删除,否则连自己都登录不进去!
[root@localhost ~]# iptables -L -n Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 192.168.1.4 192.168.1.4 ACCEPT tcp -- 0.0.0.0/0 192.168.1.4 state NEW,ESTABLISHED multiport dports 22,53,80 ACCEPT tcp -- 0.0.0.0/0 192.168.1.4 tcp dpt:22 state NEW,ESTABLISHED ACCEPT tcp -- 0.0.0.0/0 192.168.1.4 tcp dpt:80 state NEW,ESTABLISHED Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT all -- 192.168.1.4 192.168.1.4 ACCEPT tcp -- 192.168.1.4 0.0.0.0/0 tcp spt:22 state ESTABLISHED ACCEPT tcp -- 192.168.1.4 0.0.0.0/0 tcp spt:80 state ESTABLISHED
绿色标记的法则将不再被匹配,不会再产生数据流量!
删除不会被匹配的法则 第三行
iptables -D INPUT 3
放谁进来就放谁出去 !
[root@localhost ~]# iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
删除不会被匹配的法则 第二行
iptables -D OUTPUT 2
以上的设置,ping自己是ping不通的,因为自己先出去,添加下面的就OK
iptables -A OUTPUT -s 192.168.1.4 -d 192.168.1.4 -j ACCEPT
规则的优化,已建立的连接直接匹配第一个,高效匹配!流量不走下面的ESTABLISHED了!
iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT
限制 192.168.1.1-192.168.1.100才能访问我
[root@localhost home]# iptables -A INPUT -m iprange --src-range 192.168.1.1-192.168.1.100 -p tcp --dport 23 -m state --state NEW -j ACCEPT
限制连接数目【限定22端口仅有2个新建连接】
[root@localhost home]# iptables -I INPUT 2 -d 192.168.1.4 -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 2 -j ACCEPT
会新加一个
ACCEPT tcp -- 0.0.0.0/0 192.168.1.4 tcp dpt:22 state NEW #conn/32 <= 2
继续打开ssh界面的连接,超过3个依然OK,是因为下面的规则被匹配,删这行就OK了,
iptables -D INPUT 4实测有效!
ACCEPT tcp -- 0.0.0.0/0 192.168.1.4 state NEW,ESTABLISHED multiport dports 22,53,80
【速率限定 限制别人访问我的服务器 频率一分钟2次 峰值为5个 】
iptables -A INPUT -d 192.168.1.4 -p tcp --dport 80 -m state --state NEW -m limit --limit 2/minute --limit-burst 5 -j ACCEPT iptables -L -n -v 0 0 ACCEPT tcp -- * * 0.0.0.0/0 192.168.1.4 tcp dpt:80 state NEW limit: avg 2/min burst 5
【本机服务器页面中含有“LCL”的页面,无法被访问】 实测有效!
iptables -I OUTPUT 1 -m string --algo kmp --string "LCL" -j REJECT web可被访问的规则 iptables -A INPUT -d 192.168.1.4 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d 192.168.1.4 -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
【本地主机当防火墙,处理本地服务】
vsftpd,端口是 21
yum -y install vsftpd service vsftpd restart cp /etc/passwd /var/ftp/pub/
先关闭iptables测试效果
service iptables stop
也可以清除所有规则
[root@localhost ~]# iptables -F [root@localhost ~]# iptables -Z [root@localhost ~]# iptables –X
打开win7的ftp功能
在cmd窗口下面,ftp 192.168.1.4 (本机的IP地址)
用户名 ftp
ls 可以看到 pub目录
开始写规则
打开本地所有连接
[root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT [root@localhost ~]# iptables -A OUTPUT -o lo -j ACCEPT
所有已建立的连接,都放行
[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT [root@localhost ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
放行ssh的22端口服务,同个IP最多发起3个连接
iptables -A INPUT -d 192.168.1.4 -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 3 -j ACCEPT
关闭所有进口,出口
[root@localhost ~]# iptables -P INPUT DROP【P是默认规则ACCEPT】 [root@localhost ~]# iptables -P OUTPUT DROP【P是默认规则ACCEPT】
放行FTP的21端口
iptables -A INPUT -d 192.168.1.4 -p tcp --dport 21 -m state --state NEW -j ACCEPT
加载ip_nat_ftp模块 这个很重要,否则后面的RELATED状态不起作用
modprobe ip_nat_ftp root@localhost ~]# lsmod | grep "ftp" nf_nat_ftp 3507 0 nf_nat 22759 1 nf_nat_ftp nf_conntrack_ftp 12913 1 nf_nat_ftp
把INPUIT和OUTPUT有跟踪关系的都加进来,修改表的第二行
iptables -R INPUT 2 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -R OUTPUT 2 -m state --state RELATED,ESTABLISHED -j ACCEPT
这样就可以正常访问ftp了
ipotables vim /etc/sysconfig/iptables 保存规则的文件 vim /etc/sysconfig/iptables-config 为iptables脚本提供配置的文件
保存iptables的规则
service iptables save iptables-save >/etc/sysconfig/iptables iptables-save >/etc/sysconfig/iptables.txt 保存在另外一个文件 iptables-restore< /etc/sysconfig/iptables.txt 读取保存的规则
脚本执行Iptables
开机自动执行的脚本放在这里面
cat /etc/rc.d/rc.local
网络防火墙
看看Ipv4路由转换,0无效,1有效
cat /proc/sys/net/ipv4/ip_forward
临时修改网卡 [root@localhost rc.d]# ifconfig eth1 192.168.1.100/24
【我的网络参考】
3号机 ping 172.16.0.100 是ping不通的
3号机添加路由 route add default gw 192.168.3.3
此时可以ping通2号机的172.16.0.103
2号机
vim /etc/sysctl.conf # Controls IP packet forwarding net.ipv4.ip_forward = 0 【0改为1】
2号机 使配置生效 [root@localhost ~]# sysctl –p
win7 添加路由 cmd :route add 192.168.3.0 MASK 255.255.255.0 172.16.0.103
让192.168.3.0/24网段内的主机通过172.16.0.103这个主机做网关通信
【*】此删除操作会导致无法连接ssh route DELETE 192.168.3.0
7 3号机 各种ping成功!
[root@localhost ~]# ping 192.168.3.3 PING 192.168.3.3 (192.168.3.3) 56(84) bytes of data. 64 bytes from 192.168.3.3: icmp_seq=1 ttl=64 time=0.252 ms 64 bytes from 192.168.3.3: icmp_seq=2 ttl=64 time=0.337 ms [root@localhost ~]# ping 172.16.0.100 PING 172.16.0.100 (172.16.0.100) 56(84) bytes of data. 64 bytes from 172.16.0.100: icmp_seq=1 ttl=127 time=0.496 ms 64 bytes from 172.16.0.100: icmp_seq=2 ttl=127 time=0.522 ms
【现在实验可以ssh不可以通过防火墙ping】
当前准备,禁用win7上的虚拟网卡net1和net8
当前环境,两个网段可以任意互相ping ssh工具可以使用
防火墙主机添加规则,不让互相ping
[root@localhost ~]# iptables -A FORWARD -p icmp --icmp-type 8 -j REJECT
这样就不能互相ping了,但是都可以去ping防火墙
【假如3号机是web服务器 不允许包含有“***”的字符访问请求】
安装httpd yum -y install httpd
service httpd restart win7浏览器可以打开欢迎界面192.168.3.1
vim /var/www/html/index.html随便写点东西
在防火墙主机上配置
iptables -A FORWARD -d 192.168.3.1 -p tcp --dport 22 -m state --state NEW -j ACCEPT
允许已连接的转发
iptables -I FORWARD 1 -m state --state ESTABLISHED -j ACCEPT
当前ssh已匹配到的链,但是NEW并没有匹配到数据,那么开始测试NEW
4 232 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
关闭3号机的ssh连接
在防火墙添加配置
iptables -P FORWARD DROP
重新连接到3号机的ssh 一切Ok,NEW匹配到了数据
2 128 ACCEPT tcp -- * * 0.0.0.0/0 192.168.3.1 tcp dpt:22 state NEW
此时ssh是可以访问的 但web已经访问不了
防火墙添加规则 允许ftp的21端口
iptables -A FORWARD -d 192.168.3.1 -p tcp --dport 21 -m state --state NEW -j ACCEPT
加载ip_nat_ftp模块 这个很重要,否则RELATED状态不起作用
modprobe ip_nat_ftp
添加规则,
iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
【win7 cmd测试 ftp 192.168.3.1 用户名ftp 密码kong】 OK
C:\Users\Administrator>ftp 192.168.3.1 连接到 192.168.3.1。 220 (vsFTPd 2.2.2) 用户(192.168.3.1:(none)): ftp 331 Please specify the password. 密码: 230 Login successful. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. fstab pub upload 226 Directory send OK.
ftp: 收到 20 字节,用时 0.00秒 20000.00千字节/秒。
ftp>
【可以让你ping 一秒只让你ping 3次】
iptables -A FORWARD -d 192.168.3.1 -p icmp --icmp-type 8 -m limit --limit 3/second -m state --state NEW -j ACCEPT iptables -A FORWARD -d 192.168.3.1 -p icmp --icmp-type 8 -m limit --limit 6/minute -m state --state NEW -j ACCEPT iptables -A FORWARD -d 192.168.3.1 -p icmp --icmp-type 8 -m limit --limit 6/minute --limit-burst 3 -m state --state NEW -j ACCEPT
【上面的RELATED状态对本设置有影响】
【笨鸟先飞】:
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这个状态的任何东西。
----------------------------------------------------------------------------------
【SNAT】 源地址转换
还是用这个网络结构图,完成实验
有4个表,优先级 raw淰愀渀最氀攀滰愀琀曰椀氀琀攀爀
查看当前防火墙的转发状态
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward 1
win7浏览器通过防火墙查看另一台ftp服务器
ftp://192.168.3.1/ 测试 OK
win7浏览器通过防火墙查看另一台web服务器
192.168.3.1 测试 OK
在192.168.3.1主机查看被访问的日志,来访者就是原来的win7主机,不是防火墙
[root@localhost ~]# tail /var/log/httpd/access_log 172.16.0.100 - - [20/May/2015:14:05:38 +0800] "GET /favicon.ico HTTP/1.1" 404 286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"
防火墙配置 把172.16.0.0/16转换成192.168.3.3
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.3.3
再去win7刷新web页面 去web服务器看访问日志
[root@localhost ~]# tail /var/log/httpd/access_log 192.168.3.3 - - [20/May/2015:14:23:29 +0800] "GET /favicon.ico HTTP/1.1" 404 286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"
删除web机器指向防火墙192.168.3.3的网关
[root@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.3.3删 0.0.0.0 UG 0 0 0 eth0 0.0.0.0 192.168.3.2 0.0.0.0 UG 0 0 0 eth0 route del -net 0.0.0.0
重新连接ssh到web服务器
刷新win7的web页面
看web服务器访问日志
[root@localhost ~]# tail /var/log/httpd/access_log 0 Chrome/30.0.1599.101 Safari/537.36" 192.168.3.3 - - [20/May/2015:14:35:06 +0800] "GET /favicon.ico HTTP/1.1" 404 286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36"
防火墙添加过滤法则 拒绝所有协议的服务
[root@localhost ~]# iptables -A FORWARD -m string --algo kmp --string "game" -j REJECT
web端测试
[root@localhost ~]# cd /var/www/html/ [root@localhost html]# vim index.html 添加game 测试
再刷新win7 浏览器 确实有效!
以上的设置可以作为代理服务器上网功能
1, 外网的IP要是固定的
2, 此时的防洪墙充当代理服务器
3, 1号机同IP段的主机都是客户机
-------------------------------------------------------------------------
【DNAT】地址转换
内网当服务器,外网通过防火墙访问内网的web服务器,3号机是web服务器,1号机外网
iptables -t nat -L –nv 看看
iptables -t nat -F POSTROUTING 清除规则
把访问172.16.0.103 tcp协议80端口连接指向192.168.3.1
iptables -t nat -A PREROUTING -d 172.16.0.103 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.1
本文出自 “生命不息,折腾不止。” 博客,谢绝转载!
原文地址:http://990487026.blog.51cto.com/10133282/1693932