Anh em DevOps/NetDevOps hay “đau tim” vì container lên rồi mà port không mở, NAT không chạy, route mất…? Đây là “sổ tay thực chiến” Linux Networking dành cho môi trường Docker và server production: ngắn gọn, đúng ý, giữ nguyên chi tiết kỹ thuật để anh em dán vào là chạy.
1) Firewall Linux: iptables (và bối cảnh Docker)
iptables quản lý tường lửa L3/L4 cho IPv4/IPv6, hỗ trợ cả stateless và stateful filtering, kèm NAT/PAT — chính là những gì Docker dựa vào để làm SNAT/masquerade cho bridge mạng.
Ví dụ list rule:
iptables --list -v -n
Một số chain cần nắm khi host có Docker:
Đoạn rule mẫu bạn có thể thấy:
Chain FORWARD (policy DROP) ACCEPT ... ctstate RELATED,ESTABLISHED DOCKER ... ACCEPT ...
Ý nghĩa thực chiến:
Ví dụ khóa chặt inbound vào container, chỉ cho phép subnet quản trị 172.17.70.0/24 truy cập các port đã publish:
iptables -I DOCKER-USER -s 172.17.70.0/24 -j RETURN iptables -A DOCKER-USER -j DROP
Giới hạn SSH vào host (rate-limit) để chống brute force:
iptables -I INPUT -p tcp --dport 22 -m state --state NEW \ -m hashlimit --hashlimit-name ssh --hashlimit 3/min --hashlimit-burst 5 \ --hashlimit-mode srcip --hashlimit-upto 3/min -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
NAT/masquerade cơ bản (nếu bạn tự cấu hình, không để Docker lo):
iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! -d 172.18.0.0/16 -j MASQUERADE
Lưu ý nền tảng:
2) Mở dịch vụ: ss và netstat
ss là công cụ hiện đại thay cho netstat, hiển thị nhanh, chi tiết:
# TCP đang listen ss -lnt # UDP đang listen ss -lun # Tiến trình gắn với socket ss -lntp ss -ap # tất cả, kèm process # Thống kê socket ss -s
So sánh nhanh:
Khi debug “sao app nghe 0.0.0.0:80 mà outside vẫn không vào được?”:
3) Lặp lại quan sát: watch
Theo dõi counters, socket, interface mỗi 2 giây:
watch -n2 'netstat -i' watch -n2 'ss -s' watch -n1 "iptables -L -v -n | sed -n '1,40p'"
Mẹo: dùng ' ' để giữ nguyên lệnh con, thêm sed/awk lọc phần cần xem, tránh flood màn hình.
4) Cấu hình Interface & Routing (Ubuntu/Debian & RHEL/CentOS/Fedora)
Quan trọng:
Ví dụ cấu hình IP tĩnh + route:
# /etc/netplan/01-eth0.yaml network: version: 2 ethernets: eth0: addresses: [172.17.70.56/24] routes: - to: 10.0.0.0/8 via: 172.17.70.1 - to: 1.1.1.1/32 via: 172.17.70.1 nameservers: addresses: [1.0.0.1,1.1.1.1,8.8.4.4]
Áp dụng:
netplan generate netplan apply Ubuntu legacy (/etc/network/interfaces)
auto eth0 iface eth0 inet static address 172.17.70.56 netmask 255.255.255.0 gateway 172.17.70.1 up route add -net 10.0.0.0 netmask 255.0.0.0 gw 172.17.70.1 up route add -net 1.1.1.1 netmask 255.255.255.255 gw 172.17.70.1
Khởi động lại dịch vụ mạng (xem mục 5). RHEL/CentOS/Fedora (NetworkManager)
File ifcfg-eth0 tối thiểu:
# /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none ONBOOT=yes IPADDR=172.17.70.56 PREFIX=24 GATEWAY=172.17.70.1 DNS1=1.0.0.1 DNS2=1.1.1.1 DNS3=8.8.4.4
Thêm static route qua route-eth0:
# /etc/sysconfig/network-scripts/route-eth0 10.0.0.0/8 via 172.17.70.1 1.1.1.1/32 via 172.17.70.1
Hoặc dùng nmcli:
nmcli con add type ethernet ifname eth0 con-name eth0 ipv4.method manual \ ipv4.addresses 172.17.70.56/24 ipv4.gateway 172.17.70.1 \ ipv4.dns "1.0.0.1 1.1.1.1 8.8.4.4" autoconnect yes nmcli con mod eth0 +ipv4.routes "10.0.0.0/8 172.17.70.1" nmcli con mod eth0 +ipv4.routes "1.1.1.1/32 172.17.70.1" nmcli con up eth0
5) Khởi động lại dịch vụ mạng
Tùy distro và service manager:
# Debian/Ubuntu legacy /etc/init.d/networking restart service networking restart # systemd chung systemctl restart networking # Netplan (Ubuntu mới) netplan apply # NetworkManager (nhiều distro) systemctl restart NetworkManager nmcli networking off && nmcli networking on
Tip: với server remote, luôn chuẩn bị console hoặc window thứ hai để rollback khi thay đổi mạng.
6) Best Practices gọn mà “thốn” (theo kinh nghiệm triển khai)
7) Mini checklist khi “dịch vụ không vào được”
1) Firewall Linux: iptables (và bối cảnh Docker)
iptables quản lý tường lửa L3/L4 cho IPv4/IPv6, hỗ trợ cả stateless và stateful filtering, kèm NAT/PAT — chính là những gì Docker dựa vào để làm SNAT/masquerade cho bridge mạng.
Ví dụ list rule:
iptables --list -v -n
Một số chain cần nắm khi host có Docker:
- INPUT: traffic vào chính host.
- OUTPUT: traffic từ host ra ngoài.
- FORWARD: traffic “đi xuyên” host (ví dụ từ một container sang mạng khác).
- DOCKER: Docker tự quản các DNAT/masquerade cho container.
- DOCKER-USER: chỗ duy nhất bạn nên đặt policy tùy biến trước khi traffic rơi vào chain DOCKER (ưu tiên kiểm soát của bạn).
- DOCKER-ISOLATION-STAGE-1/2: tách biệt giữa các bridge mạng do Docker tạo.
Đoạn rule mẫu bạn có thể thấy:
Chain FORWARD (policy DROP) ACCEPT ... ctstate RELATED,ESTABLISHED DOCKER ... ACCEPT ...
Ý nghĩa thực chiến:
- Mặc định FORWARD có thể DROP, Docker sẽ thêm rule cho phép các flow cần thiết.
- Chain DOCKER-USER là nơi bạn whitelist/blacklist hoặc giới hạn truy cập theo subnet, theo port, trước khi Docker can thiệp.
Ví dụ khóa chặt inbound vào container, chỉ cho phép subnet quản trị 172.17.70.0/24 truy cập các port đã publish:
iptables -I DOCKER-USER -s 172.17.70.0/24 -j RETURN iptables -A DOCKER-USER -j DROP
Giới hạn SSH vào host (rate-limit) để chống brute force:
iptables -I INPUT -p tcp --dport 22 -m state --state NEW \ -m hashlimit --hashlimit-name ssh --hashlimit 3/min --hashlimit-burst 5 \ --hashlimit-mode srcip --hashlimit-upto 3/min -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
NAT/masquerade cơ bản (nếu bạn tự cấu hình, không để Docker lo):
iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! -d 172.18.0.0/16 -j MASQUERADE
Lưu ý nền tảng:
- Distro mới dùng nftables làm backend; iptables có thể là wrapper.
- RHEL/CentOS/Fedora thường có firewalld; Ubuntu hay dùng ufw. Chọn một lớp kiểm soát chính để tránh xung đột.
- Muốn persist rules sau reboot: iptables-save / iptables-persistent (Debian/Ubuntu) hoặc cấu hình qua firewalld/nftables.
2) Mở dịch vụ: ss và netstat
ss là công cụ hiện đại thay cho netstat, hiển thị nhanh, chi tiết:
# TCP đang listen ss -lnt # UDP đang listen ss -lun # Tiến trình gắn với socket ss -lntp ss -ap # tất cả, kèm process # Thống kê socket ss -s
So sánh nhanh:
- ss ra kết quả tức thì, nhiều trường (Recv-Q/Send-Q, state, peer).
- netstat -at vẫn dùng được ở môi trường cũ, nhưng nên chuyển dần sang ss.
Khi debug “sao app nghe 0.0.0.0:80 mà outside vẫn không vào được?”:
- ss -lntp xác nhận process có LISTEN trên đúng IP/port.
- iptables -S hoặc iptables -L -n -v kiểm tra rule không chặn.
- ip addr xác thực địa chỉ/VRF.
- Kiểm tra route/NAT (mục 4).
3) Lặp lại quan sát: watch
Theo dõi counters, socket, interface mỗi 2 giây:
watch -n2 'netstat -i' watch -n2 'ss -s' watch -n1 "iptables -L -v -n | sed -n '1,40p'"
Mẹo: dùng ' ' để giữ nguyên lệnh con, thêm sed/awk lọc phần cần xem, tránh flood màn hình.
4) Cấu hình Interface & Routing (Ubuntu/Debian & RHEL/CentOS/Fedora)
Quan trọng:
- Ubuntu hiện đại dùng Netplan (/etc/netplan/*.yaml) + systemd-networkd hoặc NetworkManager.
- File /etc/network/interfaces là legacy (vẫn gặp trên bản cũ/LTS nâng cấp).
- RHEL/CentOS dùng NetworkManager với file ifcfg-* hoặc cấu hình qua nmcli.
Ví dụ cấu hình IP tĩnh + route:
# /etc/netplan/01-eth0.yaml network: version: 2 ethernets: eth0: addresses: [172.17.70.56/24] routes: - to: 10.0.0.0/8 via: 172.17.70.1 - to: 1.1.1.1/32 via: 172.17.70.1 nameservers: addresses: [1.0.0.1,1.1.1.1,8.8.4.4]
Áp dụng:
netplan generate netplan apply Ubuntu legacy (/etc/network/interfaces)
auto eth0 iface eth0 inet static address 172.17.70.56 netmask 255.255.255.0 gateway 172.17.70.1 up route add -net 10.0.0.0 netmask 255.0.0.0 gw 172.17.70.1 up route add -net 1.1.1.1 netmask 255.255.255.255 gw 172.17.70.1
Khởi động lại dịch vụ mạng (xem mục 5). RHEL/CentOS/Fedora (NetworkManager)
File ifcfg-eth0 tối thiểu:
# /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none ONBOOT=yes IPADDR=172.17.70.56 PREFIX=24 GATEWAY=172.17.70.1 DNS1=1.0.0.1 DNS2=1.1.1.1 DNS3=8.8.4.4
Thêm static route qua route-eth0:
# /etc/sysconfig/network-scripts/route-eth0 10.0.0.0/8 via 172.17.70.1 1.1.1.1/32 via 172.17.70.1
Hoặc dùng nmcli:
nmcli con add type ethernet ifname eth0 con-name eth0 ipv4.method manual \ ipv4.addresses 172.17.70.56/24 ipv4.gateway 172.17.70.1 \ ipv4.dns "1.0.0.1 1.1.1.1 8.8.4.4" autoconnect yes nmcli con mod eth0 +ipv4.routes "10.0.0.0/8 172.17.70.1" nmcli con mod eth0 +ipv4.routes "1.1.1.1/32 172.17.70.1" nmcli con up eth0
5) Khởi động lại dịch vụ mạng
Tùy distro và service manager:
# Debian/Ubuntu legacy /etc/init.d/networking restart service networking restart # systemd chung systemctl restart networking # Netplan (Ubuntu mới) netplan apply # NetworkManager (nhiều distro) systemctl restart NetworkManager nmcli networking off && nmcli networking on
Tip: với server remote, luôn chuẩn bị console hoặc window thứ hai để rollback khi thay đổi mạng.
6) Best Practices gọn mà “thốn” (theo kinh nghiệm triển khai)
- Default-deny inbound: đặt INPUT DROP, sau đó allowlist từng port/dịch vụ thật sự cần.
- Tách lớp kiểm soát: chọn một trong iptables/nftables/firewalld/ufw làm “source of truth”.
- Đặt rule vào DOCKER-USER để kiểm soát traffic container trước khi Docker thêm rule động.
- Bảo vệ SSH: rate-limit + chỉ mở cho subnet quản trị, cân nhắc PortKnocking/Fail2ban/MFA.
- Quan sát liên tục: watch, ss -s, conntrack -S (nếu dùng stateful), iftop/nload khi cần.
- Persist cấu hình: netplan/nmcli (network), iptables-persistent hoặc nftables.conf (firewall).
- Tài liệu hoá: commit file YAML/ifcfg/rule vào repo IaC (Ansible/Terraform + Molecule/Testinfra/pyATS pre/post-check).
7) Mini checklist khi “dịch vụ không vào được”
- ss -lntp — app có LISTEN đúng IP/port?
- iptables -L -n -v — có rule chặn hoặc thiếu RELATED,ESTABLISHED?
- ip addr / ip route — IP/route đúng? default gateway?
- Nếu qua Docker: port published chưa (-p host:container), network bridge đúng, DOCKER-USER có chặn không?
- NAT ok chưa (POSTROUTING MASQUERADE)? đường về (return route) phía upstream?
- Kiểm tra DNS (nhiều app “chết đứng” vì name resolution).