当前位置:首页 » Linux技术知识

linux iptables SNAt NAT 【原创】

2015-09-11 20:22 本站整理 浏览(32)












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服务器 不允许包含有“***”的字符访问请求】
安装httpdyum -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
本文出自 “魂斗罗” 博客,谢绝转载!