Jade Dungeon

Linux网络基础配置

通过DHCP取得IP

[root@www ~]$ dhclient eth0

夠簡單吧!這樣就可以立刻叫我們的網路卡以 dhcp 協定去嘗試取得 IP 喔!

检查网卡

检查网卡是否被系统内核检测到:

# dmesg | grep -in eth
...
1063:[   17.994372] sky2 0000:86:00.0: eth0: Link is up at 1000 Mbps, full duplex, flow control rx
1064:[   17.994846] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
...

可以看到etho对应的模块号0000:86:00.0。通过这个号找到网卡对应的相关模块信息:

# lspci
...
86:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8072 PCI-E Gigabit Ethernet Controller (rev 10)

再根据模块去找对应的驱动程序:

# cd /lib/modules/`uname -r`/kernel/drivers/net
# modinfo 3c59x.ko

filename:
3c59x.ko
author:
Donald Becker <becker@scyld.com>
description:
3Com 3c59x/3c9xx ethernet driver LK1.1.19 10 Nov 2002
license:
GPL
version:
LK1.1.19 DBFD1C112761D573276AC45
parm:
debug:3c59x debug level (0-6)
.....以下省略.....

网络的启动与关闭

重启网络:

/etc/init.d/network restart

Debian系:

/etc/init.d/networking restart

启动/关闭网络:

ifup eth0
ifdown eth0

Debian系:

ifconfig eth0 up
ifconfig eth0 down

配置主机名

/etc/sysconfig/network

Debian系为:

/etc/hostname

网卡设定

Debian系配置文件为: /etc/network/interfaces

动态取IP把内容设置为:

auto lo
iface lo inet loopback

如果要静态IP则把内容设置为:

auto eth1
iface eth1 inet static
address 10.10.103.77
netmask 255.255.255.0
gateway 10.10.103.20

重启网卡后生效。除了配置文件,也通过命令动态取IP:

sudo dhclient eth0

添加新网卡

要注意Ubuntu184添加新网卡的方式改了, 在yaml格式的配置文件/etc/netplan/50-cloud-init.yaml里:

$ sudo ls /etc/netplan
50-cloud-init.yaml

$ sudo cat /etc/netplan/50-cloud-init.yaml
network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
            optional: true
        enp0s8:
            addresses: []
            dhcp4: true
            optional: true
    version: 2

只有一块网卡enp0s03, 我们查看一下新的网卡:

$ sudo ls /sys/class/net
enp0s3@  enp0s8@  lo@

lo是回环网卡,那么新网卡名字就是enp0s8,把它加到配置文件里:

network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
            optional: true
        enp0s8:
            addresses: []
            dhcp4: true
            optional: true
    version: 2

添加以后重启网卡就可以了。重启网卡的三种方式:

一、network

sudo service network restart
# or
sudo /etc/init.d/networking restart

二、ifdown/ifup

ifdown enp0s8
# or
ifup enp0s8

三、ifconfig

ifconfig enp0s8 down
ifconfig enp0s8 up

域名解析

本地域名解析:

/etc/hosts

DNS域名解析: /etc/resolv.conf 内容形式为:

nameserver 202.119.230.8

测试域名解析:

# nslookup www.google.com
Server:		127.0.0.1
Address:	127.0.0.1#53

Non-authoritative answer:
www.google.com	canonical name = www.l.google.com.
Name:	www.l.google.com
Address: 74.125.141.103
Name:	www.l.google.com
Address: 74.125.141.104
Name:	www.l.google.com
Address: 74.125.141.105
Name:	www.l.google.com
Address: 74.125.141.106
Name:	www.l.google.com
Address: 74.125.141.147
Name:	www.l.google.com
Address: 74.125.141.99

TCP/IP服务对应的端口:/etc/services

IP封包设定:/etc/protocols

1、临时修改网卡DNS地址

sudo vim /etc/resolv.conf

改为如下内容:

nameserver 8.8.8.8       #修改成你的主DNS
nameserver 8.8.4.4       #修改成你的备用DNS
search localhost         #你的域名

我这里用了谷歌的DNS解析服务器,修改后:wq退出,配置会实时生效,但是重启系统后可能会丢失配置。 其实编辑这个文件的时候,你也应该能看到文件头部「不要手动编辑」的注释。

2、永久修改网卡DNS

sudo –i
cd /etc/resolvconf/resolv.conf.d
vim base

添加如下内容

nameserver 8.8.8.8
nameserver 8.8.4.4

:wq保存退出,这样重启后设置就不会丢失了。

其实你cat head文件会找到图片中头部注释的那段话,不难推测resolv.conf文件就是根据/etc/resolvconf/resolv.conf.d目录中的这几个文件生成的。

无线网络

安装驱动

$ uname -r 3.5.0-19-generic

Incidentally I'm on Ubuntu 12.10:

$ lsb_release -r Release: 12.10

sudo apt-get install linux-headers-$(uname -r) build-essential sudo apt-get install wireless-tools wpasupplicant iw firmware-iwlwifi

下载:

配置无线网络

每一台AP都有一个ESSID/SSID。

查看无线连接信息:

# iwconfig
lo        no wireless extensions.

wlan0     IEEE 802.11abgn  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=15 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          
eth0      no wireless extensions.

查找无线网络:

# iwlist scanning
lo        Interface doesn't support scanning.

wlan0     Scan completed :
          Cell 01 - Address: 28:94:0F:79:8A:01
                    Channel:1
                    Frequency:2.412 GHz (Channel 1)
                    Quality=46/70  Signal level=-64 dBm  
                    Encryption key:on
                    ESSID:"GoldenDay"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s
                    Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
                    ESSID:""
                    ESSID:""
                    Mode:Master
                    Extra:tsf=00000000000f9d80
                    Extra: Last beacon: 5940ms ago
                    IE: Unknown: 0009476F6C64656E446179
                    IE: Unknown: 010882848B960C121824
                    IE: Unknown: 030101
                    IE: Unknown: 050400010300
                    IE: Unknown: 2A0100
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (2) : CCMP TKIP
                        Authentication Suites (1) : PSK
                       Preauthentication Supported
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (2) : CCMP TKIP
                        Authentication Suites (1) : PSK
                    IE: Unknown: 32043048606C
                    IE: Unknown: DD180050F2020101840003A4000027A4000042435E006232DDDD
                    IE: Unknown: DD1E00904C334E101BFFFF000000000000000000000000000000000000000000
                    IE: Unknown: 2D1A4E101BFFFF000000000000000000000000000000000000000000
                    IE: Unknown: DD1A0090483001001B00000000000000000000000000000000000000
                    IE: Unknown: 391201001B000000000000000000000000000000
                    IE: Unknown: 0000
                    IE: Unknown: 0000
                    IE: Unknown: 4A0E14000A002C01C800140005001900
                    IE: Unknown: 7F0101
                    IE: Unknown: DD0900037F01010000FF7F
                    IE: Unknown: DD0A00037F04010006004000
                    IE: Unknown: DD3F0050F204104A0001101044000102104700100000000000001000000028940F798A01103C000103104900140024E26002000101600000020001600100020001
          Cell 02 - Address: BC:AE:C5:C3:86:6A
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Quality=45/70  Signal level=-65 dBm  
                    Encryption key:on
                    ESSID:"izenesoft"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
                              24 Mb/s; 36 Mb/s; 54 Mb/s
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s
                    Mode:Master
                    Extra:tsf=00000032de35f203
                    Extra: Last beacon: 5404ms ago
                    IE: Unknown: 0009697A656E65736F6674
                    IE: Unknown: 010882848B962430486C
                    IE: Unknown: 030106
                    IE: Unknown: 050400010000
                    IE: Unknown: 2A0104
                    IE: Unknown: 2F0104
                    IE: IEEE 802.11i/WPA2 Version 1
                        Group Cipher : CCMP
                        Pairwise Ciphers (1) : CCMP
                        Authentication Suites (1) : PSK
                    IE: Unknown: 32040C121860
                    IE: Unknown: 2D1AEC181BFFFF000000000000000000000000000000000000000000
                    IE: Unknown: 3D1606080400000000000000000000000000000000000000
                    IE: Unknown: DD09001018020FF0050000
                    IE: Unknown: DD180050F2020101800003A4000027A4000042435E0062322F00

eth0      Interface doesn't support scanning.

可以看到每个可用网络的ESSID,然后可以手动连接:

# iwconfig wlan0 essid 'izenesoft' key 'p@ssw0rd'

查看连接信息:

# iwconfig wlan0

两部主机连通测试ping

[root@www ~]$ ping [選項與參數] IP

選項與參數:

  • -c 數值:後面接的是執行 ping 的次數,例如 -c 5 ;
  • -n :在輸出資料時不進行 IP 與主機名稱的反查,直接使用 IP 輸出(速度較快);
  • -s 數值:發送出去的 ICMP 封包大小,預設為 56bytes,不過你可以放大此一數值;
  • -t 數值:TTL 的數值,預設是 255,每經過一個節點就會少一;
  • -W 數值:等待回應對方主機的秒數。
  • -M [do|dont] :主要在偵測網路的 MTU 數值大小,兩個常見的項目是:
    • do :代表傳送一個 DF (Don't Fragment) 旗標,讓封包不能重新拆包與打包;
    • dont:代表不要傳送 DF 旗標,表示封包可以在其他主機上拆包與打包

检查主机是否存在

偵測一下 168.95.1.1 這部 DNS 主機是否存在?

[root@www ~]$ ping -c 3 168.95.1.1
PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data.
64 bytes from 168.95.1.1: icmp_seq=1 ttl=245 time=15.4 ms
64 bytes from 168.95.1.1: icmp_seq=2 ttl=245 time=10.0 ms
64 bytes from 168.95.1.1: icmp_seq=3 ttl=245 time=10.2 ms

--- 168.95.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2047ms
rtt min/avg/max/mdev = 10.056/11.910/15.453/2.506 ms

ping 最簡單的功能就是傳送 ICMP 封包去要求對方主機回應是否存在於網路環境中,上面的回應訊息當中,幾個重要的項目是這樣的:

  • 64 bytes:表示這次傳送的 ICMP 封包大小為 64 bytes 這麼大,這是預設值, 在某些特殊場合中,例如要搜索整個網路內最大的 MTU 時,可以使用 -s 2000 之類的數值來取代;
  • icmp_seq=1:ICMP 所偵測進行的次數,第一次編號為 1 ;
  • ttl=243:TTL 與 IP 封包內的 TTL 是相同的,每經過一個帶有 MAC 的節點 (node) 時,例如 router, bridge 時, TTL 就會減少一,預設的 TTL 為 255 , 你可以透過 -t 150 之類的方法來重新設定預設 TTL 數值;
  • time=15.4 ms:回應時間,單位有 ms(0.001秒)及 us(0.000001秒), 一般來說,越小的回應時間,表示兩部主機之間的網路連線越良好!

特別注意一下,如果你的主機與待偵測主機並不在同一個網域內, 那麼 TTL 預設使用 255 ,如果是同一個網域內,那麼 TTL 預設則使用 64 喔!

例題: 寫一支腳本程式 ping.sh ,透過這支腳本程式,你可以用 ping 偵測整個網域的主機是否有回應。此外,每部主機的偵測僅等待一秒鐘,也僅偵測一次。

答: 由於僅偵測一次且等待一秒,因此 ping 的選項為: -W1 -c1 ,而位於本機所在的區網為 192.168.1.0/24 ,所以可以這樣寫 (vim /root/bin/ping.sh):

#!/bin/bash
for siteip in $(seq 1 254)
do
	site="192.168.1.${siteip}"
	ping -c1 -W1 ${site} &> /dev/null
	if [ "$?" == "0" ]; then
		echo "$site is UP"
	else
		echo "$site is DOWN"
	fi
done

用ping追蹤路徑中的最大MTU數值

我們由第二章的網路基礎裡面談到加大訊框 (frame) 時, 對於網路效能是有幫助的,因為封包打包的次數會減少,加上如果整個傳輸的媒體都能夠接受這個 frame 而不需要重新進行封包的拆解與重組的話,那麼效能當然會更好,那個修改 frame 大小的參數就是 MTU 啦!

好了,現在我們知道網路卡的 MTU 修改可以透過 ifconfig 或者是 ip 等指令來達成,那麼追蹤整個網路傳輸的最大 MTU 時,又該如何查詢?呵呵!最簡單的方法當然是透過 ping 傳送一個大封包, 並且不許中繼的路由器或 switch 將該封包重組,那就能夠處理啦!沒錯!可以這樣的:

找出最大的 MTU 數值

[root@www ~]$ ping -c 2 -s 1000 -M do 192.168.1.254
PING 192.168.1.254 (192.168.1.254) 1000(1028) bytes of data.
1008 bytes from 192.168.1.254: icmp_seq=1 ttl=64 time=0.311 ms

如果有回應,那就是可以接受這個封包,如果無回應,那就表示這個 MTU 太大了。

[root@www ~]$ ping -c 2 -s 8000 -M do 192.168.1.254
PING 192.168.1.254 (192.168.1.254) 8000(8028) bytes of data.
From 192.168.1.100 icmp_seq=1 Frag needed and DF set (mtu = 1500)

這個錯誤訊息是說,本地端的 MTU 才到 1500 而已,你要偵測 8000 的 MTU 根本就是無法達成的!那要如何是好?用前一小節介紹的ip link來進行 MTU 設定吧!

不過,你需要知道的是,由於 IP 封包表頭 (不含 options) 就已經佔用了 20 bytes ,再加上 ICMP 的表頭有 8 bytes ,所以當然你在使用 -s size 的時候,那個封包的大小就得要先扣除 (20+8=28) 的大小了。 因此如果要使用 MTU 為 1500 時,就得要下達『 ping -s 1472 -M do xx.yy.zz.ip 』才行啊!

另外,由於本地端的網路卡 MTU 也會影響到偵測,所以如果想要偵測整個傳輸媒體的 MTU 數值, 那麼每個可以調整的主機就得要先使用 ifcofig 或 ip 先將 MTU 調大,然後再去進行偵測, 否則就會出現像上面提供的案例一樣,可能會出現錯誤訊息的!

不過這個 MTU 不要隨便調整啊!除非真的有問題。通常調整 MTU 的時間是在這個時候:

因為全部的主機群都是在內部的區網,例如叢集架構 (cluster) 的環境下, 由於內部的網路節點都是我們可以控制的,因此可以透過修改 MTU 來增進網路效能;

因為作業系統預設的 MTU 與你的網域不符,導致某些網站可以順利連線,某些網站則無法連線。 以 Windows 作業系統作為連線分享的主機時,在 Client 端挺容易發生這個問題;

如果是要連上 Internet 的主機,注意不要隨便調整 MTU ,因為我們無法知道 Internet 上面的每部機器能夠支援的 MTU 到多大,因為......不是我們能夠管的到的嘛 _! 另外,其實每種連線方式都有不同的 MTU 值,常見的各種介面的 MTU 值分別為︰

網路介面 MTU
Ethernet 1500
PPPoE 1492
Dial-up(Modem) 576

两部主机之间节点分析

两部主机之间节点的分析: traceroute

我們前面談到的指令大多數都是針對主機的網路參數設定所需要的,而 ping 是兩部主機之間的回聲與否判斷, 那麼有沒有指令可以追蹤兩部主機之間通過的各個節點 (node) 通訊狀況的好壞呢?

舉例來說,如果我們連線到 yahoo 的速度比平常慢,你覺得是:

(1)自己的網路環境有問題?

(2)還是外部的 Internet 有問題?

如果是 (1) 的話,我們當然需要檢查自己的網路環境啊,看看是否又有誰中毒了?但如果是 Internet 的問題呢?那只有『等等等』啊! 判斷是 (1) 還是 (2) 就得要使用 traceroute 這個指令啦!

[root@www ~]$ traceroute [選項與參數] IP

選項與參數:

  • -n :可以不必進行主機的名稱解析,單純用 IP ,速度較快!
  • -U :使用 UDP 的 port 33434 來進行偵測,這是預設的偵測協定;
  • -I :使用 ICMP 的方式來進行偵測;
  • -T :使用 TCP 來進行偵測,一般使用 port 80 測試
  • -w :若對方主機在幾秒鐘內沒有回聲就宣告不治...預設是 5 秒
  • -p 埠號:若不想使用 UDP 與 TCP 的預設埠號來偵測,可在此改變埠號。
  • -i 裝置:用在比較複雜的環境,如果你的網路介面很多很複雜時,才會用到這個參數; 舉例來說,你有兩條 ADSL 可以連接到外部,那你的主機會有兩個 ppp,你可以使用-i來選擇是 ppp0 還是 ppp1 啦!
  • -g 路由:與 -i 的參數相仿,只是 -g 後面接的是 gateway 的 IP 就是了。

检查本机到对方各节点的状态

範例一:偵測本機到 yahoo 去的各節點連線狀態

[root@www ~]$ traceroute -n tw.yahoo.com
traceroute to tw.yahoo.com (119.160.246.241), 30 hops max, 40 byte packets
 1  192.168.1.254  0.279 ms  0.156 ms  0.169 ms
 2  172.20.168.254  0.430 ms  0.513 ms  0.409 ms
 3  10.40.1.1  0.996 ms  0.890 ms  1.042 ms
 4  203.72.191.85  0.942 ms  0.969 ms  0.951 ms
 5  211.20.206.58  1.360 ms  1.379 ms  1.355 ms
 6  203.75.72.90  1.123 ms  0.988 ms  1.086 ms
 7  220.128.24.22  11.238 ms  11.179 ms  11.128 ms
 8  220.128.1.82  12.456 ms  12.327 ms  12.221 ms
 9  220.128.3.149  8.062 ms  8.058 ms  7.990 ms
10  * * *
11  119.160.240.1  10.688 ms  10.590 ms 119.160.240.3  10.047 ms
12  * * * <==可能有防火牆裝置等情況發生所致

這個 traceroute 挺有意思的,這個指令會針對欲連接的目的地之所有 node 進行 UDP 的逾時等待, 例如上面的例子當中,由鳥哥的主機連接到 Yahoo 時,他會經過 12 個節點以上,traceroute 會主動的對這 12 個節點做 UDP 的回聲等待,並偵測回覆的時間,每節點偵測三次,最終回傳像上頭顯示的結果。 你可以發現每個節點其實回覆的時間大約在 50 ms 以內,算是還可以的 Internet 環境了。

比較特殊的算是第 10/12 個,會回傳星號的,代表該 node 可能設有某些防護措施,讓我們發送的封包資訊被丟棄所致。 因為我們是直接透過路由器轉遞封包,並沒有進入路由器去取得路由器的使用資源,所以某些路由器僅支援封包轉遞, 並不會接受來自用戶端的各項偵測啦!此時就會出現上述的問題。因為 traceroute 預設使用 UDP 封包,如果你想嘗試使用其他封包, 那麼 -I 或 -T 可以試看看囉!

由於目前 UDP/ICMP 的攻擊層出不窮,因此很多路由器可能就此取消這兩個封包的回應功能。所以我們可以使用 TCP 來偵測呦! 例如使用同樣的方法,透過等待時間 1 秒,以及 TCP 80 埠口的情況下,可以這樣做:

[root@www ~]$ traceroute -w 1 -n -T tw.yahoo.com

nftables路由配置

Linux 3.13 带来了很多特性。nftables也是第一次正式发布。nftables是一个致力于替换现有的{ip,ip6,arp,eb}tables框架(也就是大家熟知的iptables)的项目。然而,Linux3.13中的nftables版本还是不完整的,还缺少一些重要的特性。这些特性会在后续的Linux版本中发布。大多数场景下nftables已经可以使用,但是完整的支持(即,nftables优先级高于iptables)应该在Linux 3.15。

nftables引入了一个新的命令行工具nft。nft是iptables及其衍生指令(ip6tables,arptables)的超集。同时,nft拥有完全不同的语法。是的,如果你习惯于iptables,这是个不好的消息。但是有一个兼容层允许你使用iptables,而过滤是由内核中的nftables完成的。

到目前为止,只有非常少的文档资料。你可以找到我的 nftables快速开始,其他的一些初步文档很快就会公开。

一些命令行例子

一行多个目标

加入你想用iptables记录并丢弃一个包,你必须写两条规则,一条记录,一条丢弃:

iptables -A FORWARD -p tcp --dport 22 -j LOG
iptables -A FORWARD -p tcp --dport 22 -j DROP

使用nft,你可以把两个目标合并到一起:

nft add rule filter forward tcp dport 22 log drop

方便创建集合

假如你想针对不同的端口允许包并且允许不同的icmpv6类型。使用iptables,你需要使用类似如下的规则:

ip6tables -A INPUT -p tcp -m multiport --dports 23,80,443 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT

使用nft,集合可以用在规则中任一元素:

nft add rule ip6 filter input tcp dport {telnet, http, https} accept
nft add rule ip6 filter input icmpv6 type { nd-neighbor-solicit, echo-request, nd-router-advert, nd-neighbor-advert } accept

这样更容易编写,而且对于过滤方更加高效,因为对每一种协议只需要添加一个规则。

你也可以给集合命名,以便在其他地方使用:

# nft -i # use interactive mode
nft> add set global ipv4_ad { type ipv4_address;}
nft> add element global ipv4_ad { 192.168.1.4, 192.168.1.5 }
nft> add rule ip global filter ip saddr @ipv4_ad drop

之后,当检测到一个新的破坏者时:

# nft -i
nft> add element global ipv4_ad { 192.168.3.4 }

映射

nftables的一个高级特性就是映射。可以使用不同类型的数据并映射它们。例如,我们可以映射网络端口到专用的规则集合(之前创建的存储在一个链中)。在这个例子中,链的名称为low_sec和high_sec:

# nft -i
nft> add map filter jump_map { type ifindex : verdict; }
nft> add element filter jump_map { eth0 : jump low_sec; }
nft> add element filter jump_map { eth1 : jump high_sec; }
nft> add rule filter input iif vmap @jump_map

现在,比如说你有一个新的动态端口ppp1,对它做过滤非常简单,仅仅把它加到jump_map映射中就可以了。

nft> add element filter jump_map { ppp1 : jump low_sec; }

运维和内核方面

更新速度更快

在iptables中添加一条规则,会随着规则数量增多而变得非常慢,这也就解释了为什么调用iptables的脚本需要花很久才完成。这种状况对nftables而言就不存在了。nftables使用原子的快速操作来更新规则集合。

内核更新更少

使用iptables,每一个匹配或投递都需要内核模块的支持。因此,如果你忘记一些东西或者要添加新的功能时都需要重新编译内核。nftables就不存在这种状况了。在nftables中,大部分工作是在用户态完成的,内核只知道一些基本指令(过滤是用伪状态机实现的)。例如,icmpv6支持是通过nft工具的一个简单的补丁实现的。在iptables中这种类型的更改需要内核和iptables都升级才可以。