综合:在这里我们讲两个小案例,filter和nat的案列,会讲到一些具体的操作步骤,均已经过测试,可用于实际工作中:
1、filter表:
案列:只针对filter表,预设策略INPUT链DROP,其他OUTPUT和FORWARD链ACCEPT,然后针对192.168.149.0/24开通56888(ssh)端口,对所有网段开通80端口,对所有网段开通21端口:
因为有多条规则,最好写成脚本的格式:内容如下:[root@localhost ~]# vim /usr/local/sbin/iptables.sh #!/bin/bashipt="/usr/sbin/iptables"$ipt -F #清空规则$ipt -P INPUT DROP #input链丢弃掉$ipt -P OUTPUT ACCEPT #output链允许$ipt -P FORWARD ACCEPT #forward允许$ip -A INPUT -m state --state RELATED,ESTABLISHED -J ACCEPT #默认关于这些链接继续链接,不中断$ipt -A INPUT -p tcp -s 192.168.149.0/24 -p tcp --dport 56888 -j ACCEPT #指定可连接本机sshd的IP$ipt -A INPUT -p tcp --dport 80 -j ACCEPT #对所有网段放行本机的80端口$ipt -A INPUT -p tcp --dport 21 -j ACCEPT #对所有网段放行本机的21端口#因为我的sshd端口是56888,所以修改了.
注释:图里我放行了我的sshd端口,不建议自己在远程登录下允许此脚本,会断开远程连接:
图里有$ip -A INPUT -m state --state RELATED,ESTABLISHED -J ACCEPT这条命令:
-m表示表示扩展选项,针对连接状态放行,为了通信的顺畅:
此时在物理机测试,,发现可以正常远程:查看规则,发现第一条规则已经放行了181个包了:
[root@localhost ~]# iptables -nvLChain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 181 16744 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:56888 17 1540 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 24 1872 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT 169 packets, 19408 bytes) pkts bytes target prot opt in out source destination
2、nat小案例:iptables表还可以实现nat的功能,有时候我们的内网需要上网,而同时也没那么多的公网IP分配,nat的主要功能主要是通过把内网地址在访问时通过改变其源目IP地址来实现上网,主要分为两种形式:
静态nat(一个公网对应一个私网地址),主要用于外网访问内网的某一个服务器,并且需要放行所有端口:
动态PAT(一个公网对应n个私网地址),端口映射,用于把内部的某台服务器的端口映射出去访问,一般指提供web服务和FTP的服务器:
需求1:有一台机器上有两快网卡eth0和eth1,其中eth0的IP地址192.168.149.130/24,eth1的IP地址为192.168.100.1/24,现在有另一台机器A的192.168.100.2和eth1是互通的,那么如何才能让A机器上网了:
开始我们先做准备工作,准备两台虚拟机,B机器上有两块网卡,A机器上有一块网卡eth1,通过B机器和A机器的eth1网卡都添加到LAN(同一个交换机下):然后自己互相ping,网络是否可达:
A(1)机器:因为只有一块内网网卡,只能在虚拟机里操作:
B(2)机器:
[root@localhost ~]# ifconfig eth1 192.168.100.1/24[root@localhost ~]# ifconfig eth1eth1: flags=4099mtu 1500 inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255 ether 00:0c:29:81:f4:55 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 11 bytes 1650 (1.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@localhost ~]# ping 192.168.100.2PING 192.168.100.2 (192.168.100.2) 56(84) bytes of data.64 bytes from 192.168.100.2: icmp_seq=1 ttl=64 time=1.91 ms64 bytes from 192.168.100.2: icmp_seq=2 ttl=64 time=0.258 ms64 bytes from 192.168.100.2: icmp_seq=3 ttl=64 time=0.275 ms^C--- 192.168.100.2 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2002msrtt min/avg/max/mdev = 0.258/0.817/1.918/0.778 ms
由上,A和B机器的内网是可达的:
如图里:ifconfig eth1 192.168.100.1/24这是给网卡临时设置IP地址,但机器重启后配置消失:否则请写入配置文件:
首先开启路由转发功能: #在B机器操作:
针对nat表做一个IP转发的操作,-o后面跟设备名,表示出口网卡,MASQUERADE表示伪装: #在B机器操作:
给A机器设置网关,默认到B机器的内网可达: #在A机器操作:
A机器操作如下:
在B机器上操作:[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发[root@localhost ~]# cat !$cat /proc/sys/net/ipv4/ip_forward1[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE[root@localhost ~]# iptables -t nat -nvL #查看NAT表:Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * eth0 192.168.100.0/24 0.0.0.0/0
B机器操作:
[root@localhost ~]# route add default gw 192.168.100.1
最后在A机器测试:是:可以正常上网:
需求2:C机器(物理机)192.168.149.135只能和B机器通信,让C机器可以直接连接通A机器的sshd(56888)端口:
通过端口映射的方式把A机器的sshd端口映射出来,方便远程:
在B机器操作内容如下:
1:首先在B机器上开启路由转发: echo “1” >/proc/sys/net/ipv4/ip_forward
2:增加iptables规则:
iptables -t nat -A PREROUTING -d 192.168.149.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.1:56888
物理机C机器到B机器的包的规则,进来的包,
iptables -t nat -A POSTROUTING -s 192.168.100.1 -j SNAT --to 192.168.149.130
从A机器到B机器的包的规则,出去的包:
在B机器上操作:[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发[root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.149.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.2:56888[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.100.2 -j SNAT --to 192.168.149.130[root@localhost ~]# iptables -t nat -nvLChain PREROUTING (policy ACCEPT 4 packets, 310 bytes) pkts bytes target prot opt in out source destination 1 60 DNAT tcp -- * * 0.0.0.0/0 192.168.149.130 tcp dpt:1122 to:192.168.100.2:56888Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 1 packets, 60 bytes) pkts bytes target prot opt in out source destination 1 76 SNAT all -- * * 192.168.100.2 0.0.0.0/0 to:192.168.149.130
A机器操作:设置网关:
[root@localhost ~]# route add default gw 192.168.100.1
测试:重新打开一个putty,通过192.168.149.130:1122端口是否可以连接到A机器:
login as: rootroot@192.168.149.130's password:Last login: Thu Aug 9 14:27:10 2018[root@localhost ~]# w 15:01:32 up 34 min, 2 users, load average: 0.00, 0.01, 0.05USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot tty1 14:27 28.00s 0.15s 0.15s -bashroot pts/0 192.168.149.135 15:01 1.00s 0.01s 0.00s w###测试后可以正常连接:
2、Centos关于icmp禁止ping命令: 本机可以ping通远端主机,远端主机ping不通本机:
[root@localhost ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
可以实现:
图例: