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都升级才可以。