はじめに
Linuxだとipコマンドだけど、FreeBSDはifconfigが現役。
「古い」って言われるけど、FreeBSDのifconfigはLinuxのip以上に高機能だったりする。
今回はFreeBSDのネットワーク設定を完全解説。
インターフェース確認
ifconfig
ifconfig
em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=4e527bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,WOL_UCAST,WOL_MCAST,WOL_MAGIC,VLAN_HWFILTER,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6>
ether 00:11:22:33:44:55
inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255
inet6 fe80::211:22ff:fe33:4455%em0 prefixlen 64 scopeid 0x1
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
inet 127.0.0.1 netmask 0xff000000
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
特定インターフェースだけ
ifconfig em0
シンプル表示
ifconfig -l # インターフェース名一覧
# em0 lo0 bridge0
ifconfig -u # UPしてるものだけ
IPアドレス設定
静的IP
# 一時的に設定
ifconfig em0 inet 192.168.1.100 netmask 255.255.255.0
# または CIDR表記
ifconfig em0 inet 192.168.1.100/24
# ブロードキャストも指定
ifconfig em0 inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
永続設定(/etc/rc.conf)
# /etc/rc.conf
ifconfig_em0="inet 192.168.1.100 netmask 255.255.255.0"
defaultrouter="192.168.1.1"
# sysrcで設定(推奨)
sysrc ifconfig_em0="inet 192.168.1.100 netmask 255.255.255.0"
sysrc defaultrouter="192.168.1.1"
DHCP
# /etc/rc.conf
ifconfig_em0="DHCP"
sysrc ifconfig_em0="DHCP"
IPv6
# 静的
ifconfig em0 inet6 2001:db8::100 prefixlen 64
# SLAAC(自動設定)
sysrc ifconfig_em0_ipv6="inet6 accept_rtadv"
sysrc rtsold_enable="YES"
複数IPアドレス(エイリアス)
# 一時的
ifconfig em0 alias 192.168.1.101/24
# 永続
sysrc ifconfig_em0_alias0="inet 192.168.1.101 netmask 255.255.255.255"
sysrc ifconfig_em0_alias1="inet 192.168.1.102 netmask 255.255.255.255"
ルーティング
ルーティングテーブル確認
netstat -rn
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 192.168.1.1 UGS em0
127.0.0.1 link#2 UH lo0
192.168.1.0/24 link#1 U em0
192.168.1.100 link#1 UHS lo0
Internet6:
Destination Gateway Flags Netif Expire
::1 link#2 UHS lo0
fe80::%em0/64 link#1 U em0
fe80::1%lo0 link#2 UHS lo0
デフォルトゲートウェイ
# 一時的
route add default 192.168.1.1
# 永続
sysrc defaultrouter="192.168.1.1"
静的ルート追加
# 一時的
route add -net 10.0.0.0/8 192.168.1.254
# 永続
sysrc static_routes="internal"
sysrc route_internal="-net 10.0.0.0/8 192.168.1.254"
ルート削除
route delete default
route delete -net 10.0.0.0/8
DNS設定
# /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
search example.com
DHCPの場合は自動設定される。上書きされたくなければ:
# /etc/dhclient.conf
supersede domain-name-servers 8.8.8.8, 8.8.4.4;
ホスト名
# 確認
hostname
# freebsd.example.com
# 一時変更
hostname newname.example.com
# 永続設定
sysrc hostname="newname.example.com"
ブリッジ
作成
# インターフェース作成
ifconfig bridge0 create
# メンバー追加
ifconfig bridge0 addm em0 addm em1
# UP
ifconfig bridge0 up
# IPアドレスを設定(オプション)
ifconfig bridge0 inet 192.168.1.100/24
永続設定
sysrc cloned_interfaces="bridge0"
sysrc ifconfig_bridge0="addm em0 addm em1 up"
sysrc ifconfig_bridge0_alias0="inet 192.168.1.100/24"
VLAN
# VLAN 100を作成
ifconfig vlan100 create
# 親インターフェースとVLAN IDを設定
ifconfig vlan100 vlan 100 vlandev em0
# IPアドレス設定
ifconfig vlan100 inet 192.168.100.1/24
# UP
ifconfig vlan100 up
永続設定
sysrc vlans_em0="100 200"
sysrc ifconfig_vlan100="inet 192.168.100.1/24"
sysrc ifconfig_vlan200="inet 192.168.200.1/24"
LAGG(リンクアグリゲーション)
# LAGGインターフェース作成
ifconfig lagg0 create
# LAGGプロトコル設定(LACP)
ifconfig lagg0 laggproto lacp
# メンバー追加
ifconfig lagg0 laggport em0 laggport em1
# IPアドレス
ifconfig lagg0 inet 192.168.1.100/24
# UP
ifconfig lagg0 up
永続設定
sysrc cloned_interfaces="lagg0"
sysrc ifconfig_em0="up"
sysrc ifconfig_em1="up"
sysrc ifconfig_lagg0="laggproto lacp laggport em0 laggport em1 192.168.1.100/24"
netstatで状態確認
接続中のソケット
netstat -an
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 *.22 *.* LISTEN
tcp4 0 0 192.168.1.100.22 192.168.1.50.52342 ESTABLISHED
tcp4 0 0 *.80 *.* LISTEN
udp4 0 0 *.68 *.*
特定ポートだけ
netstat -an | grep ':22'
プロセス情報付き
sockstat -l # LISTENしてるもの
sockstat -4 # IPv4のみ
sockstat -c # 接続中のみ
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sshd 1234 4 tcp4 *:22 *:*
www nginx 5678 6 tcp4 *:80 *:*
インターフェース統計
netstat -i
Name Mtu Network Address Ipkts Ierrs Idrop Opkts Oerrs Coll
em0 1500 <Link#1> 00:11:22:33:44:55 12345678 0 0 9876543 0 0
em0 - 192.168.1.0 192.168.1.100 12345678 - - 9876543 - -
lo0 16384 <Link#2> lo0 12345 0 0 12345 0 0
lo0 - localhost lo0 12345 - - 12345 - -
プロトコル統計
netstat -s -p tcp # TCP統計
netstat -s -p udp # UDP統計
netstat -s -p icmp # ICMP統計
カーネルパラメータ(sysctl)
よく使う設定
# IP転送(ルーターにする)
sysctl net.inet.ip.forwarding=1
# 永続化
sysrc gateway_enable="YES"
# TCP最適化
sysctl net.inet.tcp.recvspace=65536
sysctl net.inet.tcp.sendspace=65536
# TCP keepalive
sysctl net.inet.tcp.keepidle=600000
sysctl net.inet.tcp.keepintvl=30000
# SYN cookie(DoS対策)
sysctl net.inet.tcp.syncookies=1
永続化(/etc/sysctl.conf)
# /etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet.tcp.recvspace=65536
net.inet.tcp.sendspace=65536
トラブルシューティング
pingが通らない
# 基本確認
ping 8.8.8.8
# インターフェース確認
ifconfig em0
# ルート確認
netstat -rn
# ARPテーブル確認
arp -an
# ファイアウォール確認
pfctl -sr
DNSが引けない
# resolv.conf確認
cat /etc/resolv.conf
# 直接問い合わせ
drill @8.8.8.8 google.com
# または
host google.com 8.8.8.8
パケットキャプチャ
tcpdump -i em0 -n
tcpdump -i em0 -n port 80
tcpdump -i em0 -n host 192.168.1.50
tcpdump -i em0 -n -w capture.pcap
まとめ
FreeBSDのネットワーク設定:
- ifconfig: インターフェース設定
- route: ルーティング設定
- netstat/sockstat: 状態確認
- /etc/rc.conf + sysrc: 永続設定
Linuxのipコマンドよりifconfigの方が直感的だと思うのは俺だけ?
この記事が役に立ったら、いいね・ストックしてもらえると嬉しいです!