七週四次課(1月25日)
10.15 iptables filter表案例
10.16/10.17/10.18 iptables nat表應用shell
10.15 iptables filter表案例vim
iptables小案例bash
vi /usr/local/sbin/iptables.sh //加入以下內容網絡
#! /bin/bashless
ipt="/usr/sbin/iptables"tcp
$ipt -Foop
$ipt -P INPUT DROPpost
$ipt -P OUTPUT ACCEPT網站
$ipt -P FORWARD ACCEPTspa
$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
icmp示例
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
[root@tianqi-01 ~]# vim /usr/local/sbin/iptables.sh
#!/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.77.1/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
ipt="/usr/sbin/iptables"
//這裏ipt是定義個一個變量(寫腳本的時候,寫全局的路徑,就是絕對路徑,就是後面再加載它,用變量去代替,看着更加簡單)
$ipt -F
//清空以前的規則——>在沒有 -t 指定表的時候,默認的就是filter表
$ipt -P INPUT DROP
//把IPPUT的策略給扔掉
$ipt -P OUTPUT ACCEPT
//把OUTPUT放行
$ipt -P FORWARD ACCEPT
//把FORWARD放行
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
//增長規則,-m --state 指定了狀態,並針對這些狀態放行(-m --state這種用法並很少見,可是這條規則必須寫進來,目的是讓相關的數據包放行)
$ipt -A INPUT -s 192.168.77.1/24 -p tcp --dport 22 -j ACCEPT
//把該網段的22端口數據包放行——>這裏的IP段根據本身的IP段來作實驗
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
//把80端口數據包放行
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
//把21端口數據包放行
使用sh命令執行寫好的shell腳本
[root@tianqi-01 sbin]# sh /usr/local/sbin/iptables.sh
執行完腳本後使用iptables -nvL命令就能夠查看到添加上去的規則:
[root@tianqi-01 sbin]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
5 340 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 192.168.77.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 5 packets, 388 bytes)
pkts bytes target prot opt in out source destination
1.iptables -I INPUT -p icmp --icmp-type 8 -j DROP 這個規則會產生一個效果,讓你ping外面的機器還能夠ping通,可是ping本機的時候,就不會通了
[root@tianqi-01 sbin]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
//會發現可ping通外面的網絡,但本身的虛擬機和物理機則沒法鏈接
[root@tianqi-01 sbin]# ping www.qq.com
PING www.qq.com (112.90.83.112) 56(84) bytes of data.
64 bytes from 112.90.83.112: icmp_seq=1 ttl=128 time=12.1 ms
64 bytes from 112.90.83.112: icmp_seq=2 ttl=128 time=192 ms
64 bytes from 112.90.83.112: icmp_seq=3 ttl=128 time=221 ms
^C
--- www.qq.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2013ms
rtt min/avg/max/mdev = 12.123/142.229/221.660/92.744 ms
[root@tianqi-01 sbin]#
2.這時用本身的物理機去ping虛擬機,會發現沒法鏈接
3.這時,再來刪除這條命令
[root@tianqi-01 sbin]# iptables -D INPUT -p icmp --icmp-type 8 -j DROP
4.service iptables restart 重啓iptables服務
[root@tianqi-02 ~]# service iptables restart //重啓iptables服務
Redirecting to /bin/systemctl restart iptables.service
[root@tianqi-02 ~]#
[root@tianqi-01 ~]# iptables -nvL //這裏會看到還沒禁掉以前的規則
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
29 1924 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
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain 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-prohibited
Chain OUTPUT (policy ACCEPT 17 packets, 1492 bytes)
pkts bytes target prot opt in out source destination
[root@tianqi-02 ~]#
這裏--icmp-type選項要跟-p icmp一塊兒使用,後面指定類型編號。這個8指的是能在本機ping通其餘機器,而其它機器不能ping通本機,請牢記。
5.這裏物理機去ping虛擬機IP,會發現再次ping通
10.16/10.17/10.18 iptables nat表應用
•nat表應用
• A機器兩塊網卡ens33(192.168.133.130)、ens37(192.168.100.1),ens33能夠上外網,ens37僅僅是內部網絡,B機器只有ens37(192.168.100.100),和A機器ens37能夠通訊互聯。
• 需求1:可讓B機器鏈接外網
• A機器上打開路由轉發 echo "1">/proc/sys/net/ipv4/ip_forward
• A上執行 iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
• B上設置網關爲192.168.100.1
• 需求2:C機器只能和A通訊,讓C機器能夠直接連通B機器的22端口
• A上打開路由轉發echo "1">/ proc/sys/net/ipv4/ip_forward
• A上執行iptables -t nat -A PREROUTING -d 192.168.133.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
• A上執行iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130
B上設置網關爲192.168.100.1
需求:如今我有兩臺機器,A機器共有兩塊網卡,一塊是能夠鏈接外網的,一塊是能夠鏈接內網的。B機器則只有一個內網網卡,不能鏈接外網,只能鏈接內網。如今的需求就是想要B機器可以鏈接外網,說白了就是想作一個路由器的功能。
1.首先作這個實驗須要兩個虛擬機,記得先拍攝一個快照,以避免在實驗過程當中出現問題沒法恢復:
2.給第一臺虛擬機添加一個網卡:
編輯虛擬機設置->選擇添加->選擇網絡適配器,下一步->完成。
此時出現網絡適配器2,選擇LAN區段,點擊LAN區段(s)->添加,自定義名字,肯定->在LAN區段(L)下選擇「自定義名字」,肯定。此時網絡適配器2已經選擇了「LAN區段」。
3.把另外一臺虛擬機的網卡禁止掉,而後添加一個新網卡,一樣指定剛剛添加的那個LAN區段:
點擊「添加」,選擇「網絡適配器」,下一步,完成。網絡適配器2右側點擊「LAN區段(L)」,選擇「自定義名字」,肯定。
4.將兩臺虛擬機啓動起來,而後給新網卡配置IP,先配置CentOS 7.4-1,使用ifconfig命令能夠看到新網卡的信息:
[root@tianqi-01 ~]# ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.231.132 netmask 255.255.255.0 broadcast 192.168.231.255
inet6 fe80::cdb4:62da:20:9c95 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b3:30:b6 txqueuelen 1000 (Ethernet)
RX packets 278 bytes 21177 (20.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 80 bytes 12260 (11.9 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.231.139 netmask 255.255.255.0 broadcast 192.168.231.255
ether 00:0c:29:b3:30:b6 txqueuelen 1000 (Ethernet)
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::e248:f90:634b:5b98 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b3:30:c0 txqueuelen 1000 (Ethernet)
RX packets 35 bytes 11970 (11.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 102 bytes 17988 (17.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 8 bytes 552 (552.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 552 (552.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@tianqi-01 ~]#
接着使用ifconfig命令給新網卡配置一個IP,設置24網段:
[root@tianqi-01 ~]# ifconfig ens37 192.168.100.1/24
可是這種方式配置的IP重啓系統就沒有了,想要有永久有效就須要把網卡配置文件複製一份出來,將文件名稱改成該網卡的名稱,而後將裏面的配置信息改成這個網卡IP:
[root@tianqi-01 ~]# cd /etc/sysconfig/network-scripts/
[root@tianqi-01 network-scripts]# ls
ifcfg-ens33 ifdown-bnep ifdown-isdn ifdown-sit ifup ifup-ippp ifup-plusb ifup-sit ifup-wireless
ifcfg-ens33:0 ifdown-eth ifdown-post ifdown-Team ifup-aliases ifup-ipv6 ifup-post ifup-Team init.ipv6-global
ifcfg-lo ifdown-ippp ifdown-ppp ifdown-TeamPort ifup-bnep ifup-isdn ifup-ppp ifup-TeamPort network-functions
ifdown ifdown-ipv6 ifdown-routes ifdown-tunnel ifup-eth ifup-plip ifup-routes ifup-tunnel network-functions-ipv6
[root@tianqi-01 network-scripts]# cp ifcfg-ens33 ifcfg-ens37
[root@tianqi-01 network-scripts]# ls
ifcfg-ens33 ifdown-bnep ifdown-post ifdown-TeamPort ifup-eth ifup-plusb ifup-Team network-functions
ifcfg-ens33:0 ifdown-eth ifdown-ppp ifdown-tunnel ifup-ippp ifup-post ifup-TeamPort network-functions-ipv6
ifcfg-ens37 ifdown-ippp ifdown-routes ifup ifup-ipv6 ifup-ppp ifup-tunnel
ifcfg-lo ifdown-ipv6 ifdown-sit ifup-aliases ifup-isdn ifup-routes ifup-wireless
ifdown ifdown-isdn ifdown-Team ifup-bnep ifup-plip ifup-sit init.ipv6-global
[root@tianqi-01 network-scripts]# vim ifcfg-ens37
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens37"
UUID="a0a278f6-09ab-4b83-981b-6a5bf82223b4"
DEVICE="ens37"
ONBOOT="yes"
IPADDR=192.168.100.1
NETMASK=255.255.255.0
重啓網卡服務
[root@tianqi-01 network-scripts]# service network restart
Restarting network (via systemctl): [ OK ]
5.配置另外一臺虛擬機的網卡IP:
因爲沒法遠程,在本機操做。
一樣的使用ifconfig命令配置IP
接着複製網卡文件,並修改成新網卡的信息:
修改完後重啓一下網卡服務,可是可能會重啓失敗,若是重啓失敗就重啓操做系統便可。
以上操做成功後就ping一下CentOS 7.4的IP看看是否能ping通:
若是沒法ping通證實有問題,須要去檢查一下,CentOS 7.4的IP是否存在,若是CentOS 7.4的IP存在的話,就檢查一下CentOS 7.2的IP是否存在,發現IP不存在的話就從新使用ifconfig命令配置一下便可。
若是出現屢次使用ifconfig命令配置IP以後,IP卻消失的狀況,就得查看這個網卡的網卡配置文件是否有問題。
6.準備工做都就緒以後,確保兩個網卡均可以互相ping以後,就開始完成需求1:讓CentOS 7.4clone能夠鏈接外網:
首先打開CentOS 7.4的nat路由中轉發,這一步須要修改一下內核參數,須要修改/proc/sys/net/ipv4/ip_forward文件,這個文件默認的值爲0,0表明沒有開啓轉發,因此咱們要將這個值改成1:
[root@tianqi-01 network-scripts]# cat /proc/sys/net/ipv4/ip_forward
0
[root@tianqi-01 network-scripts]# echo "1" > !$
echo "1" > /proc/sys/net/ipv4/ip_forward
[root@tianqi-01 network-scripts]# cat /proc/sys/net/ipv4/ip_forward
1
第二步,增長一條規則(有了這條規則就能夠上網):
[root@tianqi-01 network-scripts]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33-j MASQUERADE
[root@tianqi-01 network-scripts]# iptables -t nat -nvL
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 -- * ens33 192.168.100.0/24 0.0.0.0/0
上面是可以鏈接外網網卡的名字。
這一步要注意的是,網卡的名稱看清楚得是能連接外網網卡的那個網卡名稱,搞錯了後續步驟就會失敗。
第三步,給CentOS 7.2設置默認網關:
設置了默認網關後可使用route -n查看一下,是否設置成功:
設置了默認網關後ping一下CentOS 7.4的外網網卡IP和虛擬機的網關地址看看能不能ping通:
能ping通以後,就表明能夠鏈接外網了,可是這時候還不可以ping網址,因此接下來咱們給CentOS 7.2設置一下DNS,看看可否鏈接網站:
而後ping一下DNS的地址看看是否能ping通:
能ping的通就表明沒問題,這時候就能夠ping一下一些網站了:
能ping通網址的話,就表明這個臺內網的機器已經能夠經過CentOS 7.4的nat轉發來鏈接外網了,如今CentOS 7.4就至關於充當了一個路由器的角色,經過這臺機器就可讓內網的機器得以鏈接外網了。
需求2:如今使用Windows是不能鏈接CentOS 7.2的,因此如今的需求就是可以遠程鏈接CentOS 7.2。要實現這個需求須要經過CentOS 7.4進行一個跳轉,也就是所謂的端口映射,把CentOS 7.2的22端口映射到CentOS 7.4上。
• 需求2:C機器只能和A通訊,讓C機器能夠直接連通B機器的22端口
• A上打開路由轉發echo "1">/ proc/sys/net/ipv4/ip_forward
• A上執行iptables -t nat -A PREROUTING -d 192.168.133.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
• A上執行iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130
• B上設置網關爲192.168.100.1
第一步,打開路由轉發:
[root@tianqi-01 network-scripts]# cat /proc/sys/net/ipv4/ip_forward
0
[root@tianqi-01 network-scripts]# echo "1" > !$
echo "1" > /proc/sys/net/ipv4/ip_forward
[root@tianqi-01 network-scripts]# cat /proc/sys/net/ipv4/ip_forward
1
第二步,添加規則,由於以前添加了一條規則,如今先把那條規則刪掉以避免影響操做:
[root@tianqi-01 ~]# iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
如今nat表是一個空表,沒有任何規則
[root@tianqi-01 ~]# iptables -t nat -nvL
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
[root@tianqi-01 ~]#
第一條,是發送過來的包:
[root@tianqi-01 ~]# iptables -t nat -A PREROUTING -d 192.168.11.136 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
這條規則是把192.168.11.136的1122端口的數據包,轉發到192.168.100.100的22端口上去。
第二條,是反饋回去的包:
[root@tianqi-01 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.11.136
這條規則是把192.168.100.100返回的數據包,轉發到192.168.11.136上去,而後回到Windows上。
添加完規則檢查一下是否存在nat表裏:
[root@tianqi-01 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 1 packets, 229 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * 0.0.0.0/0 192.168.11.136 tcp dpt:1122 to:192.168.100.100:22
Chain INPUT (policy ACCEPT 1 packets, 229 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 SNAT all -- * * 192.168.100.100 0.0.0.0/0 to:192.168.11.136
[root@tianqi-01 ~]#
第三步,以上操做沒問題後,給CentOS 7.2設置默認網關:
完成以上操做以後,在XShell裏新建一個會話,鏈接192.168.11.136的1122端口:
友情連接:阿銘Linux