Cấu hình firewall IP V6 trên Linux VPS
IPv6 là phiên bản mới nhất của giao thức IP mà toàn bộ internet dựa vào để kết nối với nhau, nhất là thời đại Internet Of Thing, khi nhu cầu địa chỉ IP tăng cao hơn bao giờ hết. Mặc dù IPv4 vẫn đang được sử dụng ở nhiều khu vực trên thế giới, nhưng số lượng địa chỉ IPv4 đang cạn kiệt. IPv6 sẽ giải quyết vấn đề nàyNgoài việc thực hiện các cải tiến chung về giao thức, lợi ích rõ ràng nhất của việc sử dụng địa chỉ IPv6 là nó có không gian địa chỉ lớn hơn nhiều. Trong khi IPv4 cho phép 2 ^ 32 địa chỉ (tương đương khoảng 04 tỷ IP), không gian địa chỉ IPv6 cho phép 2 ^ 128 địa chỉ, một con số quá lớn so với IPv4. Rõ ràng các nhà hoạch định Internet đã có tầm nhìn có lẽ bao trùm cả Vũ trụ này?! Liệu có đến mức mỗi phân tử, nguyên tử đều được dành riêng một IPv6 không? Đùa vậy thôi, nhưng rõ ràng là một con số vô cùng lớn!
Mặc dù IPv6 mở ra rất nhiều cơ hội và giải quyết nhiều vấn đề lâu dài, nhưng nó cần điều chỉnh một chút đối với một số cấu hình mạng thông thường nếu bạn đã quen sử dụng riêng IPv4. Trong hướng dẫn này, ta sẽ nói về một số bản sao của IPv6 với một số công cụ và tiện ích IPv4 phổ biến và thảo luận cách cấu hình các dịch vụ phổ biến để sử dụng IPv6.
Kiểm tra mạng với IPv6
Một số tiện ích đơn giản nhất được sử dụng để chẩn đoán các sự cố mạng đã được tạo ra với IPv4. Ta có thể sử dụng gần tương tự cho IPv6.
Trước hết, để xem các địa chỉ IPv6 hiện được cấu hình cho server, bạn có thể sử dụng iproute2
để hiển thị cho bạn các địa chỉ được cấu hình hiện tại:
ip -6 addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2400:6180:0:d0::41f/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::601:15ff:fe43:b201/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 fe80::601:15ff:fe43:b202/64 scope link
valid_lft forever preferred_lft forever
Để in ra bảng định tuyến IPv6, bạn có thể sử dụng netstat
bằng lệnh như sau:
netstat -A inet6 -rn
Kernel IPv6 routing table
Destination Next Hop Flag Met Ref Use If
2400:6180:0:d0::/64 :: U 256 0 1 eth0
fe80::/64 :: U 256 0 0 eth1
fe80::/64 :: U 256 0 0 eth0
::/0 2400:6180:0:d0::1 UG 1024 0 0 eth0
::/0 :: !n -1 1 90 lo
::1/128 :: Un 0 1 20 lo
2400:6180:0:d0::41f/128 :: Un 0 1 86 lo
fe80::601:15ff:fe43:b201/128 :: Un 0 1 75 lo
fe80::601:15ff:fe43:b202/128 :: Un 0 1 0 lo
ff00::/8 :: U 256 0 0 eth1
ff00::/8 :: U 256 0 0 eth0
::/0 :: !n -1 1 90 lo
Nếu bạn thích các công cụ iproute2 hơn, bạn có thể nhận được thông tin tương tự bằng lệnh:
ip -6 route show
2400:6180:0:d0::/64 dev eth0 proto kernel metric 256
fe80::/64 dev eth1 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
default via 2400:6180:0:d0::1 dev eth0 metric 1024
Đến đây bạn đã biết về cách lấy một số thông tin IPv6 của riêng mình, hãy cùng tìm hiểu một chút về cách sử dụng một số công cụ hoạt động với IPv6.
ping
phổ biến thực sự là dành riêng cho IPv4. Phiên bản IPv6 của lệnh, hoạt động giống hệt nhau nhưng đối với địa chỉ IPv6, được đặt tên là ping6
không có gì đáng ngạc nhiên. Lệnh sau sẽ ping loopback cục bộ - local:
ping6 -c 3 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.021 ms
64 bytes from ::1: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from ::1: icmp_seq=3 ttl=64 time=0.022 ms
--- ::1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.021/0.023/0.028/0.006 ms
Như bạn thấy, điều này hoạt động chính xác như mong đợi.
Một công cụ khác mà bạn có thể dựa vào là theo traceroute
. Cũng có sẵn một bản cho IPv6 tương đương:
traceroute6 google.com
traceroute to google.com (2404:6800:4003:803::1006) from 2400:6180:0:d0::41f, 30 hops max, 24 byte packets
1 2400:6180:0:d0:ffff:ffff:ffff:fff1 (2400:6180:0:d0:ffff:ffff:ffff:fff1) 0.993 ms 1.034 ms 0.791 ms
2 2400:6180::501 (2400:6180::501) 0.613 ms 0.636 ms 0.557 ms
3 2400:6180::302 (2400:6180::302) 0.604 ms 0.506 ms 0.561 ms
4 10gigabitethernet1-1.core1.sin1.he.net (2001:de8:4::6939:1) 6.21 ms 10.869 ms 1.249 ms
5 15169.sgw.equinix.com (2001:de8:4::1:5169:1) 1.522 ms 1.205 ms 1.165 ms
6 2001:4860::1:0:337f (2001:4860::1:0:337f) 2.131 ms 2.164 ms 2.109 ms
7 2001:4860:0:1::523 (2001:4860:0:1::523) 2.266 ms 2.18 ms 2.02 ms
8 2404:6800:8000:1c::8 (2404:6800:8000:1c::8) 1.741 ms 1.846 ms 1.895 ms
Bạn có thể quen với là lệnh tracepath
Điều này theo sau ví dụ về các lệnh khác cho phiên bản IPv6:
tracepath6 ::1
1?: [LOCALHOST] 0.045ms pmtu 65536
1: ip6-localhost 0.189ms reached
1: ip6-localhost 0.110ms reached
Resume: pmtu 65536 hops 1 back 64
Nếu bạn cần theo dõi lưu lượng truy cập đi vào máy của bạn, tcpdump
thường được sử dụng. Ta có thể dùng tiện ích này để chỉ hiển thị lưu lượng IPv6 bằng cách lọc với biểu thức ip6 or proto ipv6
.
Ví dụ: ta có thể đo lưu lượng IPv6 đang lưu chuyểnmột cách dễ dàng bằng cách yêu cầu công cụ chỉ nắm bắt thông tin mà ta quan tâm. Ta có thể sử dụng lệnh này như được thực hiện từ tài liệu này để chỉ thu thập tóm tắt thông tin, tránh quá nhiều làm chậm kết quả kết quả:
tcpdump -t -n -i eth0 -s 512 -vv ip6 or proto ipv6
Kiểm tra thông tin DNS IPv6
Ta có thể dễ dàng kiểm tra thông tin DNS cho các domain của bạn bằng cách sử dụng các công cụ thông thường. Sự khác biệt chính là bạn có thể yêu cầu AAAA
, được sử dụng cho địa chỉ IPv6 thay vì A
, chỉ được sử dụng cho ánh xạ IPv4.
Để truy xuất bản ghi địa chỉ IPv6 cho một domain, bạn chỉ cần yêu cầu bản ghi AAAA
Với host
, bạn có thể thực hiện điều đó như sau:
host -t AAAA google.com
google.com has IPv6 address 2404:6800:4003:803::1004
Nếu muốn sử dụng dig
, bạn có thể nhận được kết quả tương tự bằng cách sử dụng cú pháp sau:
dig google.com AAAA
; <<>> DiG 9.8.1-P1 <<>> google.com AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14826
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;google.com. IN AAAA
;; ANSWER SECTION:
google.com. 299 IN AAAA 2404:6800:4003:803::1006
;; Query time: 5 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)
;; WHEN: Tue Apr 1 13:59:23 2014
;; MSG SIZE rcvd: 56
Như bạn thấy, việc kiểm tra xem DNS có đang phân giải chính xác cho các domain của bạn hay không cũng dễ dàng với địa chỉ IPv6 hay IPv4.
Các dịch vụ với IPv6
Hầu hết các dịch vụ (service, deamon) thông thường hiện tại có khả năng xử lý lưu lượng IPv6
Cấu hình SSH
Đối với SSH, daemon có thể được cấu hình để lắng nghe địa chỉ IPv6. Điều này được kiểm soát trong tệp cấu hình mà bạn có thể mở bằng:
sudo nano /etc/ssh/sshd_config
ListenAddress
chỉ định địa chỉ mà daemon SSH sẽ liên kết với. Đối với địa chỉ IPv4, nó trông giống như sau:
ListenAddress 111.111.111.111:22
Lệnh trên lắng nghe địa chỉ IPv4 111.111.111.111
trên cổng 22. Đối với địa chỉ IPv6, bạn có thể thực hiện tương tự bằng cách đặt địa chỉ trong dấu ngoặc vuông:
ListenAddress [1341:8954:a389:33:ba33::1]:22
Điều này yêu cầu SSH lắng nghe địa chỉ 1341:8954:a389:33:ba33::1
trên cổng 22. Bạn có thể yêu cầu nó lắng nghe tất cả các địa chỉ IPv6 có sẵn bằng lệnh:
ListenAddress ::
Hãy nhớ reload daemon sau khi bạn đã áp dụng các thay đổi:
sudo service ssh restart
Về phía máy khách, nếu daemon mà bạn đang kết nối được cấu hình để lắng nghe bằng IPv4 và IPv6, bạn có thể buộc máy khách chỉ sử dụng IPv6 bằng cách sử dụng -6
, như sau:
ssh -6 username@host.com
Cấu hình web server
Tương tự như daemon SSH, web server cũng phải được cấu hình để lắng nghe địa chỉ IPv6.
Trong Apache, bạn có thể cấu hình server để phản hồi các yêu cầu trên một địa chỉ IPv6 nhất định bằng cú pháp sau:
Listen [1341:8954:a389:33:ba33::1]:80
Điều này yêu cầu server lắng nghe địa chỉ cụ thể này trên cổng 80. Ta có thể kết hợp địa chỉ này với địa chỉ IPv4 để cho phép linh hoạt hơn như sau:
Listen 111.111.111.111:80
Listen [1341:8954:a389:33:ba33::1]:80
Trong thực tế, nếu bạn muốn lắng nghe các kết nối trên tất cả các giao diện trong tất cả các giao thức trên cổng 80, bạn chỉ cần sử dụng:
Listen 80
Ở cấp VirtualHost, bạn cũng có thể chỉ định địa chỉ IPv6. Tại đây, bạn có thể thấy rằng có thể cấu hình VirtualHost để khớp cho cả địa chỉ IPv4 và địa chỉ IPv6:
<VirtualHost 111.111.111.111:80, [1341:8954:a389:33:ba33::1]:80>
. . .
</VirtualHost>
Hãy khởi động lại dịch vụ để áp dụng các thay đổi:
sudo service apache2 restart
Nếu muốn sử dụng Nginx làm web server, ta có thể triển khai các cấu hình tương tự. Đối với lệnh lắng nghe, ta có thể sử dụng lệnh này cho IPv6:
listen [1341:8954:a389:33:ba33::1]:80;
Trong Linux, điều này cũng cho phép lưu lượng IPv4 trên cổng 80 vì nó tự động ánh xạ các yêu cầu IPv4 tới địa chỉ IPv6.
Lệnh ví dụ sau:
listen [1341:8954:a389:33:ba33::1]:80;
listen 111.111.111.111:80;
Điều này sẽ dẫn đến báo lỗi cổng đã được liên kết với một dịch vụ khác. Nếu bạn muốn sử dụng các lệnh riêng biệt như thế này, phải tắt chức năng này bằng cách sử dụng sysctl
như sau:
sysctl -w net.ipv6.bindv6only=1
Để việc này được tự động áp dụng khi khởi động server bằng cách thêm nó vào /etc/sysctl.conf
:
sudo nano /etc/sysctl.conf
. . .
net.ipv6.bindv6only=1
Sau đó, bạn có thể sử dụng cấu hình tương tự với cấu hình bị lỗi trước đó bằng cách thêm ipv6only=on
lệnh lắng nghe IPv6:
listen [1341:8954:a389:33:ba33::1]:80 ipv6only=on;
listen 111.111.111.111:80;
và khởi động lại Nginx để áp dụng các thay đổi:
sudo service nginx restart
Cấu hình firewall
Nếu bạn đã quen với việc cấu hình các-luật firewall của bạn bằng cách sử dụng giao diện user cấu hình netfilter như iptables
, bạn sẽ vui khi biết rằng có một công cụ tương đương được gọi là ip6tables
.
Đối với biến thể IPv6, bạn có thể chỉ cần thay thế lệnh bằng ip6tables
để quản lý các-luật lọc gói IPv6. Ví dụ: để liệt kê các-luật IPv6, có thể chạy lệnh:
sudo ip6tables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Nếu bạn đang sử dụng ufw
, thì xin chúc mừng! Công ufw
cấu hình cả hai firewall cùng một lúc trừ khi được chỉ định khác. Bạn có thể phải thêm luật cho các địa chỉ IPv6 cụ thể của bạn, nhưng sẽ không phải sử dụng một công cụ khác.
Bạn có thể tìm hiểu thêm về cách sử dụng ufw tại đây.
Cấu hình trình gói TCP
Nếu bạn sử dụng hàm bao TCP để kiểm soát truy cập vào server thông qua /etc/hosts.allow
và /etc/hosts.deny
file, bạn chỉ có thể sử dụng cú pháp IPv6 để phù hợp với luật nhất định.
Ví dụ: bạn có thể chỉ cho phép một IPv4 và một địa chỉ IPv6 kết nối qua SSH bằng lệnh chỉnh sửa /etc/hosts.allow
và thêm vào:
sudo nano /etc/hosts.allow
. . .
sshd: 111.111.0.0/255.255.254.0, [1341:8954:a389:33::]/64
Như bạn thấy, rất dễ dàng điều chỉnh các-luật shell TCP hiện tại để áp dụng cho địa chỉ IPv6. Bạn có thể tìm hiểu thêm về cách định dạng địa chỉ IP và mạng con tại đây.
Kết luận
Trên đây là các lệnh cơ bản, bạn có thể khảo sát thêm, việc chuyển đổi sang IPv6 hoặc tận dụng lợi thế của IPv6 là khá đơn giản.
Các tin trước
Cài đặt và sử dụng yum repositories trên Centos-6 vps 2013-10-01
Sử dụng SSH để kết nối tới Remote Server trong Ubuntu 2013-09-10
Backup postgresql databases trên Ubuntu vps 2013-08-28
Sử dụng Cron để tự động hóa các công việc việc trên server 2013-08-23
Bảo mật postgresql trên Ubuntu vps 2013-08-22
Sử dụng sftp-to-securely-transfer-files với remote-server 2013-08-13
Quản trị packages trong Ubuntu và Debian với apt-get-apt-cache 2013-08-06
Sử dụng roles và quản lý cấp quyền trong postgresql trên vps 2013-08-05
Lệnh truy vấn SQL trong postgresql sử dụng select 2013-08-02
Các lệnh truy cấn quản lý bảng dữ liệu trong postgresql trên cloud-server 2013-08-01