贡献者: addis
sudo ifconfig
显示网卡(network interface card, NIC, 也简称 interface)信息,以及 ip 地址(输出中的 inet addr)
ip -4 addr show scope global
也可以。ifconfig
现在已经有点过时了(但仍然很多人和教材在用),可以用 ip
代替。
curl -4 ifconfig.me
其中 -4
强制返回 ipv4,否则可能返回 ipv6
ping
使用的 icmp 协议)
ip route show | grep default
找默认网卡,默认网卡几乎肯定是公网网卡。
default via 10.150.0.1 dev wlo1 proto dhcp metric 600
10.150.0.0/17 dev wlo1 proto kernel scope link src
(不换行) 10.150.61.141 metric 600
169.254.0.0/16 dev enp3s0 scope link metric 1000
192.168.137.0/24 dev enp3s0 proto kernel scope link src
(不换行)192.168.137.1 metric 100
via 10.150.0.1
是网关 ip,dev wlo1
是说该网卡的名字是 wlo1
这样的名字一般是 wifi 网卡。
proto dhcp
是说当前这行是通过 dhcp 协议自动配置的
metric 600
是优先级,越低越优先。
proto
其他可能的结果:static
(使用 ip route add
手动添加的), kernel
(Linux 内核自动配置的), boot
system boot process 配置的(常见于老 Linux)。
scope link
表示该行适用于 link layer,也就是第二层,MAC 地址工作的 layer,在第三层 ip (network layer) 的下一层。第一层是物理层。也就是说该条规则只适用于直接和本网卡相连的 ip(也包括通过交换机相连)。
169.254.0.0/16
是专用于 link-local ip 地址。插入局域网时如果没有找到 DHCP 就会自动配置,而 192.168.137.0/24
子网是手动配置的,也就是说 enp3s0
这个网卡有两个 ip 和子网,通常不会冲突,使用时无视自动配置的即可,删掉也没什么关系:sudo ip route del 169.254.0.0/16 dev enp3s0
。
enp3s0
这个名字符合 Predictable Network Interface Names,en
表示 ethernet,p3
是 bus number,s0
是 slot number。
169.254...
这行没有 src
指定该网卡的 ip。这是因为用了 ZEROCONF route。
ifconfig 网卡名 up
启动网卡,ifconfig 网卡名 down
关闭网卡,可以用这两个命令重启网卡(要防止 ssh 被中断,两个命令用分号写到一行)
ifoncig
用于查看网络相关信息:其中 Link encap:Ethernet
表示在使用 Ethernet,HWaddr
是硬件地址,即 MAC 地址,inet addr
网卡的 IP 地址,Bcast
broadcast 地址,Mask
掩码,UP
表示 Ethernet 的 kernel module 被加载,BROADCAST
支持 broadcasting,从 DHCP 获取 IP 的必要条件,RUNNING
准备好传输数据,mtu
(Maximum Transmission Unit),就是 packet 的最大尺寸
netplan
是 ubuntu 18.04 的默认管理网络设置的程序,比如设置 DHCP,静态 ip,掩码,网关等,设置完成以后用 sudo netplan apply
可以生效。但有时候还需要重启网卡才能成功。
ip -4 addr show scope global
返回的 valid_lft
和 preferred_lft
不是 forever
,那(理论上)这个 ip 就可能会变化。但实际上不常改变。
sudo hpclient
显示 ip 地址
sudo /etc/init.d/networking restart
重启网络服务
wget http://...
文件会下载到当前文件夹
ping
可以用来检查是否有网络连接,比如 ping google.com
也可以用来查看某个域名的 ip 地址,也可以直接使用 ip 地址如 ping 8.8.8.8
(8.8.8.8 是谷歌的主要 DNS 服务器)
ping 域名
和 host 域名
都可以检查域名的 ip
telnet IP 端口号
。一般来说我们说的端口是 TCP 中的概念,telnet
只支持 TCP 不支持 UDP。如果有任何进程在监听该端口且网络没有问题,那么就会现实 connected
。如果卡在 Trying xxx.xxx.xxx.xxx...
上,就是无法建立连接(如果 ping 可以 telnet 不行,多半是 GFW 屏蔽了某个端口)。这有别与 connection refused
,后者说明这个端口没有被监听(也叫做端口关闭)。
telnet
是一个远程命令行,也像 ssh
一样有一个服务监听一个特定的端口。但因为不安全,已经被 ssh
代替。
telnet
,也可以用 nc -v <ip> <port>
(netcat)或者 nmap -p <port> <ip>
测试 tcp 连接。
nmap
也被用于测试某个接口是否开启,以及是否在使用某个 app(如 ssh, ftp, 等)
nmap
还可以用于扫描局域网中有哪些机器如 nmap -sn 192.168.1.0/24
也可以用 sudo arp-scan --localnet
,arp -a
或者 ping 广播 ping -b 192.168.1.255
。
whois 66.220.156.68 | grep CIDR
输出如 CIDR: 66.220.144.0/20
traceroute 域名或者ip
可以查看从当前机器出发到某个机器所经过的网关的 ip(有些会隐藏)。例如局域网里面的某台机器 traceroute 到外网的某个网址,那么第一条显示的是当前局域网的网关(用于该局域网的网卡)的 ip,如果该网关仍然没有处于公网,那么第二条会显示第一条中网关所在的另一个局域网的网关的 ip……直到公网 ip,然后各种互联网上的公网 ip,最终达到网址的服务器的 ip。注意每条中只会显示进入某个机器所用网卡的 ip,不会显示出去时所用网卡的 ip。
cat /sys/class/net/enp5s0/speed
可以查看以太网的连接速度(即是否是 Gigabit。在 GUI 的网络设置里面也可以看到)
iperf3
可以测试网络中两个主机之间的网速,参考这个教程。不过貌似比较麻烦,倒不如用 sftp,一般不需要安装额外东西。
ethtool eth0
可以查看网卡 eth0
的详细信息。
bind9
可以在 LAN 中设置 DNS 服务器。
ip a
(或者 ip addr
)输出的的一个例子如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state
UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
fq_codel state UP group default qlen 1000
link/ether d8:bb:c1:17:da:ca brd ff:ff:ff:ff:ff:ff
inet 192.168.137.1/24 brd 192.168.137.255 scope global
noprefixroute enp3s0
valid_lft forever preferred_lft forever
inet6 fe80::dabb:c1ff:fe17:daca/64 scope link
valid_lft forever preferred_lft forever
3: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
noqueue state UP group default qlen 1000
link/ether 14:18:c3:7f:91:85 brd ff:ff:ff:ff:ff:ff
altname wlp0s20f3
inet 10.150.61.141/17 brd 10.150.127.255 scope global
dynamic noprefixroute wlo1
valid_lft 66898sec preferred_lft 66898sec
inet6 fe80::e7b9:9ec8:8534:38d2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
enp3s0
,en
表示 ethernet,p3
,s0
表示某些编号。
LOWER_UP
表示网线已经插入,已经连接到网络。
LOOPBACK
表示 loop back(例如 localhost 127.0.0.1)
qlen
:default transmit queue length。
inet
ipv4 地址,inet6
ipv6 地址
sudo vim /etc/sysctl.conf
# 添加如下几行
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
# 保存然后
sudo sysctl -p
# 验证(无返回就是关闭了)
ip a | grep inet6
brd
广播(broadcast)地址
mtu
maximum transmission unit(ethernet 都是 1500 字节)
valid_lft
:valid life time
preferred_lft
:preferred life time
qdisc
:queuing discipline。也就是排队的算法,noqueque
是说没有队列。
state
是网卡的状态,它的值可以是 UP, DOWN, UNKNOWN
,如果开启以后没有连接,会显示 UNKNOWN
。
iptables
是一个命令行防火墙,它不是一个 service 而是个命令,所以不能 turn on/off。它直接跟 Linux 内核的 netfilter 打交道,在开机时、用户直接输入相关命令时,或者被其他服务如 ufw
调用时才会跟跟内核沟通。
sudo ufw disable
(立即取消通过 ufw 设置的所有规则,且重启后不自动开启),sudo ufw enable
(马上恢复之前设置的 ufw 规则,且开机自动开启)。
sudo systemctl restart ufw
sudo ufw status numbered
可以看到当前的 ufw 规则。numbered
用于显示编号便于删除。
ufw
的命令行设置都会立即生效,但如果改变了设置文件,要用 sudo ufw reload
才能立即生效。
sudo ufw delete 1
删除第 1 条规则。
sudo ufw default allow
允许一切流入和流出通信,除非被别的规则禁止(这是最省心的做法,但注意安全)
sudo ufw default deny
允许一切流出,但禁止一切流入,除非被别的规则允许
sudo ufw status verbose numbered
可以看到所有设置包括默认行为
sudo ufw allow 22/tcp
,这等效于 sudo ufw allow from any to any port 22 proto tcp
允许任何来源对端口 22 进行 tcp 协议访问。
sudo ufw allow out 22/tcp
要不然只进不出 ssh 也连不上!
sudo ufw reset
重置所有 ufw 规则。一般默认:Default: deny (incoming), allow (outgoing), allow (routed)
。
/etc/ufw/
常用的有 ufw.conf
,before.rules
,after.rules
。另外还有 /etc/default/ufw
/var/log/ufw.log
iptables-persistent
也能让 iptable 重启后保留设置。安装 sudo apt install iptables-persistent
。安装过程中会把当前的所有 rule 保存到设置文件 /etc/iptables/rules.v4
和 v6
里面,对应 ipv4 和 ipv6。然后为了安全期间可以复制一个备份 rules.v4.backup
sudo iptables-save -f /etc/iptables/rules.v4
把修改后的规则保存到设置文件中。这样重启以后会自动按照配置文件设置。
FILTER
,NAT
,MANGLE
,每种又有不同的 chain,例如 INPUT
,OUTPUT
,FORWARD
, PREROUTING
,POSTROUTING
等。
sudo iptables -L -n -v
-t
,如 sudo iptables -t nat -L -n -v
sudo iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP
。
-A
就是添加一个规则,如果改成 -D
就是删除该规则。
sudo iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP
sudo iptables -A OUTPUT -p tcp --dport xxx -j DROP
sudo iptables -A INPUT -p tcp --dport xxx -j ACCEPT
sudo iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
。
--dports 5000:5005
。
sudo iptables -A OUTPUT -p tcp -m multiport --sports 22,80,443 -j ACCEPT
.
sudo iptables -A INPUT或OUTPUT -p tcp -m multiport --sports 1:65535 -j ACCEPT
。
host facebook.com
,whois 66.220.156.68 | grep CIDR
,例如得到 66.220.144.0/20
,那么 sudo iptables -A OUTPUT -p tcp -d 66.220.144.0/20 -j DROP
-i 网卡名
。
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525
就是网卡 eth0, 从端口 25 到端口 2525
sudo iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP
iperf
可以用于测试网速
sudo lsof -i -P -n | grep LISTEN
可以查看哪些端口被占用。lsof
意思是 list opened files。
/etc/hostname
修改 hostname,重启即可
NAT network
满足要求,但不能从 host 连接虚拟机,而 bridged networking
可以
Not attached
模式,guest 会有一张网卡,但是没有连接 cable
NAT (Network Address Translation)
模式,新建虚拟机默认使用这个,guest 可以连接 internet,但是外部不能访问 guest(例如 guest 上的 web server),包括 host
NAT network
模式:需要的就是这个,目前用得是这个 类似于用 router 将虚拟机连起来,并连互联网,host 连不连暂时无所谓。在选择这个之前需要在 File->Preference 菜单中的 Network 中新建一个网卡(直接按+按钮即可,无需设置),然后在对每个虚拟机的 NAT network
设置里面选这个网卡。
netplan
(ubuntu 18) 或者 ifupdown
(old ubuntu),可以参考这里
cd /etc/netplan/
,里面可以手动指定当前机器的 ip 地址
sudo cp 50-cloud-init.yaml 50-cloud-init.yaml.backup
enp0s3
是 ifconfig 的连接名)
network:
version: 2
ethernets:
enp0s3:
dhcp4: false
addresses: [10.0.2.4/24]
renderer: NetworkManager
sudo netplan try
,然后 ifconfig
看一下 ip 是否变为指定 ip。如果有什么问题,两分钟后会自动恢复原来的设置。(据说恢复时有一个 bug,并不能恢复,需要重启才可以)
sudo netplan apply
使配置生效
apt update
可不可以连接外网
sudo ifconfig enp0s3 down; sudo ifconfig enp0s3 up
重启网卡即可(如果通过 ssh 链接,一定不能拆开使用,否则会断开链接)。
sudo arp-scan -l --interface=网卡名
其中 网卡名
就是 ifconfig
里面显示的。
renderer
):systemd-networkd
和 NetworkManager
。如果不指定,默认是前者,此时 Ubuntu 桌面右上角的网络设置中将会显示 unmanaged
。
/etc/network/interfaces
,如果要切换回后者,见这个教程。
/run/netplan
,/etc/netplan
,/lib/netplan
,一般来说默认文件是 /etc/netplan/01-network-manager-all.yaml
,内容是
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
其中 renderer
的另一个选项是 networkd
(如果不指定就默认这个)。桌面版还是建议用 NetworkManager,因为 GUI 网络设置就是用的这个,可以查看各种信息。
gateway4 xxx.xxx.xxx.xxx
已经过时了,应该用 routes: [{to: default, via: xxx.xxx.xxx.xxx}]
。
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
enp5s0:
dhcp4: false
addresses: [192.168.137.183/24]
routes:
- to: default
via: 192.168.137.214
nameservers:
addresses: [10.130.30.52, 10.130.30.53]
nameservers
的 ip 可以设置为常用的 8.8.8.8
等,但笔者的校园网禁止访问公共 DNS,所以笔者在 LAN 的网关电脑上查到了两个校园网提供的 DNS 地址并填入。
ip a
(即 ip address
)
sudo ip address add 192.168.137.10/255.255.255.0 dev enp3s0
(en
表示 ethernet,p3
表示 bus number,s10
表示 slot number)
ip link set dev eth0 up
,ip link set dev eth0 down
ip route show
或者 route -n
可以查看路由表。前者可以看到 DHCP 服务器的位置
ip route add 192.168.1.0/255.255.255.0 via 192.168.1.1
ip route add default via 192.168.1.1 dev eth0
arp -a
查看 ARP(由 ip 获取 mac 地址的协议)缓存
netstat -napt
可以查看 tcp 连接状态
NAT
的原理大概就是把不同内网的 ip 地址 + 端口(socket)映射到某个(例如学校的)公网 ip 地址和不同的端口,并在链接建立以后把后者的端口回传给前者的端口
/etc/ufw/sysctl.conf
中取消注释 net.ipv4.ip_forward=1
或者 net/ipv4/ip_forward=1
(/
和 .
是等效的).
/etc/default/ufw
中设置 DEFAULT_FORWARD_POLICY="ACCEPT"
/etc/ufw/before.rules
中在 *filter
之前添加如下几行:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o 链接互联网的网卡名如wlo1或enp3s0 -j MASQUERADE
COMMIT
sudo ufw enable
,sudo systemctl restart ufw
。用 sudo ufw reload
使设置文件生效。注意如果 disable 的话,就访问不了外网了。
/etc/sysctl.conf
中,net.ipv4.ip_forward=1
取消注释
sudo sysctl -p
使其生效
wlo1
,连局域网的网卡为 eth0
sudo iptables -t nat -A POSTROUTING -o wlo1 -j MASQUERADE
sudo iptables -A FORWARD -i wlo1 -o eth0 -m state \
--state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o wlo1 -j ACCEPT
sudo apt-get install iptables-persistent
sudo netfilter-persistent save