iptables小案例
将80端口,22端口和21端口放行,22端口需要指定IP段,只有指定IP段访问才可以。其他段一概拒绝。
我们可以用一个脚本来实现。
#!/bin/bash
ipt="/usr/sbin/iptables"
ipt是定义了一个变量,如果要执行命令,要写全局绝对路径,这样在脚本当中才不会因为环境变量问题导致命令无法执行。所以以后路写shell脚本时一定要写全局绝对路径。我们来定义一个变量,目的就是后面有许多的地方要加载它,如果写很长一段命令会很繁琐。所以我们要定义一个变量,用变量去代替他,这样看起来就更加的简单。
我们没有参数-t,所以针对的是filter表。
$ipt -F(首先清空以前的规则)
$ipt -P INPUT DROP (INPUT 丢掉包)
$ipt -P OUTPUT ACCEPT (OUTPUT 允许包)
$ipt -P FORWARD ACCEPT (FORWARD 允许包)
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT(添加规则,放行前面的状态。特别是RELATED和ESTABLISHED这两个状态,是保持通信的重要状态。所以一定要加上)
$ipt -A INUPT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT(添加规则,放行)
$ipt -A INUPT -P tcp --dport 80 -j ACCEPT(80端口数据包放行)
$ipt -A INUPT -P tcp --dport 21 -j ACCEPT(21端口数据包放行)
完整脚本
#! /bin/bash
ipt="/usr/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
然后我们执行sh /usr/local/sbin/iptables.sh这条命令,然后再执行
iptables -nvL进行查看
[[email protected] ~]# sh /usr/local/sbin/iptables.sh^C
[[email protected] ~]# iptables -nvL
Chain INPUT (policy DROP 46 packets, 46326 bytes)
pkts bytes target prot opt in out source destination
115 8552 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- 192.168.133.0/24 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 84 packets, 15048 bytes)
pkts bytes target prot opt in out source destination
这时我们发现数值已经在增加了,而且各端口也都添加完成。只有22端口是指定IP段访问,80和21端口没有指定源,任何ip都能访问。
icmp示例
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
上面这条命令会产生一个效果
[[email protected] ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
[[email protected] ~]# ping 163.com
PING 163.com (123.58.180.8) 56(84) bytes of data.
64 bytes from 123.58.180.8 (123.58.180.8): icmp_seq=1 ttl=56 time=42.1 ms
64 bytes from 123.58.180.8 (123.58.180.8): icmp_seq=2 ttl=56 time=42.2 ms
64 bytes from 123.58.180.8 (123.58.180.8): icmp_seq=3 ttl=56 time=42.1 ms
^C
--- 163.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 42.158/42.178/42.209/0.169 ms
就是ping外网的时候可以ping通,但是ping本机就ping不通了,但是不通不代表不能连接,我仅仅是将它做了一个禁ping而已,你可以ping出去,但是外面ping不进来。
所以, iptables -I INPUT -p icmp --icmp-type 8 -j DROP这条命令就是不让别人ping通你的命令,将icmp的8中类型DROP掉就可以实现目的了。
iptables nat表应用
nat表应用
需求1:A机器两块网卡ens33(192.168.133.130外网网卡)、ens37(192.168.100.1内网网卡),ens33可以上外网,ens37仅仅是内部网络,B机器只有ens37(192.168.100.100),和A机器ens37可以通信互联。两个IP可以相互ping通。最终让第二台设备通过第一台设备连接外网(将第一台设备变成一个路由器)
首先我们要准备两台机器
给第一台机器添加一个网卡
添加完网卡后我们点击完成。
然后点击虚拟网络。它的意思是把这个网卡连接到一个内网交换机上,这样的话我们这台机器和另一台机器连上同一个内网交换机,他们两者通信就可以了。
然后我们点击虚拟网络,然后添加一个全局虚拟网络,这个虚拟网络的名字是可以自定义的。然后我们点击选择我们刚才添加的虚拟网络。
然后我们给第二台机器也添加一个网卡,步骤和第一台添加网卡一样,然后在虚拟网络中选择我们刚才在第一台机器创建的虚拟网络。这两台机器必须选择同一个虚拟网络。第一台机器的网卡咱们不用去动,我们可以继续远程连接,但是第二台机器的网卡因为没有windows可以连接的IP,所以我们没有办法远程连接。
我们先查看第一台机器的网卡
[[email protected] ~]# ifconfig
ens33(第一台设备的网卡): flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.105 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::df71:e49:bd9a:8b3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:52:5a:0f txqueuelen 1000 (Ethernet)
RX packets 117 bytes 37648 (36.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 94 bytes 10825 (10.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:0(第一台设备的虚拟网卡): flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.150 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:0c:29:52:5a:0f txqueuelen 1000 (Ethernet)
ens37(我们新添加的网卡): flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::51f5:e552:314f:c5b1 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:52:5a:19 txqueuelen 1000 (Ethernet)
RX packets 7 bytes 2394 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 34 bytes 5572 (5.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我们现在要给ens37这个网卡设置一个IP,我们可以命令行添加IP,也可以配置文件添加IP。配置文件添加IP和虚拟网卡设置IP一样,只要复制一份虚拟网卡配置文件,将里面的IP和netmask修改就可以了,其他不用修改。
还有一种就是通过命令来设置IP,我们就用ens37这个网卡做个例子。ifconfig ens37 192.168.100.1/24,它的IP是192.168.100.1,网段为24网段。这样可以手动命令行设置IP。
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::20c:29ff:fe52:5a19 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:52:5a:19 txqueuelen 1000 (Ethernet)
RX packets 94 bytes 32148 (31.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 269 bytes 47146 (46.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这样我们就将ens37的IP设置好了。但是这个IP重启后就消失了,如果想永久有效,最好去设置配置文件。
由于另一台设备不能远程连接,所以我们只能在本机上操作。先给ens37配置IP。ifconfig ens37 192.168.100.100/24
这样,第二台设备的网卡IP我们也配置好了。
然后我们ping一下第一台设备的IP
可以ping通,说明没有问题。这样我们的准备工作就完成了。
如果想要第二台设备可以联外网。
首先要在第一台设备上打开路由转发,如果想用nat表和网络转发,我们需要修改内核参数。
/proc/sys/net/ipv4/ip_forward这个文件的默认是“0”。如果是“0”,则表示它没有打开内核转发。
[[email protected] ~]# cat /proc/sys/net/ipv4/ip_forward
0
然后我们要将它的内容改成“1”。 echo "1">/proc/sys/net/ipv4/ip_forward
[[email protected] ~]# cat /proc/sys/net/ipv4/ip_forward
1
这样,我们就打开了内核端口转发。
第二步,添加一条iptables规则
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
然后我们查看一下刚添加的规则
[[email protected] ~]# iptables -t nat -nvL
Chain POSTROUTING (policy ACCEPT 1 packets, 76 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * ens33 192.168.100.0/24 0.0.0.0/0
这条规则就是想让192.168.100.100能上网。
第三步,第二台设备要设置网关。
首先,我们先查看一下第二台设备的网关。
命令是route -n
然后给他设置网关,设置完后再查看
这样,第二台设备的网关就设置好了。
然后我们ping一下第一台设备的网卡
发现可以ping通,这就意味着他可以和外网通信了。
然后我们给他设置一下DNS
然后保存退出。
再ping一下119.29.29.29
ping这个网关就证明外网也可以ping通了。我们再来ping一下外网。
也ping通了。
需求2:端口映射
第一台设备跳转到第二台设备
首先还是打开端口转发
echo "1">/proc/sys/net/ipv4/ip_forward
然后增加iptables规则,在增加之前,我们先将以前的规则删掉,以免影响我们下一步的操作。
iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
然后增加两条规则
iptables -t nat -A PREROUTING -d 192.168.1.105 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22(这条命令是将进去的包进行一个操作)
iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.1.105(这条命令是将出去的包进行一个操作)
然后给B机器增加网关
然后新建会话,将会话的名字设置为test100,主机名为192.168.1.105,端口为1122
然后连接,可以远程登录了。
[[email protected] ~]# w
00:03:46 up 1:57, 2 users, load average: 0.01, 0.03, 0.03
USER TTY FROM [email protected] IDLE JCPU PCPU WHAT
root tty1 22:06 12:10 0.16s 0.16s -bash
root pts/0 192.168.1.102 23:58 2.00s 0.01s 0.00s w
而且它的源是从我们的windows中来的。
原文地址:http://blog.51cto.com/13067688/2090040