1. 程式人生 > >七周四次課 iptables filter表案例以及iptables nat表應用

七周四次課 iptables filter表案例以及iptables nat表應用

iptables filter表 iptables nat表

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進行查看
[root@linletao-001 ~]# sh /usr/local/sbin/iptables.sh^C
[root@linletao-001 ~]# 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
上面這條命令會產生一個效果

[root@linletao-001 ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP

[root@linletao-001 ~]# 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,所以我們沒有辦法遠程連接。

    我們先查看第一臺機器的網卡

[root@linletao-001 ~]# 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”,則表示它沒有打開內核轉發。
[root@linletao-001 ~]# cat /proc/sys/net/ipv4/ip_forward
0
然後我們要將它的內容改成“1”。 echo "1">/proc/sys/net/ipv4/ip_forward
[root@linletao-001 ~]# cat /proc/sys/net/ipv4/ip_forward
1
這樣,我們就打開了內核端口轉發。

第二步,添加一條iptables規則
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
然後我們查看一下剛添加的規則
[root@linletao-001 ~]# 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
技術分享圖片

然後連接,可以遠程登錄了。
技術分享圖片

[root@linletao-001 ~]# w
00:03:46 up 1:57, 2 users, load average: 0.01, 0.03, 0.03
USER TTY FROM LOGIN@ 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中來的。

七周四次課 iptables filter表案例以及iptables nat表應用